3
3
* raylib-assert - Assertion library for raylib.
4
4
* https://github.com/robloach/raylib-assert
5
5
*
6
- * Copyright 2021 Rob Loach (@RobLoach)
6
+ * Version: v2.0.0
7
+ *
8
+ * Copyright 2023 Rob Loach (@RobLoach)
7
9
*
8
10
* DEPENDENCIES:
9
- * raylib https://www.raylib.com/
11
+ * raylib 4.5+ https://www.raylib.com
10
12
*
11
13
* LICENSE: zlib/libpng
12
14
*
37
39
extern "C" {
38
40
#endif
39
41
40
- #include "raylib.h" // NOLINT
41
-
42
42
// How to report failed assertions
43
43
#ifndef RAYLIB_ASSERT_LOG
44
+ /**
45
+ * The Trace Log Level used to report to TraceLog() on failed assertions. Defaults to LOG_FATAL.
46
+ *
47
+ * @example
48
+ * #define RAYLIB_ASSERT_LOG LOG_WARNING
49
+ *
50
+ * @see TraceLogLevel
51
+ */
44
52
#define RAYLIB_ASSERT_LOG LOG_FATAL
45
53
#endif
46
54
@@ -51,20 +59,138 @@ extern "C" {
51
59
#endif
52
60
#endif
53
61
62
+ #ifndef RAYLIB_ASSERT_TRACELOG
63
+ /**
64
+ * The TraceLog() function to use.
65
+ *
66
+ * @see TraceLog()
67
+ */
68
+ #define RAYLIB_ASSERT_TRACELOG TraceLog
69
+ #endif
70
+
71
+ #ifndef RAYLIB_ASSERT_TEXTFORMAT
72
+ /**
73
+ * The TextFormat() function to use when formating text.
74
+ *
75
+ * @see TextFormat()
76
+ */
77
+ #define RAYLIB_ASSERT_TEXTFORMAT TextFormat
78
+ #endif
79
+
54
80
// Variadic Arguments
55
81
#define RAYLIB_ASSERT_CAT ( A , B ) A ## B
56
82
#define RAYLIB_ASSERT_SELECT ( NAME , NUM ) RAYLIB_ASSERT_CAT( NAME ## _, NUM )
57
83
#define RAYLIB_ASSERT_GET_COUNT ( _1 , _2 , _3 , _4 , _5 , _6 , _7 , RAYLIB_ASSERT_COUNT , ... ) RAYLIB_ASSERT_COUNT
58
84
#define RAYLIB_ASSERT_VA_SIZE ( ... ) RAYLIB_ASSERT_GET_COUNT( __VA_ARGS__, 7, 6, 5, 4, 3, 2, 1 )
59
85
#define RAYLIB_ASSERT_VA_SELECT ( NAME , ... ) RAYLIB_ASSERT_SELECT( NAME, RAYLIB_ASSERT_VA_SIZE(__VA_ARGS__) )(__VA_ARGS__)
60
86
61
- #define Assert (...) RAYLIB_ASSERT_VA_SELECT( Assert, __VA_ARGS__ )
62
- #define AssertEqual (...) RAYLIB_ASSERT_VA_SELECT( AssertEqual, __VA_ARGS__ )
63
- #define AssertNot (...) RAYLIB_ASSERT_VA_SELECT( AssertNot, __VA_ARGS__ )
64
- #define AssertFail (...) RAYLIB_ASSERT_VA_SELECT( AssertFail, __VA_ARGS__ )
87
+ /**
88
+ * Assert whether the given condition is true.
89
+ *
90
+ * @param condition The condition that is expected to be true.
91
+ * @param message (Optional) The message to provide on failed assertions.
92
+ * @param p1 (Optional) The first parameter in the message.
93
+ * @param p2 (Optional) The second parameter in the message.
94
+ * @param p3 (Optional) The third parameter in the message.
95
+ * @param p4 (Optional) The fourth parameter in the message.
96
+ * @param p5 (Optional) The fifth parameter in the message.
97
+ */
98
+ #define Assert (...) RAYLIB_ASSERT_VA_SELECT(Assert, __VA_ARGS__)
99
+
100
+ /**
101
+ * Assert whether the two given parameters are equal.
102
+ *
103
+ * @param actual The actual value.
104
+ * @param expected The expected value.
105
+ * @param message (Optional) The message to provide on failed assertions.
106
+ * @param p1 (Optional) The first parameter in the message.
107
+ * @param p2 (Optional) The second parameter in the message.
108
+ * @param p3 (Optional) The third parameter in the message.
109
+ * @param p4 (Optional) The fourth parameter in the message.
110
+ */
111
+ #define AssertEqual (...) RAYLIB_ASSERT_VA_SELECT(AssertEqual, __VA_ARGS__)
112
+
113
+ /**
114
+ * Assert whether the given condition is false.
115
+ *
116
+ * @param condition The condition that is expected to be false.
117
+ * @param message (Optional) The message to provide on failed assertions.
118
+ * @param p1 (Optional) The first parameter in the message.
119
+ * @param p2 (Optional) The second parameter in the message.
120
+ * @param p3 (Optional) The third parameter in the message.
121
+ * @param p4 (Optional) The fourth parameter in the message.
122
+ * @param p5 (Optional) The fifth parameter in the message.
123
+ */
124
+ #define AssertNot (...) RAYLIB_ASSERT_VA_SELECT(AssertNot, __VA_ARGS__)
125
+
126
+ /**
127
+ * Assert whether the two given parameters are not equal.
128
+ *
129
+ * @param actual The actual value.
130
+ * @param notexpected The expected value that shouldn't equal the actual value.
131
+ * @param message (Optional) The message to provide on failed assertions.
132
+ * @param p1 (Optional) The first parameter in the message.
133
+ * @param p2 (Optional) The second parameter in the message.
134
+ * @param p3 (Optional) The third parameter in the message.
135
+ * @param p4 (Optional) The fourth parameter in the message.
136
+ */
137
+ #define AssertNotEqual (...) RAYLIB_ASSERT_VA_SELECT(AssertNotEqual, __VA_ARGS__)
138
+
139
+ /**
140
+ * Sets a failed assertion, with the given message.
141
+ *
142
+ * @param message (Optional) The message to provide for the failed assertion.
143
+ * @param p1 (Optional) The first parameter in the message.
144
+ * @param p2 (Optional) The second parameter in the message.
145
+ * @param p3 (Optional) The third parameter in the message.
146
+ * @param p4 (Optional) The fourth parameter in the message.
147
+ * @param p5 (Optional) The fifth parameter in the message.
148
+ * @param p6 (Optional) The sixth parameter in the message.
149
+ */
150
+ #define AssertFail (...) RAYLIB_ASSERT_VA_SELECT(AssertFail, __VA_ARGS__)
151
+
152
+ /**
153
+ * Assert whether an image is loaded.
154
+ *
155
+ * @param image The image to check for valid data.
156
+ * @param message (Optional) The message to provide on failed assertions.
157
+ * @param p1 (Optional) The first parameter in the message.
158
+ * @param p2 (Optional) The second parameter in the message.
159
+ * @param p3 (Optional) The third parameter in the message.
160
+ * @param p4 (Optional) The fourth parameter in the message.
161
+ * @param p5 (Optional) The fifth parameter in the message.
162
+ */
163
+ #define AssertImage (...) RAYLIB_ASSERT_VA_SELECT(AssertImage, __VA_ARGS__)
164
+
165
+ /**
166
+ * Assert whether two images are the same.
167
+ *
168
+ * @param image1 The first image to check is equal to the second.
169
+ * @param image2 The second image to check is equal to the first.
170
+ * @param message (Optional) The message to provide on failed assertions.
171
+ * @param p1 (Optional) The first parameter in the message.
172
+ * @param p2 (Optional) The second parameter in the message.
173
+ * @param p3 (Optional) The third parameter in the message.
174
+ * @param p4 (Optional) The fourth parameter in the message.
175
+ */
176
+ #define AssertImageSame (...) RAYLIB_ASSERT_VA_SELECT(AssertImageSame, __VA_ARGS__)
177
+
178
+ /**
179
+ * Assert whether two colors are the same.
180
+ *
181
+ * @param color1 The first color to check.
182
+ * @param color2 The second color to check.
183
+ * @param message (Optional) The message to provide on failed assertions.
184
+ * @param p1 (Optional) The first parameter in the message.
185
+ * @param p2 (Optional) The second parameter in the message.
186
+ * @param p3 (Optional) The third parameter in the message.
187
+ * @param p4 (Optional) The fourth parameter in the message.
188
+ */
189
+ #define AssertColorSame (...) RAYLIB_ASSERT_VA_SELECT(AssertColorSame, __VA_ARGS__)
65
190
66
191
// Assert()
67
192
#ifdef RAYLIB_ASSERT_NDEBUG
193
+ #define Assert_0 ()
68
194
#define Assert_1 (condition )
69
195
#define Assert_2 (condition , message )
70
196
#define Assert_3 (condition , message , p1 )
@@ -73,25 +199,38 @@ extern "C" {
73
199
#define Assert_6 (condition , message , p1 , p2 , p3 , p4 )
74
200
#define Assert_7 (condition , message , p1 , p2 , p3 , p4 , p5 )
75
201
#else
202
+ #define Assert_0 () AssertFail_1("No condition provided for Assert()")
76
203
#define Assert_1 (condition ) Assert_2(condition, #condition)
77
- #define Assert_2 (condition , message ) if (!((bool)(condition))) { TraceLog (RAYLIB_ASSERT_LOG, "ASSERT: %s (%s:%i)", message, __FILE__, __LINE__); }
78
- #define Assert_3 (condition , message , p1 ) Assert_2(condition, TextFormat (message, p1))
79
- #define Assert_4 (condition , message , p1 , p2 ) Assert_2(condition, TextFormat (message, p1, p2))
80
- #define Assert_5 (condition , message , p1 , p2 , p3 ) Assert_2(condition, TextFormat (message, p1, p2, p3))
81
- #define Assert_6 (condition , message , p1 , p2 , p3 , p4 ) Assert_2(condition, TextFormat (message, p1, p2, p3, p4))
82
- #define Assert_7 (condition , message , p1 , p2 , p3 , p4 , p5 ) Assert_2(condition, TextFormat (message, p1, p2, p3, p4, p5))
204
+ #define Assert_2 (condition , message ) do { if (!((bool)(condition))) { RAYLIB_ASSERT_TRACELOG (RAYLIB_ASSERT_LOG, "ASSERT: %s (%s:%i)", message, __FILE__, __LINE__); } } while(0)
205
+ #define Assert_3 (condition , message , p1 ) Assert_2(condition, RAYLIB_ASSERT_TEXTFORMAT (message, p1))
206
+ #define Assert_4 (condition , message , p1 , p2 ) Assert_2(condition, RAYLIB_ASSERT_TEXTFORMAT (message, p1, p2))
207
+ #define Assert_5 (condition , message , p1 , p2 , p3 ) Assert_2(condition, RAYLIB_ASSERT_TEXTFORMAT (message, p1, p2, p3))
208
+ #define Assert_6 (condition , message , p1 , p2 , p3 , p4 ) Assert_2(condition, RAYLIB_ASSERT_TEXTFORMAT (message, p1, p2, p3, p4))
209
+ #define Assert_7 (condition , message , p1 , p2 , p3 , p4 , p5 ) Assert_2(condition, RAYLIB_ASSERT_TEXTFORMAT (message, p1, p2, p3, p4, p5))
83
210
#endif
84
211
85
212
// AssertEqual()
213
+ #define AssertEqual_0 () AssertFail_1("No condition provided for AssertEqual()")
86
214
#define AssertEqual_1 (condition ) Assert_2(condition, #condition)
87
- #define AssertEqual_2 (actual , expected ) Assert_4((actual) == (expected), "%s == %s ", #actual, #expected)
215
+ #define AssertEqual_2 (actual , expected ) Assert_4((actual) == (expected), "AssertEqual(%s, %s) - Provided arguments are not equal ", #actual, #expected)
88
216
#define AssertEqual_3 (actual , expected , message ) Assert_2((actual) == (expected), message)
89
217
#define AssertEqual_4 (actual , expected , message , p1 ) Assert_3((actual) == (expected), message, p1)
90
218
#define AssertEqual_5 (actual , expected , message , p1 , p2 ) Assert_4((actual) == (expected), message, p1, p2)
91
219
#define AssertEqual_6 (actual , expected , message , p1 , p2 , p3 ) Assert_5((actual) == (expected), message, p1, p2, p3)
92
220
#define AssertEqual_7 (actual , expected , message , p1 , p2 , p3 , p4 ) Assert_6((actual) == (expected), message, p1, p2, p3, p4)
93
221
222
+ // AssertNotEqual()
223
+ #define AssertNotEqual_0 () AssertFail_1("No condition provided for AssertNotEqual()")
224
+ #define AssertNotEqual_1 (condition ) AssertNot_2(condition, #condition)
225
+ #define AssertNotEqual_2 (actual , expected ) Assert_4((actual) != (expected), "AssertNotEqual(%s, %s) - Provided arguments are equal", #actual, #expected)
226
+ #define AssertNotEqual_3 (actual , expected , message ) Assert_2((actual) != (expected), message)
227
+ #define AssertNotEqual_4 (actual , expected , message , p1 ) Assert_3((actual) != (expected), message, p1)
228
+ #define AssertNotEqual_5 (actual , expected , message , p1 , p2 ) Assert_4((actual) != (expected), message, p1, p2)
229
+ #define AssertNotEqual_6 (actual , expected , message , p1 , p2 , p3 ) Assert_5((actual) != (expected), message, p1, p2, p3)
230
+ #define AssertNotEqual_7 (actual , expected , message , p1 , p2 , p3 , p4 ) Assert_6((actual) != (expected), message, p1, p2, p3, p4)
231
+
94
232
// AssertNot()
233
+ #define AssertNot_0 () AssertFail_1("No condition provided for AssertNot()")
95
234
#define AssertNot_1 (condition ) Assert_2(!(bool)(condition), #condition)
96
235
#define AssertNot_2 (condition , message ) Assert_2(!(bool)(condition), message)
97
236
#define AssertNot_3 (condition , message , p1 ) Assert_3(!(bool)(condition), message, p1)
@@ -111,18 +250,100 @@ extern "C" {
111
250
#define AssertFail_6 (message , p1 , p2 , p3 , p4 , p5 )
112
251
#define AssertFail_7 (message , p1 , p2 , p3 , p4 , p5 , p6 )
113
252
#else
114
- #define AssertFail_0 () TraceLog (RAYLIB_ASSERT_LOG, "ASSERT: AssertFail() (%s:%i)", __FILE__, __LINE__)
115
- #define AssertFail_1 (message ) TraceLog (RAYLIB_ASSERT_LOG, "ASSERT: %s (%s:%i)", message, __FILE__, __LINE__)
116
- #define AssertFail_2 (message , p1 ) AssertFail_1(TextFormat (message, p1))
117
- #define AssertFail_3 (message , p1 , p2 ) AssertFail_1(TextFormat (message, p1, p2))
118
- #define AssertFail_4 (message , p1 , p2 , p3 ) AssertFail_1(TextFormat (message, p1, p2, p3))
119
- #define AssertFail_5 (message , p1 , p2 , p3 , p4 ) AssertFail_1(TextFormat (message, p1, p2, p3, p4))
120
- #define AssertFail_6 (message , p1 , p2 , p3 , p4 , p5 ) AssertFail_1(TextFormat (message, p1, p2, p3, p4, p5))
121
- #define AssertFail_7 (message , p1 , p2 , p3 , p4 , p5 , p6 ) AssertFail_1(TextFormat (message, p1, p2, p3, p4, p5, p6))
253
+ #define AssertFail_0 () RAYLIB_ASSERT_TRACELOG (RAYLIB_ASSERT_LOG, "ASSERT: AssertFail() (%s:%i)", __FILE__, __LINE__)
254
+ #define AssertFail_1 (message ) RAYLIB_ASSERT_TRACELOG (RAYLIB_ASSERT_LOG, "ASSERT: %s (%s:%i)", message, __FILE__, __LINE__)
255
+ #define AssertFail_2 (message , p1 ) AssertFail_1(RAYLIB_ASSERT_TEXTFORMAT (message, p1))
256
+ #define AssertFail_3 (message , p1 , p2 ) AssertFail_1(RAYLIB_ASSERT_TEXTFORMAT (message, p1, p2))
257
+ #define AssertFail_4 (message , p1 , p2 , p3 ) AssertFail_1(RAYLIB_ASSERT_TEXTFORMAT (message, p1, p2, p3))
258
+ #define AssertFail_5 (message , p1 , p2 , p3 , p4 ) AssertFail_1(RAYLIB_ASSERT_TEXTFORMAT (message, p1, p2, p3, p4))
259
+ #define AssertFail_6 (message , p1 , p2 , p3 , p4 , p5 ) AssertFail_1(RAYLIB_ASSERT_TEXTFORMAT (message, p1, p2, p3, p4, p5))
260
+ #define AssertFail_7 (message , p1 , p2 , p3 , p4 , p5 , p6 ) AssertFail_1(RAYLIB_ASSERT_TEXTFORMAT (message, p1, p2, p3, p4, p5, p6))
122
261
#endif
123
262
124
- // AssertBreakpoint()
125
- #define AssertBreakpoint () AssertFail_1("AssertBreakpoint()")
263
+ // AssertImage()
264
+ #define AssertImage_0 () AssertFail_1("No image provided for AssertImage()")
265
+ #define AssertImage_1 (image ) Assert_3(IsImageReady(image), "AssertImage(%s) - Image not loaded", #image)
266
+ #define AssertImage_2 (image , message ) Assert_2(IsImageReady(image), message)
267
+ #define AssertImage_3 (image , message , p1 ) Assert_3(IsImageReady(image), message, p1)
268
+ #define AssertImage_4 (image , message , p1 , p2 ) Assert_4(IsImageReady(image), message, p1, p2)
269
+ #define AssertImage_5 (image , message , p1 , p2 , p3 ) Assert_5(IsImageReady(image), message, p1, p2, p3)
270
+ #define AssertImage_6 (image , message , p1 , p2 , p3 , p4 ) Assert_6(IsImageReady(image), message, p1, p2, p3, p4)
271
+
272
+ // AssertTexture()
273
+ #define AssertTexture_0 () AssertFail_1("No texture provided for AssertTexture()")
274
+ #define AssertTexture_1 (texture ) Assert_3(IsTextureReady(texture), "AssertTexture(%s) - Texture not loaded", #texture)
275
+ #define AssertTexture_2 (texture , message ) Assert_2(IsTextureReady(texture), message)
276
+ #define AssertTexture_3 (texture , message , p1 ) Assert_3(IsTextureReady(texture), message, p1)
277
+ #define AssertTexture_4 (texture , message , p1 , p2 ) Assert_4(IsTextureReady(texture), message, p1, p2)
278
+ #define AssertTexture_5 (texture , message , p1 , p2 , p3 ) Assert_5(IsTextureReady(texture), message, p1, p2, p3)
279
+ #define AssertTexture_6 (texture , message , p1 , p2 , p3 , p4 ) Assert_6(IsTextureReady(texture), message, p1, p2, p3, p4)
280
+
281
+ // AssertImageSame()
282
+ #ifdef RAYLIB_ASSERT_NDEBUG
283
+ #define AssertImageSame_0 ()
284
+ #define AssertImageSame_1 (image )
285
+ #define AssertImageSame_2 (image1 , image2 )
286
+ #define AssertImageSame_3 (image1 , image2 , message )
287
+ #define AssertImageSame_4 (image1 , image2 , message , p1 )
288
+ #define AssertImageSame_5 (image1 , image2 , message , p1 , p2 )
289
+ #define AssertImageSame_6 (image1 , image2 , message , p1 , p2 , p3 )
290
+ #define AssertImageSame_7 (image1 , image2 , message , p1 , p2 , p3 , p4 )
291
+ #else
292
+ #define AssertImageSame_0 () AssertFail_1("AssertImageSame(): No images provided to AssertImageSame(), expected 2")
293
+ #define AssertImageSame_1 (image ) AssertFail_1("Only one image provided for AssertImageSame()")
294
+ #define AssertImageSame_2 (image1 , image2 ) AssertImageSame_5(image1, image2, "AssertImageSame(%s, %s) - Images do not match", #image1, #image2)
295
+ #define AssertImageSame_3 (image1 , image2 , message ) do { \
296
+ if (image1.width != image2.width || image1.height != image2.height || image1.format != image2.format) { \
297
+ AssertFail_1(message); \
298
+ break; \
299
+ } \
300
+ Color* colors1 = LoadImageColors(image1); \
301
+ Color* colors2 = LoadImageColors(image2); \
302
+ bool failure = false; \
303
+ for (int i = 0; i < image1.width * image1.height; i++) { \
304
+ Color color1 = colors1[i]; \
305
+ Color color2 = colors2[i]; \
306
+ if (color1.r != color2.r || color1.g != color2.g || color1.b != color2.b || color1.a != color2.a) { \
307
+ failure = true; \
308
+ break; \
309
+ } \
310
+ } \
311
+ UnloadImageColors(colors1); \
312
+ UnloadImageColors(colors2); \
313
+ if (failure) { \
314
+ AssertFail_1(message); \
315
+ } \
316
+ } while(0)
317
+ #define AssertImageSame_4 (image1 , image2 , message , p1 ) AssertImageSame_3(image1, image2, RAYLIB_ASSERT_TEXTFORMAT(message, p1))
318
+ #define AssertImageSame_5 (image1 , image2 , message , p1 , p2 ) AssertImageSame_3(image1, image2, RAYLIB_ASSERT_TEXTFORMAT(message, p1, p2))
319
+ #define AssertImageSame_6 (image1 , image2 , message , p1 , p2 , p3 ) AssertImageSame_3(image1, image2, RAYLIB_ASSERT_TEXTFORMAT(message, p1, p2, p3))
320
+ #define AssertImageSame_7 (image1 , image2 , message , p1 , p2 , p3 , p4 ) AssertImageSame_3(image1, image2, RAYLIB_ASSERT_TEXTFORMAT(message, p1, p2, p3, p4))
321
+ #endif
322
+
323
+ // AssertColorSame()
324
+ #ifdef RAYLIB_ASSERT_NDEBUG
325
+ #define AssertColorSame_0 ()
326
+ #define AssertColorSame_1 (color )
327
+ #define AssertColorSame_2 (color1 , color2 )
328
+ #define AssertColorSame_3 (color1 , color2 , message )
329
+ #define AssertColorSame_4 (color1 , color2 , message , p1 )
330
+ #define AssertColorSame_5 (color1 , color2 , message , p1 , p2 )
331
+ #define AssertColorSame_6 (color1 , color2 , message , p1 , p2 , p3 )
332
+ #define AssertColorSame_7 (color1 , color2 , message , p1 , p2 , p3 , p4 )
333
+ #else
334
+ #define AssertColorSame_0 () AssertFail_1("Colors not provided to AssertColorSame()")
335
+ #define AssertColorSame_1 (color ) AssertFail_1("Expected two colors for AssertColorSame()")
336
+ #define AssertColorSame_2 (color1 , color2 ) AssertColorSame_5(color1, color2, "AssertColorSame(%s, %s) - Colors do not match", #color1, #color2)
337
+ #define AssertColorSame_3 (color1 , color2 , message ) do { \
338
+ if (color1.r != color2.r || color1.g != color2.g || color1.b != color2.b || color1.a != color2.a) { \
339
+ AssertFail_1(message); \
340
+ }\
341
+ } while (0)
342
+ #define AssertColorSame_4 (color1 , color2 , message , p1 ) AssertColorSame_3(color1, color2, RAYLIB_ASSERT_TEXTFORMAT(message, p1))
343
+ #define AssertColorSame_5 (color1 , color2 , message , p1 , p2 ) AssertColorSame_3(color1, color2, RAYLIB_ASSERT_TEXTFORMAT(message, p1, p2))
344
+ #define AssertColorSame_6 (color1 , color2 , message , p1 , p2 , p3 ) AssertColorSame_3(color1, color2, RAYLIB_ASSERT_TEXTFORMAT(message, p1, p2, p3))
345
+ #define AssertColorSame_7 (color1 , color2 , message , p1 , p2 , p3 , p4 ) AssertColorSame_3(color1, color2, RAYLIB_ASSERT_TEXTFORMAT(message, p1, p2, p3, p4))
346
+ #endif
126
347
127
348
#ifdef __cplusplus
128
349
}
0 commit comments