Branch data MC/DC data Line data Source code
1 : : : /* =========================================================================
2 : : : Unity - A Test Framework for C
3 : : : ThrowTheSwitch.org
4 : : : Copyright (c) 2007-25 Mike Karlesky, Mark VanderVoord, & Greg Williams
5 : : : SPDX-License-Identifier: MIT
6 : : : ========================================================================= */
7 : : :
8 : : : #include "unity.h"
9 : : :
10 : : : #ifndef UNITY_PROGMEM
11 : : : #define UNITY_PROGMEM
12 : : : #endif
13 : : :
14 : : : /* If omitted from header, declare overrideable prototypes here so they're ready for use */
15 : : : #ifdef UNITY_OMIT_OUTPUT_CHAR_HEADER_DECLARATION
16 : : : void UNITY_OUTPUT_CHAR(int);
17 : : : #endif
18 : : :
19 : : : /* Helpful macros for us to use here in Assert functions */
20 : : : #define UNITY_FAIL_AND_BAIL do { Unity.CurrentTestFailed = 1; UNITY_OUTPUT_FLUSH(); TEST_ABORT(); } while (0)
21 : : : #define UNITY_IGNORE_AND_BAIL do { Unity.CurrentTestIgnored = 1; UNITY_OUTPUT_FLUSH(); TEST_ABORT(); } while (0)
22 : : : #define RETURN_IF_FAIL_OR_IGNORE do { if (Unity.CurrentTestFailed || Unity.CurrentTestIgnored) { TEST_ABORT(); } } while (0)
23 : : :
24 : : : struct UNITY_STORAGE_T Unity;
25 : : :
26 : : : #ifdef UNITY_OUTPUT_COLOR
27 : : : const char UNITY_PROGMEM UnityStrOk[] = "\033[42mOK\033[0m";
28 : : : const char UNITY_PROGMEM UnityStrPass[] = "\033[42mPASS\033[0m";
29 : : : const char UNITY_PROGMEM UnityStrFail[] = "\033[41mFAIL\033[0m";
30 : : : const char UNITY_PROGMEM UnityStrIgnore[] = "\033[43mIGNORE\033[0m";
31 : : : #else
32 : : : const char UNITY_PROGMEM UnityStrOk[] = "OK";
33 : : : const char UNITY_PROGMEM UnityStrPass[] = "PASS";
34 : : : const char UNITY_PROGMEM UnityStrFail[] = "FAIL";
35 : : : const char UNITY_PROGMEM UnityStrIgnore[] = "IGNORE";
36 : : : #endif
37 : : : static const char UNITY_PROGMEM UnityStrNull[] = "NULL";
38 : : : static const char UNITY_PROGMEM UnityStrSpacer[] = ". ";
39 : : : static const char UNITY_PROGMEM UnityStrExpected[] = " Expected ";
40 : : : static const char UNITY_PROGMEM UnityStrWas[] = " Was ";
41 : : : static const char UNITY_PROGMEM UnityStrGt[] = " to be greater than ";
42 : : : static const char UNITY_PROGMEM UnityStrLt[] = " to be less than ";
43 : : : static const char UNITY_PROGMEM UnityStrOrEqual[] = "or equal to ";
44 : : : static const char UNITY_PROGMEM UnityStrNotEqual[] = " to be not equal to ";
45 : : : static const char UNITY_PROGMEM UnityStrElement[] = " Element ";
46 : : : static const char UNITY_PROGMEM UnityStrByte[] = " Byte ";
47 : : : static const char UNITY_PROGMEM UnityStrMemory[] = " Memory Mismatch.";
48 : : : static const char UNITY_PROGMEM UnityStrDelta[] = " Values Not Within Delta ";
49 : : : static const char UNITY_PROGMEM UnityStrPointless[] = " You Asked Me To Compare Nothing, Which Was Pointless.";
50 : : : static const char UNITY_PROGMEM UnityStrNullPointerForExpected[] = " Expected pointer to be NULL";
51 : : : static const char UNITY_PROGMEM UnityStrNullPointerForActual[] = " Actual pointer was NULL";
52 : : : #ifndef UNITY_EXCLUDE_FLOAT
53 : : : static const char UNITY_PROGMEM UnityStrNot[] = "Not ";
54 : : : static const char UNITY_PROGMEM UnityStrInf[] = "Infinity";
55 : : : static const char UNITY_PROGMEM UnityStrNegInf[] = "Negative Infinity";
56 : : : static const char UNITY_PROGMEM UnityStrNaN[] = "NaN";
57 : : : static const char UNITY_PROGMEM UnityStrDet[] = "Determinate";
58 : : : static const char UNITY_PROGMEM UnityStrInvalidFloatTrait[] = "Invalid Float Trait";
59 : : : #endif
60 : : : const char UNITY_PROGMEM UnityStrErrShorthand[] = "Unity Shorthand Support Disabled";
61 : : : const char UNITY_PROGMEM UnityStrErrFloat[] = "Unity Floating Point Disabled";
62 : : : const char UNITY_PROGMEM UnityStrErrDouble[] = "Unity Double Precision Disabled";
63 : : : const char UNITY_PROGMEM UnityStrErr64[] = "Unity 64-bit Support Disabled";
64 : : : static const char UNITY_PROGMEM UnityStrBreaker[] = "-----------------------";
65 : : : static const char UNITY_PROGMEM UnityStrResultsTests[] = " Tests ";
66 : : : static const char UNITY_PROGMEM UnityStrResultsFailures[] = " Failures ";
67 : : : static const char UNITY_PROGMEM UnityStrResultsIgnored[] = " Ignored ";
68 : : : #ifndef UNITY_EXCLUDE_DETAILS
69 : : : static const char UNITY_PROGMEM UnityStrDetail1Name[] = UNITY_DETAIL1_NAME " ";
70 : : : static const char UNITY_PROGMEM UnityStrDetail2Name[] = " " UNITY_DETAIL2_NAME " ";
71 : : : #endif
72 : : : /*-----------------------------------------------
73 : : : * Pretty Printers & Test Result Output Handlers
74 : : : *-----------------------------------------------*/
75 : : :
76 : : : /*-----------------------------------------------*/
77 : : : /* Local helper function to print characters. */
78 : : 5637 : static void UnityPrintChar(const char* pch)
79 : : : {
80 : : : /* printable characters plus CR & LF are printed */
81 [ + - + - ]:[ T f T f ]: 5637 : if ((*pch <= 126) && (*pch >= 32))
82 : : : {
83 : : 5637 : UNITY_OUTPUT_CHAR(*pch);
84 : : : }
85 : : : /* write escaped carriage returns */
86 [ # # ]: [ t f ]: 0 : else if (*pch == 13)
87 : : : {
88 : : 0 : UNITY_OUTPUT_CHAR('\\');
89 : : 0 : UNITY_OUTPUT_CHAR('r');
90 : : : }
91 : : : /* write escaped line feeds */
92 [ # # ]: [ t f ]: 0 : else if (*pch == 10)
93 : : : {
94 : : 0 : UNITY_OUTPUT_CHAR('\\');
95 : : 0 : UNITY_OUTPUT_CHAR('n');
96 : : : }
97 : : : /* unprintable characters are shown as codes */
98 : : : else
99 : : : {
100 : : 0 : UNITY_OUTPUT_CHAR('\\');
101 : : 0 : UNITY_OUTPUT_CHAR('x');
102 : : 0 : UnityPrintNumberHex((UNITY_UINT)*pch, 2);
103 : : : }
104 : : 5637 : }
105 : : :
106 : : : /*-----------------------------------------------*/
107 : : : /* Local helper function to print ANSI escape strings e.g. "\033[42m". */
108 : : : #ifdef UNITY_OUTPUT_COLOR
109 : : 210 : static UNITY_UINT UnityPrintAnsiEscapeString(const char* string)
110 : : : {
111 : : 210 : const char* pch = string;
112 : : 210 : UNITY_UINT count = 0;
113 : : :
114 [ + - + + ]:[ T f T F ]: 945 : while (*pch && (*pch != 'm'))
115 : : : {
116 : : 735 : UNITY_OUTPUT_CHAR(*pch);
117 : : 735 : pch++;
118 : : 735 : count++;
119 : : : }
120 : : 210 : UNITY_OUTPUT_CHAR('m');
121 : : 210 : count++;
122 : : :
123 : : 210 : return count;
124 : : : }
125 : : : #endif
126 : : :
127 : : : /*-----------------------------------------------*/
128 : : 333 : void UnityPrint(const char* string)
129 : : : {
130 : : 333 : const char* pch = string;
131 : : :
132 [ + - ]: [ T f ]: 333 : if (pch != NULL)
133 : : : {
134 [ + + ]: [ T F ]: 6180 : while (*pch)
135 : : : {
136 : : : #ifdef UNITY_OUTPUT_COLOR
137 : : : /* print ANSI escape code */
138 [ + + + - ]:[ T F T f ]: 5847 : if ((*pch == 27) && (*(pch + 1) == '['))
139 : : : {
140 : : 210 : pch += UnityPrintAnsiEscapeString(pch);
141 : : 210 : continue;
142 : : : }
143 : : : #endif
144 : : 5637 : UnityPrintChar(pch);
145 : : 5637 : pch++;
146 : : : }
147 : : : }
148 : : 333 : }
149 : : : /*-----------------------------------------------*/
150 : : 0 : void UnityPrintLen(const char* string, const UNITY_UINT32 length)
151 : : : {
152 : : 0 : const char* pch = string;
153 : : :
154 [ # # ]: [ t f ]: 0 : if (pch != NULL)
155 : : : {
156 [ # # # # ]:[ t f t f ]: 0 : while (*pch && ((UNITY_UINT32)(pch - string) < length))
157 : : : {
158 : : : /* printable characters plus CR & LF are printed */
159 [ # # # # ]:[ t f t f ]: 0 : if ((*pch <= 126) && (*pch >= 32))
160 : : : {
161 : : 0 : UNITY_OUTPUT_CHAR(*pch);
162 : : : }
163 : : : /* write escaped carriage returns */
164 [ # # ]: [ t f ]: 0 : else if (*pch == 13)
165 : : : {
166 : : 0 : UNITY_OUTPUT_CHAR('\\');
167 : : 0 : UNITY_OUTPUT_CHAR('r');
168 : : : }
169 : : : /* write escaped line feeds */
170 [ # # ]: [ t f ]: 0 : else if (*pch == 10)
171 : : : {
172 : : 0 : UNITY_OUTPUT_CHAR('\\');
173 : : 0 : UNITY_OUTPUT_CHAR('n');
174 : : : }
175 : : : /* unprintable characters are shown as codes */
176 : : : else
177 : : : {
178 : : 0 : UNITY_OUTPUT_CHAR('\\');
179 : : 0 : UNITY_OUTPUT_CHAR('x');
180 : : 0 : UnityPrintNumberHex((UNITY_UINT)*pch, 2);
181 : : : }
182 : : 0 : pch++;
183 : : : }
184 : : : }
185 : : 0 : }
186 : : :
187 : : : /*-----------------------------------------------*/
188 : : 2 : void UnityPrintNumberByStyle(const UNITY_INT number, const UNITY_DISPLAY_STYLE_T style)
189 : : : {
190 [ + - ]: [ T f ]: 2 : if ((style & UNITY_DISPLAY_RANGE_INT) == UNITY_DISPLAY_RANGE_INT)
191 : : : {
192 [ - + ]: [ t F ]: 2 : if (style == UNITY_DISPLAY_STYLE_CHAR)
193 : : : {
194 : : : /* printable characters plus CR & LF are printed */
195 : : 0 : UNITY_OUTPUT_CHAR('\'');
196 [ # # # # ]:[ t f t f ]: 0 : if ((number <= 126) && (number >= 32))
197 : : : {
198 : : 0 : UNITY_OUTPUT_CHAR((int)number);
199 : : : }
200 : : : /* write escaped carriage returns */
201 [ # # ]: [ t f ]: 0 : else if (number == 13)
202 : : : {
203 : : 0 : UNITY_OUTPUT_CHAR('\\');
204 : : 0 : UNITY_OUTPUT_CHAR('r');
205 : : : }
206 : : : /* write escaped line feeds */
207 [ # # ]: [ t f ]: 0 : else if (number == 10)
208 : : : {
209 : : 0 : UNITY_OUTPUT_CHAR('\\');
210 : : 0 : UNITY_OUTPUT_CHAR('n');
211 : : : }
212 : : : /* unprintable characters are shown as codes */
213 : : : else
214 : : : {
215 : : 0 : UNITY_OUTPUT_CHAR('\\');
216 : : 0 : UNITY_OUTPUT_CHAR('x');
217 : : 0 : UnityPrintNumberHex((UNITY_UINT)number, 2);
218 : : : }
219 : : 0 : UNITY_OUTPUT_CHAR('\'');
220 : : : }
221 : : : else
222 : : : {
223 : : 2 : UnityPrintNumber(number);
224 : : : }
225 : : : }
226 [ # # ]: [ t f ]: 0 : else if ((style & UNITY_DISPLAY_RANGE_UINT) == UNITY_DISPLAY_RANGE_UINT)
227 : : : {
228 : : 0 : UnityPrintNumberUnsigned((UNITY_UINT)number);
229 : : : }
230 : : : else
231 : : : {
232 : : 0 : UNITY_OUTPUT_CHAR('0');
233 : : 0 : UNITY_OUTPUT_CHAR('x');
234 : : 0 : UnityPrintNumberHex((UNITY_UINT)number, (char)((style & 0xF) * 2));
235 : : : }
236 : : 2 : }
237 : : :
238 : : : /*-----------------------------------------------*/
239 : : 121 : void UnityPrintNumber(const UNITY_INT number_to_print)
240 : : : {
241 : : 121 : UNITY_UINT number = (UNITY_UINT)number_to_print;
242 : : :
243 [ - + ]: [ t F ]: 121 : if (number_to_print < 0)
244 : : : {
245 : : : /* A negative number, including MIN negative */
246 : : 0 : UNITY_OUTPUT_CHAR('-');
247 : : 0 : number = (~number) + 1;
248 : : : }
249 : : 121 : UnityPrintNumberUnsigned(number);
250 : : 121 : }
251 : : :
252 : : : /*-----------------------------------------------
253 : : : * basically do an itoa using as little ram as possible */
254 : : 121 : void UnityPrintNumberUnsigned(const UNITY_UINT number)
255 : : : {
256 : : 121 : UNITY_UINT divisor = 1;
257 : : :
258 : : : /* figure out initial divisor */
259 [ + + ]: [ T F ]: 377 : while (number / divisor > 9)
260 : : : {
261 : : 256 : divisor *= 10;
262 : : : }
263 : : :
264 : : : /* now mod and print, then divide divisor */
265 : : : do
266 : : : {
267 : : 377 : UNITY_OUTPUT_CHAR((char)('0' + (number / divisor % 10)));
268 : : 377 : divisor /= 10;
269 [ + + ]: [ T F ]: 377 : } while (divisor > 0);
270 : : 121 : }
271 : : :
272 : : : /*-----------------------------------------------*/
273 : : 0 : void UnityPrintNumberHex(const UNITY_UINT number, const char nibbles_to_print)
274 : : : {
275 : : : int nibble;
276 : : 0 : char nibbles = nibbles_to_print;
277 : : :
278 [ # # ]: [ t f ]: 0 : if ((unsigned)nibbles > UNITY_MAX_NIBBLES)
279 : : : {
280 : : 0 : nibbles = UNITY_MAX_NIBBLES;
281 : : : }
282 : : :
283 [ # # ]: [ t f ]: 0 : while (nibbles > 0)
284 : : : {
285 : : 0 : nibbles--;
286 : : 0 : nibble = (int)(number >> (nibbles * 4)) & 0x0F;
287 [ # # ]: [ t f ]: 0 : if (nibble <= 9)
288 : : : {
289 : : 0 : UNITY_OUTPUT_CHAR((char)('0' + nibble));
290 : : : }
291 : : : else
292 : : : {
293 : : 0 : UNITY_OUTPUT_CHAR((char)('A' - 10 + nibble));
294 : : : }
295 : : : }
296 : : 0 : }
297 : : :
298 : : : /*-----------------------------------------------*/
299 : : 0 : void UnityPrintMask(const UNITY_UINT mask, const UNITY_UINT number)
300 : : : {
301 : : 0 : UNITY_UINT current_bit = (UNITY_UINT)1 << (UNITY_INT_WIDTH - 1);
302 : : : UNITY_INT32 i;
303 : : :
304 [ # # ]: [ t f ]: 0 : for (i = 0; i < UNITY_INT_WIDTH; i++)
305 : : : {
306 [ # # ]: [ t f ]: 0 : if (current_bit & mask)
307 : : : {
308 [ # # ]: [ t f ]: 0 : if (current_bit & number)
309 : : : {
310 : : 0 : UNITY_OUTPUT_CHAR('1');
311 : : : }
312 : : : else
313 : : : {
314 : : 0 : UNITY_OUTPUT_CHAR('0');
315 : : : }
316 : : : }
317 : : : else
318 : : : {
319 : : 0 : UNITY_OUTPUT_CHAR('X');
320 : : : }
321 : : 0 : current_bit = current_bit >> 1;
322 : : : }
323 : : 0 : }
324 : : :
325 : : : /*-----------------------------------------------*/
326 : : : #ifndef UNITY_EXCLUDE_FLOAT_PRINT
327 : : : /*
328 : : : * This function prints a floating-point value in a format similar to
329 : : : * printf("%.7g") on a single-precision machine or printf("%.9g") on a
330 : : : * double-precision machine. The 7th digit won't always be totally correct
331 : : : * in single-precision operation (for that level of accuracy, a more
332 : : : * complicated algorithm would be needed).
333 : : : */
334 : : 0 : void UnityPrintFloat(const UNITY_DOUBLE input_number)
335 : : : {
336 : : : #ifdef UNITY_INCLUDE_DOUBLE
337 : : : static const int sig_digits = 9;
338 : : : static const UNITY_INT32 min_scaled = 100000000;
339 : : : static const UNITY_INT32 max_scaled = 1000000000;
340 : : : #else
341 : : : static const int sig_digits = 7;
342 : : : static const UNITY_INT32 min_scaled = 1000000;
343 : : : static const UNITY_INT32 max_scaled = 10000000;
344 : : : #endif
345 : : :
346 : : 0 : UNITY_DOUBLE number = input_number;
347 : : :
348 : : : /* print minus sign (does not handle negative zero) */
349 [ # # ]: [ t f ]: 0 : if (number < 0.0f)
350 : : : {
351 : : 0 : UNITY_OUTPUT_CHAR('-');
352 : : 0 : number = -number;
353 : : : }
354 : : :
355 : : : /* handle zero, NaN, and +/- infinity */
356 [ # # ]: [ t f ]: 0 : if (number == 0.0f)
357 : : : {
358 : : 0 : UnityPrint("0");
359 : : : }
360 [ # # ]: [ t f ]: 0 : else if (UNITY_IS_NAN(number))
361 : : : {
362 : : 0 : UnityPrint("nan");
363 : : : }
364 [ # # ]: [ t f ]: 0 : else if (UNITY_IS_INF(number))
365 : : : {
366 : : 0 : UnityPrint("inf");
367 : : : }
368 : : : else
369 : : : {
370 : : 0 : UNITY_INT32 n_int = 0;
371 : : : UNITY_INT32 n;
372 : : 0 : int exponent = 0;
373 : : : int decimals;
374 : : : int digits;
375 : : 0 : char buf[16] = {0};
376 : : :
377 : : : /*
378 : : : * Scale up or down by powers of 10. To minimize rounding error,
379 : : : * start with a factor/divisor of 10^10, which is the largest
380 : : : * power of 10 that can be represented exactly. Finally, compute
381 : : : * (exactly) the remaining power of 10 and perform one more
382 : : : * multiplication or division.
383 : : : */
384 [ # # ]: [ t f ]: 0 : if (number < 1.0f)
385 : : : {
386 : : 0 : UNITY_DOUBLE factor = 1.0f;
387 : : :
388 [ # # ]: [ t f ]: 0 : while (number < (UNITY_DOUBLE)max_scaled / 1e10f) { number *= 1e10f; exponent -= 10; }
389 [ # # ]: [ t f ]: 0 : while (number * factor < (UNITY_DOUBLE)min_scaled) { factor *= 10.0f; exponent--; }
390 : : :
391 : : 0 : number *= factor;
392 : : : }
393 [ # # ]: [ t f ]: 0 : else if (number > (UNITY_DOUBLE)max_scaled)
394 : : : {
395 : : 0 : UNITY_DOUBLE divisor = 1.0f;
396 : : :
397 [ # # ]: [ t f ]: 0 : while (number > (UNITY_DOUBLE)min_scaled * 1e10f) { number /= 1e10f; exponent += 10; }
398 [ # # ]: [ t f ]: 0 : while (number / divisor > (UNITY_DOUBLE)max_scaled) { divisor *= 10.0f; exponent++; }
399 : : :
400 : : 0 : number /= divisor;
401 : : : }
402 : : : else
403 : : : {
404 : : : /*
405 : : : * In this range, we can split off the integer part before
406 : : : * doing any multiplications. This reduces rounding error by
407 : : : * freeing up significant bits in the fractional part.
408 : : : */
409 : : 0 : UNITY_DOUBLE factor = 1.0f;
410 : : 0 : n_int = (UNITY_INT32)number;
411 : : 0 : number -= (UNITY_DOUBLE)n_int;
412 : : :
413 [ # # ]: [ t f ]: 0 : while (n_int < min_scaled) { n_int *= 10; factor *= 10.0f; exponent--; }
414 : : :
415 : : 0 : number *= factor;
416 : : : }
417 : : :
418 : : : /* round to nearest integer */
419 : : 0 : n = ((UNITY_INT32)(number + number) + 1) / 2;
420 : : :
421 : : : #ifndef UNITY_ROUND_TIES_AWAY_FROM_ZERO
422 : : : /* round to even if exactly between two integers */
423 [ # # # # ]:[ t f t f ]: 0 : if ((n & 1) && (((UNITY_DOUBLE)n - number) == 0.5f))
424 : : 0 : n--;
425 : : : #endif
426 : : :
427 : : 0 : n += n_int;
428 : : :
429 [ # # ]: [ t f ]: 0 : if (n >= max_scaled)
430 : : : {
431 : : 0 : n = min_scaled;
432 : : 0 : exponent++;
433 : : : }
434 : : :
435 : : : /* determine where to place decimal point */
436 [ # # # # ]:[ t f t f ]: 0 : decimals = ((exponent <= 0) && (exponent >= -(sig_digits + 3))) ? (-exponent) : (sig_digits - 1);
437 : : 0 : exponent += decimals;
438 : : :
439 : : : /* truncate trailing zeroes after decimal point */
440 [ # # # # ]:[ t f t f ]: 0 : while ((decimals > 0) && ((n % 10) == 0))
441 : : : {
442 : : 0 : n /= 10;
443 : : 0 : decimals--;
444 : : : }
445 : : :
446 : : : /* build up buffer in reverse order */
447 : : 0 : digits = 0;
448 [ # # # # ]:[ t f t f ]: 0 : while ((n != 0) || (digits <= decimals))
449 : : : {
450 : : 0 : buf[digits++] = (char)('0' + n % 10);
451 : : 0 : n /= 10;
452 : : : }
453 : : :
454 : : : /* print out buffer (backwards) */
455 [ # # ]: [ t f ]: 0 : while (digits > 0)
456 : : : {
457 [ # # ]: [ t f ]: 0 : if (digits == decimals)
458 : : : {
459 : : 0 : UNITY_OUTPUT_CHAR('.');
460 : : : }
461 : : 0 : UNITY_OUTPUT_CHAR(buf[--digits]);
462 : : : }
463 : : :
464 : : : /* print exponent if needed */
465 [ # # ]: [ t f ]: 0 : if (exponent != 0)
466 : : : {
467 : : 0 : UNITY_OUTPUT_CHAR('e');
468 : : :
469 [ # # ]: [ t f ]: 0 : if (exponent < 0)
470 : : : {
471 : : 0 : UNITY_OUTPUT_CHAR('-');
472 : : 0 : exponent = -exponent;
473 : : : }
474 : : : else
475 : : : {
476 : : 0 : UNITY_OUTPUT_CHAR('+');
477 : : : }
478 : : :
479 : : 0 : digits = 0;
480 [ # # # # ]:[ t f t f ]: 0 : while ((exponent != 0) || (digits < 2))
481 : : : {
482 : : 0 : buf[digits++] = (char)('0' + exponent % 10);
483 : : 0 : exponent /= 10;
484 : : : }
485 [ # # ]: [ t f ]: 0 : while (digits > 0)
486 : : : {
487 : : 0 : UNITY_OUTPUT_CHAR(buf[--digits]);
488 : : : }
489 : : : }
490 : : : }
491 : : 0 : }
492 : : : #endif /* ! UNITY_EXCLUDE_FLOAT_PRINT */
493 : : :
494 : : : /*-----------------------------------------------*/
495 : : 98 : static void UnityTestResultsBegin(const char* file, const UNITY_LINE_TYPE line)
496 : : : {
497 : : : #ifdef UNITY_OUTPUT_FOR_ECLIPSE
498 : : : UNITY_OUTPUT_CHAR('(');
499 : : : UnityPrint(file);
500 : : : UNITY_OUTPUT_CHAR(':');
501 : : : UnityPrintNumber((UNITY_INT)line);
502 : : : UNITY_OUTPUT_CHAR(')');
503 : : : UNITY_OUTPUT_CHAR(' ');
504 : : : UnityPrint(Unity.CurrentTestName);
505 : : : UNITY_OUTPUT_CHAR(':');
506 : : : #else
507 : : : #ifdef UNITY_OUTPUT_FOR_IAR_WORKBENCH
508 : : : UnityPrint("<SRCREF line=");
509 : : : UnityPrintNumber((UNITY_INT)line);
510 : : : UnityPrint(" file=\"");
511 : : : UnityPrint(file);
512 : : : UNITY_OUTPUT_CHAR('"');
513 : : : UNITY_OUTPUT_CHAR('>');
514 : : : UnityPrint(Unity.CurrentTestName);
515 : : : UnityPrint("</SRCREF> ");
516 : : : #else
517 : : : #ifdef UNITY_OUTPUT_FOR_QT_CREATOR
518 : : : UnityPrint("file://");
519 : : : UnityPrint(file);
520 : : : UNITY_OUTPUT_CHAR(':');
521 : : : UnityPrintNumber((UNITY_INT)line);
522 : : : UNITY_OUTPUT_CHAR(' ');
523 : : : UnityPrint(Unity.CurrentTestName);
524 : : : UNITY_OUTPUT_CHAR(':');
525 : : : #else
526 : : 98 : UnityPrint(file);
527 : : 98 : UNITY_OUTPUT_CHAR(':');
528 : : 98 : UnityPrintNumber((UNITY_INT)line);
529 : : 98 : UNITY_OUTPUT_CHAR(':');
530 : : 98 : UnityPrint(Unity.CurrentTestName);
531 : : 98 : UNITY_OUTPUT_CHAR(':');
532 : : : #endif
533 : : : #endif
534 : : : #endif
535 : : 98 : }
536 : : :
537 : : : /*-----------------------------------------------*/
538 : : 1 : static void UnityTestResultsFailBegin(const UNITY_LINE_TYPE line)
539 : : : {
540 : : 1 : UnityTestResultsBegin(Unity.TestFile, line);
541 : : 1 : UnityPrint(UnityStrFail);
542 : : 1 : UNITY_OUTPUT_CHAR(':');
543 : : 1 : }
544 : : :
545 : : : /*-----------------------------------------------*/
546 : : 98 : void UnityConcludeTest(void)
547 : : : {
548 [ + + ]: [ T F ]: 98 : if (Unity.CurrentTestIgnored)
549 : : : {
550 : : 1 : Unity.TestIgnores++;
551 : : : }
552 [ + + ]: [ T F ]: 97 : else if (!Unity.CurrentTestFailed)
553 : : : {
554 : : 95 : UnityTestResultsBegin(Unity.TestFile, Unity.CurrentTestLineNumber);
555 : : 95 : UnityPrint(UnityStrPass);
556 : : : }
557 : : : else
558 : : : {
559 : : 2 : Unity.TestFailures++;
560 : : : }
561 : : :
562 : : 98 : Unity.CurrentTestFailed = 0;
563 : : 98 : Unity.CurrentTestIgnored = 0;
564 : : : UNITY_PRINT_EXEC_TIME();
565 : : 98 : UNITY_PRINT_EOL();
566 : : : UNITY_FLUSH_CALL();
567 : : 98 : }
568 : : :
569 : : : /*-----------------------------------------------*/
570 : : 1 : static void UnityAddMsgIfSpecified(const char* msg)
571 : : : {
572 : : : #ifdef UNITY_PRINT_TEST_CONTEXT
573 : : : UnityPrint(UnityStrSpacer);
574 : : : UNITY_PRINT_TEST_CONTEXT();
575 : : : #endif
576 : : : #ifndef UNITY_EXCLUDE_DETAILS
577 [ - + ]: [ t F ]: 1 : if (Unity.CurrentDetail1)
578 : : : {
579 : : 0 : UnityPrint(UnityStrSpacer);
580 : : 0 : UnityPrint(UnityStrDetail1Name);
581 : : 0 : UnityPrint(Unity.CurrentDetail1);
582 [ # # ]: [ t f ]: 0 : if (Unity.CurrentDetail2)
583 : : : {
584 : : 0 : UnityPrint(UnityStrDetail2Name);
585 : : 0 : UnityPrint(Unity.CurrentDetail2);
586 : : : }
587 : : : }
588 : : : #endif
589 [ - + ]: [ t F ]: 1 : if (msg)
590 : : : {
591 : : 0 : UnityPrint(UnityStrSpacer);
592 : : 0 : UnityPrint(msg);
593 : : : }
594 : : 1 : }
595 : : :
596 : : : /*-----------------------------------------------*/
597 : : 0 : static void UnityPrintExpectedAndActualStrings(const char* expected, const char* actual)
598 : : : {
599 : : 0 : UnityPrint(UnityStrExpected);
600 [ # # ]: [ t f ]: 0 : if (expected != NULL)
601 : : : {
602 : : 0 : UNITY_OUTPUT_CHAR('\'');
603 : : 0 : UnityPrint(expected);
604 : : 0 : UNITY_OUTPUT_CHAR('\'');
605 : : : }
606 : : : else
607 : : : {
608 : : 0 : UnityPrint(UnityStrNull);
609 : : : }
610 : : 0 : UnityPrint(UnityStrWas);
611 [ # # ]: [ t f ]: 0 : if (actual != NULL)
612 : : : {
613 : : 0 : UNITY_OUTPUT_CHAR('\'');
614 : : 0 : UnityPrint(actual);
615 : : 0 : UNITY_OUTPUT_CHAR('\'');
616 : : : }
617 : : : else
618 : : : {
619 : : 0 : UnityPrint(UnityStrNull);
620 : : : }
621 : : 0 : }
622 : : :
623 : : : /*-----------------------------------------------*/
624 : : 0 : static void UnityPrintExpectedAndActualStringsLen(const char* expected,
625 : : : const char* actual,
626 : : : const UNITY_UINT32 length)
627 : : : {
628 : : 0 : UnityPrint(UnityStrExpected);
629 [ # # ]: [ t f ]: 0 : if (expected != NULL)
630 : : : {
631 : : 0 : UNITY_OUTPUT_CHAR('\'');
632 : : 0 : UnityPrintLen(expected, length);
633 : : 0 : UNITY_OUTPUT_CHAR('\'');
634 : : : }
635 : : : else
636 : : : {
637 : : 0 : UnityPrint(UnityStrNull);
638 : : : }
639 : : 0 : UnityPrint(UnityStrWas);
640 [ # # ]: [ t f ]: 0 : if (actual != NULL)
641 : : : {
642 : : 0 : UNITY_OUTPUT_CHAR('\'');
643 : : 0 : UnityPrintLen(actual, length);
644 : : 0 : UNITY_OUTPUT_CHAR('\'');
645 : : : }
646 : : : else
647 : : : {
648 : : 0 : UnityPrint(UnityStrNull);
649 : : : }
650 : : 0 : }
651 : : :
652 : : : /*-----------------------------------------------
653 : : : * Assertion & Control Helpers
654 : : : *-----------------------------------------------*/
655 : : :
656 : : : /*-----------------------------------------------*/
657 : : 0 : static int UnityIsOneArrayNull(UNITY_INTERNAL_PTR expected,
658 : : : UNITY_INTERNAL_PTR actual,
659 : : : const UNITY_LINE_TYPE lineNumber,
660 : : : const char* msg)
661 : : : {
662 : : : /* Both are NULL or same pointer */
663 [ # # ]: [ t f ]: 0 : if (expected == actual) { return 0; }
664 : : :
665 : : : /* print and return true if just expected is NULL */
666 [ # # ]: [ t f ]: 0 : if (expected == NULL)
667 : : : {
668 : : 0 : UnityTestResultsFailBegin(lineNumber);
669 : : 0 : UnityPrint(UnityStrNullPointerForExpected);
670 : : 0 : UnityAddMsgIfSpecified(msg);
671 : : 0 : return 1;
672 : : : }
673 : : :
674 : : : /* print and return true if just actual is NULL */
675 [ # # ]: [ t f ]: 0 : if (actual == NULL)
676 : : : {
677 : : 0 : UnityTestResultsFailBegin(lineNumber);
678 : : 0 : UnityPrint(UnityStrNullPointerForActual);
679 : : 0 : UnityAddMsgIfSpecified(msg);
680 : : 0 : return 1;
681 : : : }
682 : : :
683 : : 0 : return 0; /* return false if neither is NULL */
684 : : : }
685 : : :
686 : : : /*-----------------------------------------------
687 : : : * Assertion Functions
688 : : : *-----------------------------------------------*/
689 : : :
690 : : : /*-----------------------------------------------*/
691 : : 0 : void UnityAssertBits(const UNITY_INT mask,
692 : : : const UNITY_INT expected,
693 : : : const UNITY_INT actual,
694 : : : const char* msg,
695 : : : const UNITY_LINE_TYPE lineNumber)
696 : : : {
697 [ # # # # ]:[ t f t f ]: 0 : RETURN_IF_FAIL_OR_IGNORE;
698 : : :
699 [ # # ]: [ t f ]: 0 : if ((mask & expected) != (mask & actual))
700 : : : {
701 : : 0 : UnityTestResultsFailBegin(lineNumber);
702 : : 0 : UnityPrint(UnityStrExpected);
703 : : 0 : UnityPrintMask((UNITY_UINT)mask, (UNITY_UINT)expected);
704 : : 0 : UnityPrint(UnityStrWas);
705 : : 0 : UnityPrintMask((UNITY_UINT)mask, (UNITY_UINT)actual);
706 : : 0 : UnityAddMsgIfSpecified(msg);
707 : : 0 : UNITY_FAIL_AND_BAIL;
708 : : : }
709 : : 0 : }
710 : : :
711 : : : /*-----------------------------------------------*/
712 : : 94 : void UnityAssertEqualNumber(const UNITY_INT expected,
713 : : : const UNITY_INT actual,
714 : : : const char* msg,
715 : : : const UNITY_LINE_TYPE lineNumber,
716 : : : const UNITY_DISPLAY_STYLE_T style)
717 : : : {
718 [ + - - + ]:[ t F t F ]: 94 : RETURN_IF_FAIL_OR_IGNORE;
719 : : :
720 [ + + ]: [ T F ]: 94 : if (expected != actual)
721 : : : {
722 : : 1 : UnityTestResultsFailBegin(lineNumber);
723 : : 1 : UnityPrint(UnityStrExpected);
724 : : 1 : UnityPrintNumberByStyle(expected, style);
725 : : 1 : UnityPrint(UnityStrWas);
726 : : 1 : UnityPrintNumberByStyle(actual, style);
727 : : 1 : UnityAddMsgIfSpecified(msg);
728 : : 1 : UNITY_FAIL_AND_BAIL;
729 : : : }
730 : : 93 : }
731 : : :
732 : : : /*-----------------------------------------------*/
733 : : 0 : void UnityAssertGreaterOrLessOrEqualNumber(const UNITY_INT threshold,
734 : : : const UNITY_INT actual,
735 : : : const UNITY_COMPARISON_T compare,
736 : : : const char *msg,
737 : : : const UNITY_LINE_TYPE lineNumber,
738 : : : const UNITY_DISPLAY_STYLE_T style)
739 : : : {
740 : : 0 : int failed = 0;
741 [ # # # # ]:[ t f t f ]: 0 : RETURN_IF_FAIL_OR_IGNORE;
742 : : :
743 [ # # # # ]:[ t f t f ]: 0 : if ((threshold == actual) && (compare & UNITY_EQUAL_TO)) { return; }
744 [ # # ]: [ t f ]: 0 : if ((threshold == actual)) { failed = 1; }
745 : : :
746 [ # # ]: [ t f ]: 0 : if ((style & UNITY_DISPLAY_RANGE_INT) == UNITY_DISPLAY_RANGE_INT)
747 : : : {
748 [ # # # # ]:[ t f t f ]: 0 : if ((actual > threshold) && (compare & UNITY_SMALLER_THAN)) { failed = 1; }
749 [ # # # # ]:[ t f t f ]: 0 : if ((actual < threshold) && (compare & UNITY_GREATER_THAN)) { failed = 1; }
750 : : : }
751 : : : else /* UINT or HEX */
752 : : : {
753 [ # # # # ]:[ t f t f ]: 0 : if (((UNITY_UINT)actual > (UNITY_UINT)threshold) && (compare & UNITY_SMALLER_THAN)) { failed = 1; }
754 [ # # # # ]:[ t f t f ]: 0 : if (((UNITY_UINT)actual < (UNITY_UINT)threshold) && (compare & UNITY_GREATER_THAN)) { failed = 1; }
755 : : : }
756 : : :
757 [ # # ]: [ t f ]: 0 : if (failed)
758 : : : {
759 : : 0 : UnityTestResultsFailBegin(lineNumber);
760 : : 0 : UnityPrint(UnityStrExpected);
761 : : 0 : UnityPrintNumberByStyle(actual, style);
762 [ # # ]: [ t f ]: 0 : if (compare & UNITY_GREATER_THAN) { UnityPrint(UnityStrGt); }
763 [ # # ]: [ t f ]: 0 : if (compare & UNITY_SMALLER_THAN) { UnityPrint(UnityStrLt); }
764 [ # # ]: [ t f ]: 0 : if (compare & UNITY_EQUAL_TO) { UnityPrint(UnityStrOrEqual); }
765 [ # # ]: [ t f ]: 0 : if (compare == UNITY_NOT_EQUAL) { UnityPrint(UnityStrNotEqual); }
766 : : 0 : UnityPrintNumberByStyle(threshold, style);
767 : : 0 : UnityAddMsgIfSpecified(msg);
768 : : 0 : UNITY_FAIL_AND_BAIL;
769 : : : }
770 : : : }
771 : : :
772 : : : #define UnityPrintPointlessAndBail() \
773 : : : do { \
774 : : : UnityTestResultsFailBegin(lineNumber); \
775 : : : UnityPrint(UnityStrPointless); \
776 : : : UnityAddMsgIfSpecified(msg); \
777 : : : UNITY_FAIL_AND_BAIL; \
778 : : : } while (0)
779 : : :
780 : : : /*-----------------------------------------------*/
781 : : 0 : void UnityAssertEqualIntArray(UNITY_INTERNAL_PTR expected,
782 : : : UNITY_INTERNAL_PTR actual,
783 : : : const UNITY_UINT32 num_elements,
784 : : : const char* msg,
785 : : : const UNITY_LINE_TYPE lineNumber,
786 : : : const UNITY_DISPLAY_STYLE_T style,
787 : : : const UNITY_FLAGS_T flags)
788 : : : {
789 : : 0 : UNITY_UINT32 elements = num_elements;
790 : : 0 : unsigned int length = style & 0xF;
791 : : 0 : unsigned int increment = 0;
792 : : :
793 [ # # # # ]:[ t f t f ]: 0 : RETURN_IF_FAIL_OR_IGNORE;
794 : : :
795 [ # # ]: [ t f ]: 0 : if (num_elements == 0)
796 : : : {
797 : : : #ifdef UNITY_COMPARE_PTRS_ON_ZERO_ARRAY
798 : : : UNITY_TEST_ASSERT_EQUAL_PTR(expected, actual, lineNumber, msg);
799 : : : #else
800 : : 0 : UnityPrintPointlessAndBail();
801 : : : #endif
802 : : : }
803 : : :
804 [ # # ]: [ t f ]: 0 : if (expected == actual)
805 : : : {
806 : : 0 : return; /* Both are NULL or same pointer */
807 : : : }
808 : : :
809 [ # # ]: [ t f ]: 0 : if (UnityIsOneArrayNull(expected, actual, lineNumber, msg))
810 : : : {
811 : : 0 : UNITY_FAIL_AND_BAIL;
812 : : : }
813 : : :
814 [ # # # # ]:[ t f t f ]: 0 : while ((elements > 0) && (elements--))
815 : : : {
816 : : : UNITY_INT expect_val;
817 : : : UNITY_INT actual_val;
818 : : :
819 [ # # # # ]: : 0 : switch (length)
820 : : : {
821 : : 0 : case 1:
822 : : 0 : expect_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT8*)expected;
823 : : 0 : actual_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT8*)actual;
824 [ # # ]: [ t f ]: 0 : if (style & (UNITY_DISPLAY_RANGE_UINT | UNITY_DISPLAY_RANGE_HEX))
825 : : : {
826 : : 0 : expect_val &= 0x000000FF;
827 : : 0 : actual_val &= 0x000000FF;
828 : : : }
829 : : 0 : increment = sizeof(UNITY_INT8);
830 : : 0 : break;
831 : : :
832 : : 0 : case 2:
833 : : 0 : expect_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT16*)expected;
834 : : 0 : actual_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT16*)actual;
835 [ # # ]: [ t f ]: 0 : if (style & (UNITY_DISPLAY_RANGE_UINT | UNITY_DISPLAY_RANGE_HEX))
836 : : : {
837 : : 0 : expect_val &= 0x0000FFFF;
838 : : 0 : actual_val &= 0x0000FFFF;
839 : : : }
840 : : 0 : increment = sizeof(UNITY_INT16);
841 : : 0 : break;
842 : : :
843 : : : #ifdef UNITY_SUPPORT_64
844 : : 0 : case 8:
845 : : 0 : expect_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT64*)expected;
846 : : 0 : actual_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT64*)actual;
847 : : 0 : increment = sizeof(UNITY_INT64);
848 : : 0 : break;
849 : : : #endif
850 : : :
851 : : 0 : default: /* default is length 4 bytes */
852 : : : case 4:
853 : : 0 : expect_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT32*)expected;
854 : : 0 : actual_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT32*)actual;
855 : : : #ifdef UNITY_SUPPORT_64
856 [ # # ]: [ t f ]: 0 : if (style & (UNITY_DISPLAY_RANGE_UINT | UNITY_DISPLAY_RANGE_HEX))
857 : : : {
858 : : 0 : expect_val &= 0x00000000FFFFFFFF;
859 : : 0 : actual_val &= 0x00000000FFFFFFFF;
860 : : : }
861 : : : #endif
862 : : 0 : increment = sizeof(UNITY_INT32);
863 : : 0 : length = 4;
864 : : 0 : break;
865 : : : }
866 : : :
867 [ # # ]: [ t f ]: 0 : if (expect_val != actual_val)
868 : : : {
869 [ # # # # ]:[ t f t f ]: 0 : if ((style & UNITY_DISPLAY_RANGE_UINT) && (length < (UNITY_INT_WIDTH / 8)))
870 : : : { /* For UINT, remove sign extension (padding 1's) from signed type casts above */
871 : : 0 : UNITY_INT mask = 1;
872 : : 0 : mask = (mask << 8 * length) - 1;
873 : : 0 : expect_val &= mask;
874 : : 0 : actual_val &= mask;
875 : : : }
876 : : 0 : UnityTestResultsFailBegin(lineNumber);
877 : : 0 : UnityPrint(UnityStrElement);
878 : : 0 : UnityPrintNumberUnsigned(num_elements - elements - 1);
879 : : 0 : UnityPrint(UnityStrExpected);
880 : : 0 : UnityPrintNumberByStyle(expect_val, style);
881 : : 0 : UnityPrint(UnityStrWas);
882 : : 0 : UnityPrintNumberByStyle(actual_val, style);
883 : : 0 : UnityAddMsgIfSpecified(msg);
884 : : 0 : UNITY_FAIL_AND_BAIL;
885 : : : }
886 : : : /* Walk through array by incrementing the pointers */
887 [ # # ]: [ t f ]: 0 : if (flags == UNITY_ARRAY_TO_ARRAY)
888 : : : {
889 : : 0 : expected = (UNITY_INTERNAL_PTR)((const char*)expected + increment);
890 : : : }
891 : : 0 : actual = (UNITY_INTERNAL_PTR)((const char*)actual + increment);
892 : : : }
893 : : : }
894 : : :
895 : : : /*-----------------------------------------------*/
896 : : : #ifndef UNITY_EXCLUDE_FLOAT
897 : : : /* Wrap this define in a function with variable types as float or double */
898 : : : #define UNITY_FLOAT_OR_DOUBLE_WITHIN(delta, expected, actual, diff) \
899 : : : if (UNITY_IS_INF(expected) && UNITY_IS_INF(actual) && (((expected) < 0) == ((actual) < 0))) return 1; \
900 : : : if (UNITY_NAN_CHECK) return 1; \
901 : : : (diff) = (actual) - (expected); \
902 : : : if ((diff) < 0) (diff) = -(diff); \
903 : : : if ((delta) < 0) (delta) = -(delta); \
904 : : : return !(UNITY_IS_NAN(diff) || UNITY_IS_INF(diff) || ((diff) > (delta)))
905 : : : /* This first part of this condition will catch any NaN or Infinite values */
906 : : : #ifndef UNITY_NAN_NOT_EQUAL_NAN
907 : : : #define UNITY_NAN_CHECK UNITY_IS_NAN(expected) && UNITY_IS_NAN(actual)
908 : : : #else
909 : : : #define UNITY_NAN_CHECK 0
910 : : : #endif
911 : : :
912 : : : #ifndef UNITY_EXCLUDE_FLOAT_PRINT
913 : : : #define UNITY_PRINT_EXPECTED_AND_ACTUAL_FLOAT(expected, actual) \
914 : : : do { \
915 : : : UnityPrint(UnityStrExpected); \
916 : : : UnityPrintFloat(expected); \
917 : : : UnityPrint(UnityStrWas); \
918 : : : UnityPrintFloat(actual); \
919 : : : } while (0)
920 : : : #else
921 : : : #define UNITY_PRINT_EXPECTED_AND_ACTUAL_FLOAT(expected, actual) \
922 : : : UnityPrint(UnityStrDelta)
923 : : : #endif /* UNITY_EXCLUDE_FLOAT_PRINT */
924 : : :
925 : : : /*-----------------------------------------------*/
926 : : 38 : static int UnityFloatsWithin(UNITY_FLOAT delta, UNITY_FLOAT expected, UNITY_FLOAT actual)
927 : : : {
928 : : : UNITY_FLOAT diff;
929 [ - + - - : [ T F ]: 38 : UNITY_FLOAT_OR_DOUBLE_WITHIN(delta, expected, actual, diff);
- - - + - [ t F t f ]
- + + + + [ T F T f
+ - + - + T f ]
- ]
930 : : : }
931 : : :
932 : : : /*-----------------------------------------------*/
933 : : 0 : void UnityAssertWithinFloatArray(const UNITY_FLOAT delta,
934 : : : UNITY_PTR_ATTRIBUTE const UNITY_FLOAT* expected,
935 : : : UNITY_PTR_ATTRIBUTE const UNITY_FLOAT* actual,
936 : : : const UNITY_UINT32 num_elements,
937 : : : const char* msg,
938 : : : const UNITY_LINE_TYPE lineNumber,
939 : : : const UNITY_FLAGS_T flags)
940 : : : {
941 : : 0 : UNITY_UINT32 elements = num_elements;
942 : : 0 : UNITY_PTR_ATTRIBUTE const UNITY_FLOAT* ptr_expected = expected;
943 : : 0 : UNITY_PTR_ATTRIBUTE const UNITY_FLOAT* ptr_actual = actual;
944 : : 0 : UNITY_FLOAT in_delta = delta;
945 : : 0 : UNITY_FLOAT current_element_delta = delta;
946 : : :
947 [ # # # # ]:[ t f t f ]: 0 : RETURN_IF_FAIL_OR_IGNORE;
948 : : :
949 [ # # ]: [ t f ]: 0 : if (elements == 0)
950 : : : {
951 : : : #ifdef UNITY_COMPARE_PTRS_ON_ZERO_ARRAY
952 : : : UNITY_TEST_ASSERT_EQUAL_PTR(expected, actual, lineNumber, msg);
953 : : : #else
954 : : 0 : UnityPrintPointlessAndBail();
955 : : : #endif
956 : : : }
957 : : :
958 [ # # ]: [ t f ]: 0 : if (UNITY_IS_INF(in_delta))
959 : : : {
960 : : 0 : return; /* Arrays will be force equal with infinite delta */
961 : : : }
962 : : :
963 [ # # ]: [ t f ]: 0 : if (UNITY_IS_NAN(in_delta))
964 : : : {
965 : : : /* Delta must be correct number */
966 : : 0 : UnityPrintPointlessAndBail();
967 : : : }
968 : : :
969 [ # # ]: [ t f ]: 0 : if (expected == actual)
970 : : : {
971 : : 0 : return; /* Both are NULL or same pointer */
972 : : : }
973 : : :
974 [ # # ]: [ t f ]: 0 : if (UnityIsOneArrayNull((UNITY_INTERNAL_PTR)expected, (UNITY_INTERNAL_PTR)actual, lineNumber, msg))
975 : : : {
976 : : 0 : UNITY_FAIL_AND_BAIL;
977 : : : }
978 : : :
979 : : : /* fix delta sign if need */
980 [ # # ]: [ t f ]: 0 : if (in_delta < 0)
981 : : : {
982 : : 0 : in_delta = -in_delta;
983 : : : }
984 : : :
985 [ # # ]: [ t f ]: 0 : while (elements--)
986 : : : {
987 : : 0 : current_element_delta = *ptr_expected * UNITY_FLOAT_PRECISION;
988 : : :
989 [ # # ]: [ t f ]: 0 : if (current_element_delta < 0)
990 : : : {
991 : : : /* fix delta sign for correct calculations */
992 : : 0 : current_element_delta = -current_element_delta;
993 : : : }
994 : : :
995 [ # # ]: [ t f ]: 0 : if (!UnityFloatsWithin(in_delta + current_element_delta, *ptr_expected, *ptr_actual))
996 : : : {
997 : : 0 : UnityTestResultsFailBegin(lineNumber);
998 : : 0 : UnityPrint(UnityStrElement);
999 : : 0 : UnityPrintNumberUnsigned(num_elements - elements - 1);
1000 : : 0 : UNITY_PRINT_EXPECTED_AND_ACTUAL_FLOAT((UNITY_DOUBLE)*ptr_expected, (UNITY_DOUBLE)*ptr_actual);
1001 : : 0 : UnityAddMsgIfSpecified(msg);
1002 : : 0 : UNITY_FAIL_AND_BAIL;
1003 : : : }
1004 [ # # ]: [ t f ]: 0 : if (flags == UNITY_ARRAY_TO_ARRAY)
1005 : : : {
1006 : : 0 : ptr_expected++;
1007 : : : }
1008 : : 0 : ptr_actual++;
1009 : : : }
1010 : : : }
1011 : : :
1012 : : : /*-----------------------------------------------*/
1013 : : 38 : void UnityAssertFloatsWithin(const UNITY_FLOAT delta,
1014 : : : const UNITY_FLOAT expected,
1015 : : : const UNITY_FLOAT actual,
1016 : : : const char* msg,
1017 : : : const UNITY_LINE_TYPE lineNumber)
1018 : : : {
1019 [ + - - + ]:[ t F t F ]: 38 : RETURN_IF_FAIL_OR_IGNORE;
1020 : : :
1021 : : :
1022 [ - + ]: [ t F ]: 38 : if (!UnityFloatsWithin(delta, expected, actual))
1023 : : : {
1024 : : 0 : UnityTestResultsFailBegin(lineNumber);
1025 : : 0 : UNITY_PRINT_EXPECTED_AND_ACTUAL_FLOAT((UNITY_DOUBLE)expected, (UNITY_DOUBLE)actual);
1026 : : 0 : UnityAddMsgIfSpecified(msg);
1027 : : 0 : UNITY_FAIL_AND_BAIL;
1028 : : : }
1029 : : 38 : }
1030 : : :
1031 : : : /*-----------------------------------------------*/
1032 : : 0 : void UnityAssertFloatsNotWithin(const UNITY_FLOAT delta,
1033 : : : const UNITY_FLOAT expected,
1034 : : : const UNITY_FLOAT actual,
1035 : : : const char* msg,
1036 : : : const UNITY_LINE_TYPE lineNumber)
1037 : : : {
1038 [ # # # # ]:[ t f t f ]: 0 : RETURN_IF_FAIL_OR_IGNORE;
1039 : : :
1040 [ # # ]: [ t f ]: 0 : if (UnityFloatsWithin(delta, expected, actual))
1041 : : : {
1042 : : 0 : UnityTestResultsFailBegin(lineNumber);
1043 : : 0 : UnityPrint(UnityStrExpected);
1044 : : 0 : UnityPrintFloat((UNITY_DOUBLE)expected);
1045 : : 0 : UnityPrint(UnityStrNotEqual);
1046 : : 0 : UnityPrintFloat((UNITY_DOUBLE)actual);
1047 : : 0 : UnityAddMsgIfSpecified(msg);
1048 : : 0 : UNITY_FAIL_AND_BAIL;
1049 : : : }
1050 : : 0 : }
1051 : : :
1052 : : : /*-----------------------------------------------*/
1053 : : 0 : void UnityAssertGreaterOrLessFloat(const UNITY_FLOAT threshold,
1054 : : : const UNITY_FLOAT actual,
1055 : : : const UNITY_COMPARISON_T compare,
1056 : : : const char* msg,
1057 : : : const UNITY_LINE_TYPE lineNumber)
1058 : : : {
1059 : : : int failed;
1060 : : :
1061 [ # # # # ]:[ t f t f ]: 0 : RETURN_IF_FAIL_OR_IGNORE;
1062 : : :
1063 : : 0 : failed = 0;
1064 : : :
1065 : : : /* Checking for "not success" rather than failure to get the right result for NaN */
1066 [ # # # # ]:[ t f t f ]: 0 : if (!(actual < threshold) && (compare & UNITY_SMALLER_THAN)) { failed = 1; }
1067 [ # # # # ]:[ t f t f ]: 0 : if (!(actual > threshold) && (compare & UNITY_GREATER_THAN)) { failed = 1; }
1068 : : :
1069 [ # # # # ]:[ t f t f ]: 0 : if ((compare & UNITY_EQUAL_TO) && UnityFloatsWithin(threshold * UNITY_FLOAT_PRECISION, threshold, actual)) { failed = 0; }
1070 : : :
1071 [ # # ]: [ t f ]: 0 : if (failed)
1072 : : : {
1073 : : 0 : UnityTestResultsFailBegin(lineNumber);
1074 : : 0 : UnityPrint(UnityStrExpected);
1075 : : 0 : UnityPrintFloat(actual);
1076 [ # # ]: [ t f ]: 0 : if (compare & UNITY_GREATER_THAN) { UnityPrint(UnityStrGt); }
1077 [ # # ]: [ t f ]: 0 : if (compare & UNITY_SMALLER_THAN) { UnityPrint(UnityStrLt); }
1078 [ # # ]: [ t f ]: 0 : if (compare & UNITY_EQUAL_TO) { UnityPrint(UnityStrOrEqual); }
1079 : : 0 : UnityPrintFloat(threshold);
1080 : : 0 : UnityAddMsgIfSpecified(msg);
1081 : : 0 : UNITY_FAIL_AND_BAIL;
1082 : : : }
1083 : : 0 : }
1084 : : :
1085 : : : /*-----------------------------------------------*/
1086 : : 0 : void UnityAssertFloatSpecial(const UNITY_FLOAT actual,
1087 : : : const char* msg,
1088 : : : const UNITY_LINE_TYPE lineNumber,
1089 : : : const UNITY_FLOAT_TRAIT_T style)
1090 : : : {
1091 : : 0 : const char* trait_names[] = {UnityStrInf, UnityStrNegInf, UnityStrNaN, UnityStrDet};
1092 : : 0 : UNITY_INT should_be_trait = ((UNITY_INT)style & 1);
1093 : : 0 : UNITY_INT is_trait = !should_be_trait;
1094 : : 0 : UNITY_INT trait_index = (UNITY_INT)(style >> 1);
1095 : : :
1096 [ # # # # ]:[ t f t f ]: 0 : RETURN_IF_FAIL_OR_IGNORE;
1097 : : :
1098 [ # # # # : : 0 : switch (style)
# ]
1099 : : : {
1100 : : 0 : case UNITY_FLOAT_IS_INF:
1101 : : : case UNITY_FLOAT_IS_NOT_INF:
1102 [ # # # # ]:[ t f t f ]: 0 : is_trait = UNITY_IS_INF(actual) && (actual > 0);
1103 : : 0 : break;
1104 : : 0 : case UNITY_FLOAT_IS_NEG_INF:
1105 : : : case UNITY_FLOAT_IS_NOT_NEG_INF:
1106 [ # # # # ]:[ t f t f ]: 0 : is_trait = UNITY_IS_INF(actual) && (actual < 0);
1107 : : 0 : break;
1108 : : :
1109 : : 0 : case UNITY_FLOAT_IS_NAN:
1110 : : : case UNITY_FLOAT_IS_NOT_NAN:
1111 : : 0 : is_trait = UNITY_IS_NAN(actual) ? 1 : 0;
1112 : : 0 : break;
1113 : : :
1114 : : 0 : case UNITY_FLOAT_IS_DET: /* A determinate number is non infinite and not NaN. */
1115 : : : case UNITY_FLOAT_IS_NOT_DET:
1116 [ # # # # ]:[ t f t f ]: 0 : is_trait = !UNITY_IS_INF(actual) && !UNITY_IS_NAN(actual);
1117 : : 0 : break;
1118 : : :
1119 : : 0 : case UNITY_FLOAT_INVALID_TRAIT: /* Supress warning */
1120 : : : default: /* including UNITY_FLOAT_INVALID_TRAIT */
1121 : : 0 : trait_index = 0;
1122 : : 0 : trait_names[0] = UnityStrInvalidFloatTrait;
1123 : : 0 : break;
1124 : : : }
1125 : : :
1126 [ # # ]: [ t f ]: 0 : if (is_trait != should_be_trait)
1127 : : : {
1128 : : 0 : UnityTestResultsFailBegin(lineNumber);
1129 : : 0 : UnityPrint(UnityStrExpected);
1130 [ # # ]: [ t f ]: 0 : if (!should_be_trait)
1131 : : : {
1132 : : 0 : UnityPrint(UnityStrNot);
1133 : : : }
1134 : : 0 : UnityPrint(trait_names[trait_index]);
1135 : : 0 : UnityPrint(UnityStrWas);
1136 : : : #ifndef UNITY_EXCLUDE_FLOAT_PRINT
1137 : : 0 : UnityPrintFloat((UNITY_DOUBLE)actual);
1138 : : : #else
1139 : : : if (should_be_trait)
1140 : : : {
1141 : : : UnityPrint(UnityStrNot);
1142 : : : }
1143 : : : UnityPrint(trait_names[trait_index]);
1144 : : : #endif
1145 : : 0 : UnityAddMsgIfSpecified(msg);
1146 : : 0 : UNITY_FAIL_AND_BAIL;
1147 : : : }
1148 : : 0 : }
1149 : : :
1150 : : : #endif /* not UNITY_EXCLUDE_FLOAT */
1151 : : :
1152 : : : /*-----------------------------------------------*/
1153 : : : #ifndef UNITY_EXCLUDE_DOUBLE
1154 : : 0 : static int UnityDoublesWithin(UNITY_DOUBLE delta, UNITY_DOUBLE expected, UNITY_DOUBLE actual)
1155 : : : {
1156 : : : UNITY_DOUBLE diff;
1157 [ # # # # : [ t f ]: 0 : UNITY_FLOAT_OR_DOUBLE_WITHIN(delta, expected, actual, diff);
# # # # # [ t f t f ]
# # # # # [ t f t f
# # # # # t f ]
# ]
1158 : : : }
1159 : : :
1160 : : : /*-----------------------------------------------*/
1161 : : 0 : void UnityAssertWithinDoubleArray(const UNITY_DOUBLE delta,
1162 : : : UNITY_PTR_ATTRIBUTE const UNITY_DOUBLE* expected,
1163 : : : UNITY_PTR_ATTRIBUTE const UNITY_DOUBLE* actual,
1164 : : : const UNITY_UINT32 num_elements,
1165 : : : const char* msg,
1166 : : : const UNITY_LINE_TYPE lineNumber,
1167 : : : const UNITY_FLAGS_T flags)
1168 : : : {
1169 : : 0 : UNITY_UINT32 elements = num_elements;
1170 : : 0 : UNITY_PTR_ATTRIBUTE const UNITY_DOUBLE* ptr_expected = expected;
1171 : : 0 : UNITY_PTR_ATTRIBUTE const UNITY_DOUBLE* ptr_actual = actual;
1172 : : 0 : UNITY_DOUBLE in_delta = delta;
1173 : : 0 : UNITY_DOUBLE current_element_delta = delta;
1174 : : :
1175 [ # # # # ]:[ t f t f ]: 0 : RETURN_IF_FAIL_OR_IGNORE;
1176 : : :
1177 [ # # ]: [ t f ]: 0 : if (elements == 0)
1178 : : : {
1179 : : : #ifdef UNITY_COMPARE_PTRS_ON_ZERO_ARRAY
1180 : : : UNITY_TEST_ASSERT_EQUAL_PTR(expected, actual, lineNumber, msg);
1181 : : : #else
1182 : : 0 : UnityPrintPointlessAndBail();
1183 : : : #endif
1184 : : : }
1185 : : :
1186 [ # # ]: [ t f ]: 0 : if (UNITY_IS_INF(in_delta))
1187 : : : {
1188 : : 0 : return; /* Arrays will be force equal with infinite delta */
1189 : : : }
1190 : : :
1191 [ # # ]: [ t f ]: 0 : if (UNITY_IS_NAN(in_delta))
1192 : : : {
1193 : : : /* Delta must be correct number */
1194 : : 0 : UnityPrintPointlessAndBail();
1195 : : : }
1196 : : :
1197 [ # # ]: [ t f ]: 0 : if (expected == actual)
1198 : : : {
1199 : : 0 : return; /* Both are NULL or same pointer */
1200 : : : }
1201 : : :
1202 [ # # ]: [ t f ]: 0 : if (UnityIsOneArrayNull((UNITY_INTERNAL_PTR)expected, (UNITY_INTERNAL_PTR)actual, lineNumber, msg))
1203 : : : {
1204 : : 0 : UNITY_FAIL_AND_BAIL;
1205 : : : }
1206 : : :
1207 : : : /* fix delta sign if need */
1208 [ # # ]: [ t f ]: 0 : if (in_delta < 0)
1209 : : : {
1210 : : 0 : in_delta = -in_delta;
1211 : : : }
1212 : : :
1213 [ # # ]: [ t f ]: 0 : while (elements--)
1214 : : : {
1215 : : 0 : current_element_delta = *ptr_expected * UNITY_DOUBLE_PRECISION;
1216 : : :
1217 [ # # ]: [ t f ]: 0 : if (current_element_delta < 0)
1218 : : : {
1219 : : : /* fix delta sign for correct calculations */
1220 : : 0 : current_element_delta = -current_element_delta;
1221 : : : }
1222 : : :
1223 [ # # ]: [ t f ]: 0 : if (!UnityDoublesWithin(in_delta + current_element_delta, *ptr_expected, *ptr_actual))
1224 : : : {
1225 : : 0 : UnityTestResultsFailBegin(lineNumber);
1226 : : 0 : UnityPrint(UnityStrElement);
1227 : : 0 : UnityPrintNumberUnsigned(num_elements - elements - 1);
1228 : : 0 : UNITY_PRINT_EXPECTED_AND_ACTUAL_FLOAT(*ptr_expected, *ptr_actual);
1229 : : 0 : UnityAddMsgIfSpecified(msg);
1230 : : 0 : UNITY_FAIL_AND_BAIL;
1231 : : : }
1232 [ # # ]: [ t f ]: 0 : if (flags == UNITY_ARRAY_TO_ARRAY)
1233 : : : {
1234 : : 0 : ptr_expected++;
1235 : : : }
1236 : : 0 : ptr_actual++;
1237 : : : }
1238 : : : }
1239 : : :
1240 : : : /*-----------------------------------------------*/
1241 : : 0 : void UnityAssertDoublesWithin(const UNITY_DOUBLE delta,
1242 : : : const UNITY_DOUBLE expected,
1243 : : : const UNITY_DOUBLE actual,
1244 : : : const char* msg,
1245 : : : const UNITY_LINE_TYPE lineNumber)
1246 : : : {
1247 [ # # # # ]:[ t f t f ]: 0 : RETURN_IF_FAIL_OR_IGNORE;
1248 : : :
1249 [ # # ]: [ t f ]: 0 : if (!UnityDoublesWithin(delta, expected, actual))
1250 : : : {
1251 : : 0 : UnityTestResultsFailBegin(lineNumber);
1252 : : 0 : UNITY_PRINT_EXPECTED_AND_ACTUAL_FLOAT(expected, actual);
1253 : : 0 : UnityAddMsgIfSpecified(msg);
1254 : : 0 : UNITY_FAIL_AND_BAIL;
1255 : : : }
1256 : : 0 : }
1257 : : :
1258 : : : /*-----------------------------------------------*/
1259 : : 0 : void UnityAssertDoublesNotWithin(const UNITY_DOUBLE delta,
1260 : : : const UNITY_DOUBLE expected,
1261 : : : const UNITY_DOUBLE actual,
1262 : : : const char* msg,
1263 : : : const UNITY_LINE_TYPE lineNumber)
1264 : : : {
1265 [ # # # # ]:[ t f t f ]: 0 : RETURN_IF_FAIL_OR_IGNORE;
1266 : : :
1267 [ # # ]: [ t f ]: 0 : if (UnityDoublesWithin(delta, expected, actual))
1268 : : : {
1269 : : 0 : UnityTestResultsFailBegin(lineNumber);
1270 : : 0 : UnityPrint(UnityStrExpected);
1271 : : 0 : UnityPrintFloat((UNITY_DOUBLE)expected);
1272 : : 0 : UnityPrint(UnityStrNotEqual);
1273 : : 0 : UnityPrintFloat((UNITY_DOUBLE)actual);
1274 : : 0 : UnityAddMsgIfSpecified(msg);
1275 : : 0 : UNITY_FAIL_AND_BAIL;
1276 : : : }
1277 : : 0 : }
1278 : : :
1279 : : : /*-----------------------------------------------*/
1280 : : 0 : void UnityAssertGreaterOrLessDouble(const UNITY_DOUBLE threshold,
1281 : : : const UNITY_DOUBLE actual,
1282 : : : const UNITY_COMPARISON_T compare,
1283 : : : const char* msg,
1284 : : : const UNITY_LINE_TYPE lineNumber)
1285 : : : {
1286 : : : int failed;
1287 : : :
1288 [ # # # # ]:[ t f t f ]: 0 : RETURN_IF_FAIL_OR_IGNORE;
1289 : : :
1290 : : 0 : failed = 0;
1291 : : :
1292 : : : /* Checking for "not success" rather than failure to get the right result for NaN */
1293 [ # # # # ]:[ t f t f ]: 0 : if (!(actual < threshold) && (compare & UNITY_SMALLER_THAN)) { failed = 1; }
1294 [ # # # # ]:[ t f t f ]: 0 : if (!(actual > threshold) && (compare & UNITY_GREATER_THAN)) { failed = 1; }
1295 : : :
1296 [ # # # # ]:[ t f t f ]: 0 : if ((compare & UNITY_EQUAL_TO) && UnityDoublesWithin(threshold * UNITY_DOUBLE_PRECISION, threshold, actual)) { failed = 0; }
1297 : : :
1298 [ # # ]: [ t f ]: 0 : if (failed)
1299 : : : {
1300 : : 0 : UnityTestResultsFailBegin(lineNumber);
1301 : : 0 : UnityPrint(UnityStrExpected);
1302 : : 0 : UnityPrintFloat(actual);
1303 [ # # ]: [ t f ]: 0 : if (compare & UNITY_GREATER_THAN) { UnityPrint(UnityStrGt); }
1304 [ # # ]: [ t f ]: 0 : if (compare & UNITY_SMALLER_THAN) { UnityPrint(UnityStrLt); }
1305 [ # # ]: [ t f ]: 0 : if (compare & UNITY_EQUAL_TO) { UnityPrint(UnityStrOrEqual); }
1306 : : 0 : UnityPrintFloat(threshold);
1307 : : 0 : UnityAddMsgIfSpecified(msg);
1308 : : 0 : UNITY_FAIL_AND_BAIL;
1309 : : : }
1310 : : 0 : }
1311 : : :
1312 : : : /*-----------------------------------------------*/
1313 : : 0 : void UnityAssertDoubleSpecial(const UNITY_DOUBLE actual,
1314 : : : const char* msg,
1315 : : : const UNITY_LINE_TYPE lineNumber,
1316 : : : const UNITY_FLOAT_TRAIT_T style)
1317 : : : {
1318 : : 0 : const char* trait_names[] = {UnityStrInf, UnityStrNegInf, UnityStrNaN, UnityStrDet};
1319 : : 0 : UNITY_INT should_be_trait = ((UNITY_INT)style & 1);
1320 : : 0 : UNITY_INT is_trait = !should_be_trait;
1321 : : 0 : UNITY_INT trait_index = (UNITY_INT)(style >> 1);
1322 : : :
1323 [ # # # # ]:[ t f t f ]: 0 : RETURN_IF_FAIL_OR_IGNORE;
1324 : : :
1325 [ # # # # : : 0 : switch (style)
# ]
1326 : : : {
1327 : : 0 : case UNITY_FLOAT_IS_INF:
1328 : : : case UNITY_FLOAT_IS_NOT_INF:
1329 [ # # # # ]:[ t f t f ]: 0 : is_trait = UNITY_IS_INF(actual) && (actual > 0);
1330 : : 0 : break;
1331 : : 0 : case UNITY_FLOAT_IS_NEG_INF:
1332 : : : case UNITY_FLOAT_IS_NOT_NEG_INF:
1333 [ # # # # ]:[ t f t f ]: 0 : is_trait = UNITY_IS_INF(actual) && (actual < 0);
1334 : : 0 : break;
1335 : : :
1336 : : 0 : case UNITY_FLOAT_IS_NAN:
1337 : : : case UNITY_FLOAT_IS_NOT_NAN:
1338 : : 0 : is_trait = UNITY_IS_NAN(actual) ? 1 : 0;
1339 : : 0 : break;
1340 : : :
1341 : : 0 : case UNITY_FLOAT_IS_DET: /* A determinate number is non infinite and not NaN. */
1342 : : : case UNITY_FLOAT_IS_NOT_DET:
1343 [ # # # # ]:[ t f t f ]: 0 : is_trait = !UNITY_IS_INF(actual) && !UNITY_IS_NAN(actual);
1344 : : 0 : break;
1345 : : :
1346 : : 0 : case UNITY_FLOAT_INVALID_TRAIT: /* Supress warning */
1347 : : : default: /* including UNITY_FLOAT_INVALID_TRAIT */
1348 : : 0 : trait_index = 0;
1349 : : 0 : trait_names[0] = UnityStrInvalidFloatTrait;
1350 : : 0 : break;
1351 : : : }
1352 : : :
1353 [ # # ]: [ t f ]: 0 : if (is_trait != should_be_trait)
1354 : : : {
1355 : : 0 : UnityTestResultsFailBegin(lineNumber);
1356 : : 0 : UnityPrint(UnityStrExpected);
1357 [ # # ]: [ t f ]: 0 : if (!should_be_trait)
1358 : : : {
1359 : : 0 : UnityPrint(UnityStrNot);
1360 : : : }
1361 : : 0 : UnityPrint(trait_names[trait_index]);
1362 : : 0 : UnityPrint(UnityStrWas);
1363 : : : #ifndef UNITY_EXCLUDE_FLOAT_PRINT
1364 : : 0 : UnityPrintFloat(actual);
1365 : : : #else
1366 : : : if (should_be_trait)
1367 : : : {
1368 : : : UnityPrint(UnityStrNot);
1369 : : : }
1370 : : : UnityPrint(trait_names[trait_index]);
1371 : : : #endif
1372 : : 0 : UnityAddMsgIfSpecified(msg);
1373 : : 0 : UNITY_FAIL_AND_BAIL;
1374 : : : }
1375 : : 0 : }
1376 : : :
1377 : : : #endif /* not UNITY_EXCLUDE_DOUBLE */
1378 : : :
1379 : : : /*-----------------------------------------------*/
1380 : : 0 : void UnityAssertNumbersWithin(const UNITY_UINT delta,
1381 : : : const UNITY_INT expected,
1382 : : : const UNITY_INT actual,
1383 : : : const char* msg,
1384 : : : const UNITY_LINE_TYPE lineNumber,
1385 : : : const UNITY_DISPLAY_STYLE_T style)
1386 : : : {
1387 [ # # # # ]:[ t f t f ]: 0 : RETURN_IF_FAIL_OR_IGNORE;
1388 : : :
1389 [ # # ]: [ t f ]: 0 : if ((style & UNITY_DISPLAY_RANGE_INT) == UNITY_DISPLAY_RANGE_INT)
1390 : : : {
1391 [ # # ]: [ t f ]: 0 : if (actual > expected)
1392 : : : {
1393 : : 0 : Unity.CurrentTestFailed = (((UNITY_UINT)actual - (UNITY_UINT)expected) > delta);
1394 : : : }
1395 : : : else
1396 : : : {
1397 : : 0 : Unity.CurrentTestFailed = (((UNITY_UINT)expected - (UNITY_UINT)actual) > delta);
1398 : : : }
1399 : : : }
1400 : : : else
1401 : : : {
1402 [ # # ]: [ t f ]: 0 : if ((UNITY_UINT)actual > (UNITY_UINT)expected)
1403 : : : {
1404 : : 0 : Unity.CurrentTestFailed = (((UNITY_UINT)actual - (UNITY_UINT)expected) > delta);
1405 : : : }
1406 : : : else
1407 : : : {
1408 : : 0 : Unity.CurrentTestFailed = (((UNITY_UINT)expected - (UNITY_UINT)actual) > delta);
1409 : : : }
1410 : : : }
1411 : : :
1412 [ # # ]: [ t f ]: 0 : if (Unity.CurrentTestFailed)
1413 : : : {
1414 : : 0 : UnityTestResultsFailBegin(lineNumber);
1415 : : 0 : UnityPrint(UnityStrDelta);
1416 : : 0 : UnityPrintNumberByStyle((UNITY_INT)delta, style);
1417 : : 0 : UnityPrint(UnityStrExpected);
1418 : : 0 : UnityPrintNumberByStyle(expected, style);
1419 : : 0 : UnityPrint(UnityStrWas);
1420 : : 0 : UnityPrintNumberByStyle(actual, style);
1421 : : 0 : UnityAddMsgIfSpecified(msg);
1422 : : 0 : UNITY_FAIL_AND_BAIL;
1423 : : : }
1424 : : 0 : }
1425 : : :
1426 : : : /*-----------------------------------------------*/
1427 : : 0 : void UnityAssertNumbersArrayWithin(const UNITY_UINT delta,
1428 : : : UNITY_INTERNAL_PTR expected,
1429 : : : UNITY_INTERNAL_PTR actual,
1430 : : : const UNITY_UINT32 num_elements,
1431 : : : const char* msg,
1432 : : : const UNITY_LINE_TYPE lineNumber,
1433 : : : const UNITY_DISPLAY_STYLE_T style,
1434 : : : const UNITY_FLAGS_T flags)
1435 : : : {
1436 : : 0 : UNITY_UINT32 elements = num_elements;
1437 : : 0 : unsigned int length = style & 0xF;
1438 : : 0 : unsigned int increment = 0;
1439 : : :
1440 [ # # # # ]:[ t f t f ]: 0 : RETURN_IF_FAIL_OR_IGNORE;
1441 : : :
1442 [ # # ]: [ t f ]: 0 : if (num_elements == 0)
1443 : : : {
1444 : : : #ifdef UNITY_COMPARE_PTRS_ON_ZERO_ARRAY
1445 : : : UNITY_TEST_ASSERT_EQUAL_PTR(expected, actual, lineNumber, msg);
1446 : : : #else
1447 : : 0 : UnityPrintPointlessAndBail();
1448 : : : #endif
1449 : : : }
1450 : : :
1451 [ # # ]: [ t f ]: 0 : if (expected == actual)
1452 : : : {
1453 : : 0 : return; /* Both are NULL or same pointer */
1454 : : : }
1455 : : :
1456 [ # # ]: [ t f ]: 0 : if (UnityIsOneArrayNull(expected, actual, lineNumber, msg))
1457 : : : {
1458 : : 0 : UNITY_FAIL_AND_BAIL;
1459 : : : }
1460 : : :
1461 [ # # # # ]:[ t f t f ]: 0 : while ((elements > 0) && (elements--))
1462 : : : {
1463 : : : UNITY_INT expect_val;
1464 : : : UNITY_INT actual_val;
1465 : : :
1466 [ # # # # ]: : 0 : switch (length)
1467 : : : {
1468 : : 0 : case 1:
1469 : : : /* fixing problems with signed overflow on unsigned numbers */
1470 [ # # ]: [ t f ]: 0 : if ((style & UNITY_DISPLAY_RANGE_INT) == UNITY_DISPLAY_RANGE_INT)
1471 : : : {
1472 : : 0 : expect_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT8*)expected;
1473 : : 0 : actual_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT8*)actual;
1474 : : 0 : increment = sizeof(UNITY_INT8);
1475 : : : }
1476 : : : else
1477 : : : {
1478 : : 0 : expect_val = (UNITY_INT)*(UNITY_PTR_ATTRIBUTE const UNITY_UINT8*)expected;
1479 : : 0 : actual_val = (UNITY_INT)*(UNITY_PTR_ATTRIBUTE const UNITY_UINT8*)actual;
1480 : : 0 : increment = sizeof(UNITY_UINT8);
1481 : : : }
1482 : : 0 : break;
1483 : : :
1484 : : 0 : case 2:
1485 : : : /* fixing problems with signed overflow on unsigned numbers */
1486 [ # # ]: [ t f ]: 0 : if ((style & UNITY_DISPLAY_RANGE_INT) == UNITY_DISPLAY_RANGE_INT)
1487 : : : {
1488 : : 0 : expect_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT16*)expected;
1489 : : 0 : actual_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT16*)actual;
1490 : : 0 : increment = sizeof(UNITY_INT16);
1491 : : : }
1492 : : : else
1493 : : : {
1494 : : 0 : expect_val = (UNITY_INT)*(UNITY_PTR_ATTRIBUTE const UNITY_UINT16*)expected;
1495 : : 0 : actual_val = (UNITY_INT)*(UNITY_PTR_ATTRIBUTE const UNITY_UINT16*)actual;
1496 : : 0 : increment = sizeof(UNITY_UINT16);
1497 : : : }
1498 : : 0 : break;
1499 : : :
1500 : : : #ifdef UNITY_SUPPORT_64
1501 : : 0 : case 8:
1502 : : : /* fixing problems with signed overflow on unsigned numbers */
1503 [ # # ]: [ t f ]: 0 : if ((style & UNITY_DISPLAY_RANGE_INT) == UNITY_DISPLAY_RANGE_INT)
1504 : : : {
1505 : : 0 : expect_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT64*)expected;
1506 : : 0 : actual_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT64*)actual;
1507 : : 0 : increment = sizeof(UNITY_INT64);
1508 : : : }
1509 : : : else
1510 : : : {
1511 : : 0 : expect_val = (UNITY_INT)*(UNITY_PTR_ATTRIBUTE const UNITY_UINT64*)expected;
1512 : : 0 : actual_val = (UNITY_INT)*(UNITY_PTR_ATTRIBUTE const UNITY_UINT64*)actual;
1513 : : 0 : increment = sizeof(UNITY_UINT64);
1514 : : : }
1515 : : 0 : break;
1516 : : : #endif
1517 : : :
1518 : : 0 : default: /* default is length 4 bytes */
1519 : : : case 4:
1520 : : : /* fixing problems with signed overflow on unsigned numbers */
1521 [ # # ]: [ t f ]: 0 : if ((style & UNITY_DISPLAY_RANGE_INT) == UNITY_DISPLAY_RANGE_INT)
1522 : : : {
1523 : : 0 : expect_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT32*)expected;
1524 : : 0 : actual_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT32*)actual;
1525 : : 0 : increment = sizeof(UNITY_INT32);
1526 : : : }
1527 : : : else
1528 : : : {
1529 : : 0 : expect_val = (UNITY_INT)*(UNITY_PTR_ATTRIBUTE const UNITY_UINT32*)expected;
1530 : : 0 : actual_val = (UNITY_INT)*(UNITY_PTR_ATTRIBUTE const UNITY_UINT32*)actual;
1531 : : 0 : increment = sizeof(UNITY_UINT32);
1532 : : : }
1533 : : 0 : length = 4;
1534 : : 0 : break;
1535 : : : }
1536 : : :
1537 [ # # ]: [ t f ]: 0 : if ((style & UNITY_DISPLAY_RANGE_INT) == UNITY_DISPLAY_RANGE_INT)
1538 : : : {
1539 [ # # ]: [ t f ]: 0 : if (actual_val > expect_val)
1540 : : : {
1541 : : 0 : Unity.CurrentTestFailed = (((UNITY_UINT)actual_val - (UNITY_UINT)expect_val) > delta);
1542 : : : }
1543 : : : else
1544 : : : {
1545 : : 0 : Unity.CurrentTestFailed = (((UNITY_UINT)expect_val - (UNITY_UINT)actual_val) > delta);
1546 : : : }
1547 : : : }
1548 : : : else
1549 : : : {
1550 [ # # ]: [ t f ]: 0 : if ((UNITY_UINT)actual_val > (UNITY_UINT)expect_val)
1551 : : : {
1552 : : 0 : Unity.CurrentTestFailed = (((UNITY_UINT)actual_val - (UNITY_UINT)expect_val) > delta);
1553 : : : }
1554 : : : else
1555 : : : {
1556 : : 0 : Unity.CurrentTestFailed = (((UNITY_UINT)expect_val - (UNITY_UINT)actual_val) > delta);
1557 : : : }
1558 : : : }
1559 : : :
1560 [ # # ]: [ t f ]: 0 : if (Unity.CurrentTestFailed)
1561 : : : {
1562 [ # # # # ]:[ t f t f ]: 0 : if ((style & UNITY_DISPLAY_RANGE_UINT) && (length < (UNITY_INT_WIDTH / 8)))
1563 : : : { /* For UINT, remove sign extension (padding 1's) from signed type casts above */
1564 : : 0 : UNITY_INT mask = 1;
1565 : : 0 : mask = (mask << 8 * length) - 1;
1566 : : 0 : expect_val &= mask;
1567 : : 0 : actual_val &= mask;
1568 : : : }
1569 : : 0 : UnityTestResultsFailBegin(lineNumber);
1570 : : 0 : UnityPrint(UnityStrDelta);
1571 : : 0 : UnityPrintNumberByStyle((UNITY_INT)delta, style);
1572 : : 0 : UnityPrint(UnityStrElement);
1573 : : 0 : UnityPrintNumberUnsigned(num_elements - elements - 1);
1574 : : 0 : UnityPrint(UnityStrExpected);
1575 : : 0 : UnityPrintNumberByStyle(expect_val, style);
1576 : : 0 : UnityPrint(UnityStrWas);
1577 : : 0 : UnityPrintNumberByStyle(actual_val, style);
1578 : : 0 : UnityAddMsgIfSpecified(msg);
1579 : : 0 : UNITY_FAIL_AND_BAIL;
1580 : : : }
1581 : : : /* Walk through array by incrementing the pointers */
1582 [ # # ]: [ t f ]: 0 : if (flags == UNITY_ARRAY_TO_ARRAY)
1583 : : : {
1584 : : 0 : expected = (UNITY_INTERNAL_PTR)((const char*)expected + increment);
1585 : : : }
1586 : : 0 : actual = (UNITY_INTERNAL_PTR)((const char*)actual + increment);
1587 : : : }
1588 : : : }
1589 : : :
1590 : : : /*-----------------------------------------------*/
1591 : : 1 : void UnityAssertEqualString(const char* expected,
1592 : : : const char* actual,
1593 : : : const char* msg,
1594 : : : const UNITY_LINE_TYPE lineNumber)
1595 : : : {
1596 : : : UNITY_UINT32 i;
1597 : : :
1598 [ + - - + ]:[ t F t F ]: 1 : RETURN_IF_FAIL_OR_IGNORE;
1599 : : :
1600 : : : /* if both pointers not null compare the strings */
1601 [ + - + - ]:[ T f T f ]: 1 : if (expected && actual)
1602 : : : {
1603 [ + + - + ]:[ T F t F ]: 20 : for (i = 0; expected[i] || actual[i]; i++)
1604 : : : {
1605 [ - + ]: [ t F ]: 19 : if (expected[i] != actual[i])
1606 : : : {
1607 : : 0 : Unity.CurrentTestFailed = 1;
1608 : : 0 : break;
1609 : : : }
1610 : : : }
1611 : : : }
1612 : : : else
1613 : : : { /* fail if either null but not if both */
1614 [ # # # # ]:[ t f t f ]: 0 : if (expected || actual)
1615 : : : {
1616 : : 0 : Unity.CurrentTestFailed = 1;
1617 : : : }
1618 : : : }
1619 : : :
1620 [ - + ]: [ t F ]: 1 : if (Unity.CurrentTestFailed)
1621 : : : {
1622 : : 0 : UnityTestResultsFailBegin(lineNumber);
1623 : : 0 : UnityPrintExpectedAndActualStrings(expected, actual);
1624 : : 0 : UnityAddMsgIfSpecified(msg);
1625 : : 0 : UNITY_FAIL_AND_BAIL;
1626 : : : }
1627 : : 1 : }
1628 : : :
1629 : : : /*-----------------------------------------------*/
1630 : : 0 : void UnityAssertEqualStringLen(const char* expected,
1631 : : : const char* actual,
1632 : : : const UNITY_UINT32 length,
1633 : : : const char* msg,
1634 : : : const UNITY_LINE_TYPE lineNumber)
1635 : : : {
1636 : : : UNITY_UINT32 i;
1637 : : :
1638 [ # # # # ]:[ t f t f ]: 0 : RETURN_IF_FAIL_OR_IGNORE;
1639 : : :
1640 : : : /* if both pointers not null compare the strings */
1641 [ # # # # ]:[ t f t f ]: 0 : if (expected && actual)
1642 : : : {
1643 [ # # # # :[ t f t f : 0 : for (i = 0; (i < length) && (expected[i] || actual[i]); i++)
# # ] t f ]
1644 : : : {
1645 [ # # ]: [ t f ]: 0 : if (expected[i] != actual[i])
1646 : : : {
1647 : : 0 : Unity.CurrentTestFailed = 1;
1648 : : 0 : break;
1649 : : : }
1650 : : : }
1651 : : : }
1652 : : : else
1653 : : : { /* fail if either null but not if both */
1654 [ # # # # ]:[ t f t f ]: 0 : if (expected || actual)
1655 : : : {
1656 : : 0 : Unity.CurrentTestFailed = 1;
1657 : : : }
1658 : : : }
1659 : : :
1660 [ # # ]: [ t f ]: 0 : if (Unity.CurrentTestFailed)
1661 : : : {
1662 : : 0 : UnityTestResultsFailBegin(lineNumber);
1663 : : 0 : UnityPrintExpectedAndActualStringsLen(expected, actual, length);
1664 : : 0 : UnityAddMsgIfSpecified(msg);
1665 : : 0 : UNITY_FAIL_AND_BAIL;
1666 : : : }
1667 : : 0 : }
1668 : : :
1669 : : : /*-----------------------------------------------*/
1670 : : 0 : void UnityAssertEqualStringArray(UNITY_INTERNAL_PTR expected,
1671 : : : const char** actual,
1672 : : : const UNITY_UINT32 num_elements,
1673 : : : const char* msg,
1674 : : : const UNITY_LINE_TYPE lineNumber,
1675 : : : const UNITY_FLAGS_T flags)
1676 : : : {
1677 : : 0 : UNITY_UINT32 i = 0;
1678 : : 0 : UNITY_UINT32 j = 0;
1679 : : 0 : const char* expd = NULL;
1680 : : 0 : const char* act = NULL;
1681 : : :
1682 [ # # # # ]:[ t f t f ]: 0 : RETURN_IF_FAIL_OR_IGNORE;
1683 : : :
1684 : : : /* if no elements, it's an error */
1685 [ # # ]: [ t f ]: 0 : if (num_elements == 0)
1686 : : : {
1687 : : : #ifdef UNITY_COMPARE_PTRS_ON_ZERO_ARRAY
1688 : : : UNITY_TEST_ASSERT_EQUAL_PTR(expected, actual, lineNumber, msg);
1689 : : : #else
1690 : : 0 : UnityPrintPointlessAndBail();
1691 : : : #endif
1692 : : : }
1693 : : :
1694 [ # # ]: [ t f ]: 0 : if ((const void*)expected == (const void*)actual)
1695 : : : {
1696 : : 0 : return; /* Both are NULL or same pointer */
1697 : : : }
1698 : : :
1699 [ # # ]: [ t f ]: 0 : if (UnityIsOneArrayNull((UNITY_INTERNAL_PTR)expected, (UNITY_INTERNAL_PTR)actual, lineNumber, msg))
1700 : : : {
1701 : : 0 : UNITY_FAIL_AND_BAIL;
1702 : : : }
1703 : : :
1704 [ # # ]: [ t f ]: 0 : if (flags != UNITY_ARRAY_TO_ARRAY)
1705 : : : {
1706 : : 0 : expd = (const char*)expected;
1707 : : : }
1708 : : :
1709 : : : do
1710 : : : {
1711 : : 0 : act = actual[j];
1712 [ # # ]: [ t f ]: 0 : if (flags == UNITY_ARRAY_TO_ARRAY)
1713 : : : {
1714 : : 0 : expd = ((const char* const*)expected)[j];
1715 : : : }
1716 : : :
1717 : : : /* if both pointers not null compare the strings */
1718 [ # # # # ]:[ t f t f ]: 0 : if (expd && act)
1719 : : : {
1720 [ # # # # ]:[ t f t f ]: 0 : for (i = 0; expd[i] || act[i]; i++)
1721 : : : {
1722 [ # # ]: [ t f ]: 0 : if (expd[i] != act[i])
1723 : : : {
1724 : : 0 : Unity.CurrentTestFailed = 1;
1725 : : 0 : break;
1726 : : : }
1727 : : : }
1728 : : : }
1729 : : : else
1730 : : : { /* handle case of one pointers being null (if both null, test should pass) */
1731 [ # # ]: [ t f ]: 0 : if (expd != act)
1732 : : : {
1733 : : 0 : Unity.CurrentTestFailed = 1;
1734 : : : }
1735 : : : }
1736 : : :
1737 [ # # ]: [ t f ]: 0 : if (Unity.CurrentTestFailed)
1738 : : : {
1739 : : 0 : UnityTestResultsFailBegin(lineNumber);
1740 [ # # ]: [ t f ]: 0 : if (num_elements > 1)
1741 : : : {
1742 : : 0 : UnityPrint(UnityStrElement);
1743 : : 0 : UnityPrintNumberUnsigned(j);
1744 : : : }
1745 : : 0 : UnityPrintExpectedAndActualStrings(expd, act);
1746 : : 0 : UnityAddMsgIfSpecified(msg);
1747 : : 0 : UNITY_FAIL_AND_BAIL;
1748 : : : }
1749 [ # # ]: [ t f ]: 0 : } while (++j < num_elements);
1750 : : : }
1751 : : :
1752 : : : /*-----------------------------------------------*/
1753 : : 0 : void UnityAssertEqualMemory(UNITY_INTERNAL_PTR expected,
1754 : : : UNITY_INTERNAL_PTR actual,
1755 : : : const UNITY_UINT32 length,
1756 : : : const UNITY_UINT32 num_elements,
1757 : : : const char* msg,
1758 : : : const UNITY_LINE_TYPE lineNumber,
1759 : : : const UNITY_FLAGS_T flags)
1760 : : : {
1761 : : 0 : UNITY_PTR_ATTRIBUTE const unsigned char* ptr_exp = (UNITY_PTR_ATTRIBUTE const unsigned char*)expected;
1762 : : 0 : UNITY_PTR_ATTRIBUTE const unsigned char* ptr_act = (UNITY_PTR_ATTRIBUTE const unsigned char*)actual;
1763 : : 0 : UNITY_UINT32 elements = num_elements;
1764 : : : UNITY_UINT32 bytes;
1765 : : :
1766 [ # # # # ]:[ t f t f ]: 0 : RETURN_IF_FAIL_OR_IGNORE;
1767 : : :
1768 [ # # ]: [ t f ]: 0 : if (elements == 0)
1769 : : : {
1770 : : : #ifdef UNITY_COMPARE_PTRS_ON_ZERO_ARRAY
1771 : : : UNITY_TEST_ASSERT_EQUAL_PTR(expected, actual, lineNumber, msg);
1772 : : : #else
1773 : : 0 : UnityPrintPointlessAndBail();
1774 : : : #endif
1775 : : : }
1776 [ # # ]: [ t f ]: 0 : if (length == 0)
1777 : : : {
1778 : : 0 : UnityPrintPointlessAndBail();
1779 : : : }
1780 : : :
1781 [ # # ]: [ t f ]: 0 : if (expected == actual)
1782 : : : {
1783 : : 0 : return; /* Both are NULL or same pointer */
1784 : : : }
1785 : : :
1786 [ # # ]: [ t f ]: 0 : if (UnityIsOneArrayNull(expected, actual, lineNumber, msg))
1787 : : : {
1788 : : 0 : UNITY_FAIL_AND_BAIL;
1789 : : : }
1790 : : :
1791 [ # # ]: [ t f ]: 0 : while (elements--)
1792 : : : {
1793 : : 0 : bytes = length;
1794 [ # # ]: [ t f ]: 0 : while (bytes--)
1795 : : : {
1796 [ # # ]: [ t f ]: 0 : if (*ptr_exp != *ptr_act)
1797 : : : {
1798 : : 0 : UnityTestResultsFailBegin(lineNumber);
1799 : : 0 : UnityPrint(UnityStrMemory);
1800 [ # # ]: [ t f ]: 0 : if (num_elements > 1)
1801 : : : {
1802 : : 0 : UnityPrint(UnityStrElement);
1803 : : 0 : UnityPrintNumberUnsigned(num_elements - elements - 1);
1804 : : : }
1805 : : 0 : UnityPrint(UnityStrByte);
1806 : : 0 : UnityPrintNumberUnsigned(length - bytes - 1);
1807 : : 0 : UnityPrint(UnityStrExpected);
1808 : : 0 : UnityPrintNumberByStyle(*ptr_exp, UNITY_DISPLAY_STYLE_HEX8);
1809 : : 0 : UnityPrint(UnityStrWas);
1810 : : 0 : UnityPrintNumberByStyle(*ptr_act, UNITY_DISPLAY_STYLE_HEX8);
1811 : : 0 : UnityAddMsgIfSpecified(msg);
1812 : : 0 : UNITY_FAIL_AND_BAIL;
1813 : : : }
1814 : : 0 : ptr_exp++;
1815 : : 0 : ptr_act++;
1816 : : : }
1817 [ # # ]: [ t f ]: 0 : if (flags == UNITY_ARRAY_TO_VAL)
1818 : : : {
1819 : : 0 : ptr_exp = (UNITY_PTR_ATTRIBUTE const unsigned char*)expected;
1820 : : : }
1821 : : : }
1822 : : : }
1823 : : :
1824 : : : /*-----------------------------------------------*/
1825 : : :
1826 : : : static union
1827 : : : {
1828 : : : UNITY_INT8 i8;
1829 : : : UNITY_INT16 i16;
1830 : : : UNITY_INT32 i32;
1831 : : : #ifdef UNITY_SUPPORT_64
1832 : : : UNITY_INT64 i64;
1833 : : : #endif
1834 : : : #ifndef UNITY_EXCLUDE_FLOAT
1835 : : : float f;
1836 : : : #endif
1837 : : : #ifndef UNITY_EXCLUDE_DOUBLE
1838 : : : double d;
1839 : : : #endif
1840 : : : } UnityQuickCompare;
1841 : : :
1842 : : 0 : UNITY_INTERNAL_PTR UnityNumToPtr(const UNITY_INT num, const UNITY_UINT8 size)
1843 : : : {
1844 [ # # # # ]: : 0 : switch(size)
1845 : : : {
1846 : : 0 : case 1:
1847 : : 0 : UnityQuickCompare.i8 = (UNITY_INT8)num;
1848 : : 0 : return (UNITY_INTERNAL_PTR)(&UnityQuickCompare.i8);
1849 : : :
1850 : : 0 : case 2:
1851 : : 0 : UnityQuickCompare.i16 = (UNITY_INT16)num;
1852 : : 0 : return (UNITY_INTERNAL_PTR)(&UnityQuickCompare.i16);
1853 : : :
1854 : : : #ifdef UNITY_SUPPORT_64
1855 : : 0 : case 8:
1856 : : 0 : UnityQuickCompare.i64 = (UNITY_INT64)num;
1857 : : 0 : return (UNITY_INTERNAL_PTR)(&UnityQuickCompare.i64);
1858 : : : #endif
1859 : : :
1860 : : 0 : default: /* 4 bytes */
1861 : : 0 : UnityQuickCompare.i32 = (UNITY_INT32)num;
1862 : : 0 : return (UNITY_INTERNAL_PTR)(&UnityQuickCompare.i32);
1863 : : : }
1864 : : : }
1865 : : :
1866 : : : #ifndef UNITY_EXCLUDE_FLOAT
1867 : : : /*-----------------------------------------------*/
1868 : : 0 : UNITY_INTERNAL_PTR UnityFloatToPtr(const float num)
1869 : : : {
1870 : : 0 : UnityQuickCompare.f = num;
1871 : : 0 : return (UNITY_INTERNAL_PTR)(&UnityQuickCompare.f);
1872 : : : }
1873 : : : #endif
1874 : : :
1875 : : : #ifndef UNITY_EXCLUDE_DOUBLE
1876 : : : /*-----------------------------------------------*/
1877 : : 0 : UNITY_INTERNAL_PTR UnityDoubleToPtr(const double num)
1878 : : : {
1879 : : 0 : UnityQuickCompare.d = num;
1880 : : 0 : return (UNITY_INTERNAL_PTR)(&UnityQuickCompare.d);
1881 : : : }
1882 : : : #endif
1883 : : :
1884 : : : #ifdef UNITY_INCLUDE_PRINT_FORMATTED
1885 : : :
1886 : : : /*-----------------------------------------------
1887 : : : * printf length modifier helpers
1888 : : : *-----------------------------------------------*/
1889 : : :
1890 : : : enum UnityLengthModifier {
1891 : : : UNITY_LENGTH_MODIFIER_NONE,
1892 : : : UNITY_LENGTH_MODIFIER_LONG_LONG,
1893 : : : UNITY_LENGTH_MODIFIER_LONG,
1894 : : : };
1895 : : :
1896 : : : #define UNITY_EXTRACT_ARG(NUMBER_T, NUMBER, LENGTH_MOD, VA, ARG_T) \
1897 : : : do { \
1898 : : : switch (LENGTH_MOD) \
1899 : : : { \
1900 : : : case UNITY_LENGTH_MODIFIER_LONG_LONG: \
1901 : : : { \
1902 : : : NUMBER = (NUMBER_T)va_arg(VA, long long ARG_T); \
1903 : : : break; \
1904 : : : } \
1905 : : : case UNITY_LENGTH_MODIFIER_LONG: \
1906 : : : { \
1907 : : : NUMBER = (NUMBER_T)va_arg(VA, long ARG_T); \
1908 : : : break; \
1909 : : : } \
1910 : : : case UNITY_LENGTH_MODIFIER_NONE: \
1911 : : : default: \
1912 : : : { \
1913 : : : NUMBER = (NUMBER_T)va_arg(VA, ARG_T); \
1914 : : : break; \
1915 : : : } \
1916 : : : } \
1917 : : : } while (0)
1918 : : :
1919 : : : static enum UnityLengthModifier UnityLengthModifierGet(const char *pch, int *length)
1920 : : : {
1921 : : : enum UnityLengthModifier length_mod;
1922 : : : switch (pch[0])
1923 : : : {
1924 : : : case 'l':
1925 : : : {
1926 : : : if (pch[1] == 'l')
1927 : : : {
1928 : : : *length = 2;
1929 : : : length_mod = UNITY_LENGTH_MODIFIER_LONG_LONG;
1930 : : : }
1931 : : : else
1932 : : : {
1933 : : : *length = 1;
1934 : : : length_mod = UNITY_LENGTH_MODIFIER_LONG;
1935 : : : }
1936 : : : break;
1937 : : : }
1938 : : : case 'h':
1939 : : : {
1940 : : : // short and char are converted to int
1941 : : : length_mod = UNITY_LENGTH_MODIFIER_NONE;
1942 : : : if (pch[1] == 'h')
1943 : : : {
1944 : : : *length = 2;
1945 : : : }
1946 : : : else
1947 : : : {
1948 : : : *length = 1;
1949 : : : }
1950 : : : break;
1951 : : : }
1952 : : : case 'j':
1953 : : : case 'z':
1954 : : : case 't':
1955 : : : case 'L':
1956 : : : {
1957 : : : // Not supported, but should gobble up the length specifier anyway
1958 : : : length_mod = UNITY_LENGTH_MODIFIER_NONE;
1959 : : : *length = 1;
1960 : : : break;
1961 : : : }
1962 : : : default:
1963 : : : {
1964 : : : length_mod = UNITY_LENGTH_MODIFIER_NONE;
1965 : : : *length = 0;
1966 : : : }
1967 : : : }
1968 : : : return length_mod;
1969 : : : }
1970 : : :
1971 : : : /*-----------------------------------------------
1972 : : : * printf helper function
1973 : : : *-----------------------------------------------*/
1974 : : : static void UnityPrintFVA(const char* format, va_list va)
1975 : : : {
1976 : : : const char* pch = format;
1977 : : : if (pch != NULL)
1978 : : : {
1979 : : : while (*pch)
1980 : : : {
1981 : : : /* format identification character */
1982 : : : if (*pch == '%')
1983 : : : {
1984 : : : pch++;
1985 : : :
1986 : : : if (pch != NULL)
1987 : : : {
1988 : : : int length_mod_size;
1989 : : : enum UnityLengthModifier length_mod = UnityLengthModifierGet(pch, &length_mod_size);
1990 : : : pch += length_mod_size;
1991 : : :
1992 : : : switch (*pch)
1993 : : : {
1994 : : : case 'd':
1995 : : : case 'i':
1996 : : : {
1997 : : : UNITY_INT number;
1998 : : : UNITY_EXTRACT_ARG(UNITY_INT, number, length_mod, va, int);
1999 : : : UnityPrintNumber((UNITY_INT)number);
2000 : : : break;
2001 : : : }
2002 : : : #ifndef UNITY_EXCLUDE_FLOAT_PRINT
2003 : : : case 'f':
2004 : : : case 'g':
2005 : : : {
2006 : : : const double number = va_arg(va, double);
2007 : : : UnityPrintFloat((UNITY_DOUBLE)number);
2008 : : : break;
2009 : : : }
2010 : : : #endif
2011 : : : case 'u':
2012 : : : {
2013 : : : UNITY_UINT number;
2014 : : : UNITY_EXTRACT_ARG(UNITY_UINT, number, length_mod, va, unsigned int);
2015 : : : UnityPrintNumberUnsigned(number);
2016 : : : break;
2017 : : : }
2018 : : : case 'b':
2019 : : : {
2020 : : : UNITY_UINT number;
2021 : : : UNITY_EXTRACT_ARG(UNITY_UINT, number, length_mod, va, unsigned int);
2022 : : : const UNITY_UINT mask = (UNITY_UINT)0 - (UNITY_UINT)1;
2023 : : : UNITY_OUTPUT_CHAR('0');
2024 : : : UNITY_OUTPUT_CHAR('b');
2025 : : : UnityPrintMask(mask, number);
2026 : : : break;
2027 : : : }
2028 : : : case 'x':
2029 : : : case 'X':
2030 : : : {
2031 : : : UNITY_UINT number;
2032 : : : UNITY_EXTRACT_ARG(UNITY_UINT, number, length_mod, va, unsigned int);
2033 : : : UNITY_OUTPUT_CHAR('0');
2034 : : : UNITY_OUTPUT_CHAR('x');
2035 : : : UnityPrintNumberHex(number, UNITY_MAX_NIBBLES);
2036 : : : break;
2037 : : : }
2038 : : : case 'p':
2039 : : : {
2040 : : : UNITY_UINT number;
2041 : : : char nibbles_to_print = 8;
2042 : : : if (UNITY_POINTER_WIDTH == 64)
2043 : : : {
2044 : : : length_mod = UNITY_LENGTH_MODIFIER_LONG_LONG;
2045 : : : nibbles_to_print = 16;
2046 : : : }
2047 : : : UNITY_EXTRACT_ARG(UNITY_UINT, number, length_mod, va, unsigned int);
2048 : : : UNITY_OUTPUT_CHAR('0');
2049 : : : UNITY_OUTPUT_CHAR('x');
2050 : : : UnityPrintNumberHex((UNITY_UINT)number, nibbles_to_print);
2051 : : : break;
2052 : : : }
2053 : : : case 'c':
2054 : : : {
2055 : : : const int ch = va_arg(va, int);
2056 : : : UnityPrintChar((const char *)&ch);
2057 : : : break;
2058 : : : }
2059 : : : case 's':
2060 : : : {
2061 : : : const char * string = va_arg(va, const char *);
2062 : : : UnityPrint(string);
2063 : : : break;
2064 : : : }
2065 : : : case '%':
2066 : : : {
2067 : : : UnityPrintChar(pch);
2068 : : : break;
2069 : : : }
2070 : : : default:
2071 : : : {
2072 : : : /* print the unknown format character */
2073 : : : UNITY_OUTPUT_CHAR('%');
2074 : : : UnityPrintChar(pch);
2075 : : : break;
2076 : : : }
2077 : : : }
2078 : : : }
2079 : : : }
2080 : : : #ifdef UNITY_OUTPUT_COLOR
2081 : : : /* print ANSI escape code */
2082 : : : else if ((*pch == 27) && (*(pch + 1) == '['))
2083 : : : {
2084 : : : pch += UnityPrintAnsiEscapeString(pch);
2085 : : : continue;
2086 : : : }
2087 : : : #endif
2088 : : : else if (*pch == '\n')
2089 : : : {
2090 : : : UNITY_PRINT_EOL();
2091 : : : }
2092 : : : else
2093 : : : {
2094 : : : UnityPrintChar(pch);
2095 : : : }
2096 : : :
2097 : : : pch++;
2098 : : : }
2099 : : : }
2100 : : : }
2101 : : :
2102 : : : void UnityPrintF(const UNITY_LINE_TYPE line, const char* format, ...)
2103 : : : {
2104 : : : UnityTestResultsBegin(Unity.TestFile, line);
2105 : : : UnityPrint("INFO");
2106 : : : if(format != NULL)
2107 : : : {
2108 : : : UnityPrint(": ");
2109 : : : va_list va;
2110 : : : va_start(va, format);
2111 : : : UnityPrintFVA(format, va);
2112 : : : va_end(va);
2113 : : : }
2114 : : : UNITY_PRINT_EOL();
2115 : : : }
2116 : : : #endif /* ! UNITY_INCLUDE_PRINT_FORMATTED */
2117 : : :
2118 : : :
2119 : : : /*-----------------------------------------------
2120 : : : * Control Functions
2121 : : : *-----------------------------------------------*/
2122 : : :
2123 : : : /*-----------------------------------------------*/
2124 : : 1 : void UnityFail(const char* msg, const UNITY_LINE_TYPE line)
2125 : : : {
2126 [ + - - + ]:[ t F t F ]: 1 : RETURN_IF_FAIL_OR_IGNORE;
2127 : : :
2128 : : 1 : UnityTestResultsBegin(Unity.TestFile, line);
2129 : : 1 : UnityPrint(UnityStrFail);
2130 [ + - ]: [ T f ]: 1 : if (msg != NULL)
2131 : : : {
2132 : : 1 : UNITY_OUTPUT_CHAR(':');
2133 : : :
2134 : : : #ifdef UNITY_PRINT_TEST_CONTEXT
2135 : : : UNITY_PRINT_TEST_CONTEXT();
2136 : : : #endif
2137 : : : #ifndef UNITY_EXCLUDE_DETAILS
2138 [ - + ]: [ t F ]: 1 : if (Unity.CurrentDetail1)
2139 : : : {
2140 : : 0 : UnityPrint(UnityStrDetail1Name);
2141 : : 0 : UnityPrint(Unity.CurrentDetail1);
2142 [ # # ]: [ t f ]: 0 : if (Unity.CurrentDetail2)
2143 : : : {
2144 : : 0 : UnityPrint(UnityStrDetail2Name);
2145 : : 0 : UnityPrint(Unity.CurrentDetail2);
2146 : : : }
2147 : : 0 : UnityPrint(UnityStrSpacer);
2148 : : : }
2149 : : : #endif
2150 [ - + ]: [ t F ]: 1 : if (msg[0] != ' ')
2151 : : : {
2152 : : 0 : UNITY_OUTPUT_CHAR(' ');
2153 : : : }
2154 : : 1 : UnityPrint(msg);
2155 : : : }
2156 : : :
2157 : : 1 : UNITY_FAIL_AND_BAIL;
2158 : : : }
2159 : : :
2160 : : : /*-----------------------------------------------*/
2161 : : 1 : void UnityIgnore(const char* msg, const UNITY_LINE_TYPE line)
2162 : : : {
2163 [ + - - + ]:[ t F t F ]: 1 : RETURN_IF_FAIL_OR_IGNORE;
2164 : : :
2165 : : 1 : UnityTestResultsBegin(Unity.TestFile, line);
2166 : : 1 : UnityPrint(UnityStrIgnore);
2167 [ + - ]: [ T f ]: 1 : if (msg != NULL)
2168 : : : {
2169 : : 1 : UNITY_OUTPUT_CHAR(':');
2170 : : 1 : UNITY_OUTPUT_CHAR(' ');
2171 : : 1 : UnityPrint(msg);
2172 : : : }
2173 : : 1 : UNITY_IGNORE_AND_BAIL;
2174 : : : }
2175 : : :
2176 : : : /*-----------------------------------------------*/
2177 : : 0 : void UnityMessage(const char* msg, const UNITY_LINE_TYPE line)
2178 : : : {
2179 : : 0 : UnityTestResultsBegin(Unity.TestFile, line);
2180 : : 0 : UnityPrint("INFO");
2181 [ # # ]: [ t f ]: 0 : if (msg != NULL)
2182 : : : {
2183 : : 0 : UNITY_OUTPUT_CHAR(':');
2184 : : 0 : UNITY_OUTPUT_CHAR(' ');
2185 : : 0 : UnityPrint(msg);
2186 : : : }
2187 : : 0 : UNITY_PRINT_EOL();
2188 : : 0 : }
2189 : : :
2190 : : : /*-----------------------------------------------*/
2191 : : : /* If we have not defined our own test runner, then include our default test runner to make life easier */
2192 : : : #ifndef UNITY_SKIP_DEFAULT_RUNNER
2193 : : 98 : void UnityDefaultTestRun(UnityTestFunction Func, const char* FuncName, const int FuncLineNum)
2194 : : : {
2195 : : 98 : Unity.CurrentTestName = FuncName;
2196 : : 98 : Unity.CurrentTestLineNumber = (UNITY_LINE_TYPE)FuncLineNum;
2197 : : 98 : Unity.NumberOfTests++;
2198 : : 98 : UNITY_CLR_DETAILS();
2199 : : : UNITY_EXEC_TIME_START();
2200 [ + + ]: [ T F ]: 98 : if (TEST_PROTECT())
2201 : : : {
2202 : : 98 : setUp();
2203 : : 98 : Func();
2204 : : : }
2205 [ + - ]: [ T f ]: 98 : if (TEST_PROTECT())
2206 : : : {
2207 : : 98 : tearDown();
2208 : : : }
2209 : : : UNITY_EXEC_TIME_STOP();
2210 : : 98 : UnityConcludeTest();
2211 : : 98 : }
2212 : : : #endif
2213 : : :
2214 : : : /*-----------------------------------------------*/
2215 : : 0 : void UnitySetTestFile(const char* filename)
2216 : : : {
2217 : : 0 : Unity.TestFile = filename;
2218 : : 0 : }
2219 : : :
2220 : : : /*-----------------------------------------------*/
2221 : : 7 : void UnityBegin(const char* filename)
2222 : : : {
2223 : : 7 : Unity.TestFile = filename;
2224 : : 7 : Unity.CurrentTestName = NULL;
2225 : : 7 : Unity.CurrentTestLineNumber = 0;
2226 : : 7 : Unity.NumberOfTests = 0;
2227 : : 7 : Unity.TestFailures = 0;
2228 : : 7 : Unity.TestIgnores = 0;
2229 : : 7 : Unity.CurrentTestFailed = 0;
2230 : : 7 : Unity.CurrentTestIgnored = 0;
2231 : : :
2232 : : 7 : UNITY_CLR_DETAILS();
2233 : : : UNITY_OUTPUT_START();
2234 : : 7 : }
2235 : : :
2236 : : : /*-----------------------------------------------*/
2237 : : 7 : int UnityEnd(void)
2238 : : : {
2239 : : 7 : UNITY_PRINT_EOL();
2240 : : 7 : UnityPrint(UnityStrBreaker);
2241 : : 7 : UNITY_PRINT_EOL();
2242 : : 7 : UnityPrintNumber((UNITY_INT)(Unity.NumberOfTests));
2243 : : 7 : UnityPrint(UnityStrResultsTests);
2244 : : 7 : UnityPrintNumber((UNITY_INT)(Unity.TestFailures));
2245 : : 7 : UnityPrint(UnityStrResultsFailures);
2246 : : 7 : UnityPrintNumber((UNITY_INT)(Unity.TestIgnores));
2247 : : 7 : UnityPrint(UnityStrResultsIgnored);
2248 : : 7 : UNITY_PRINT_EOL();
2249 [ + + ]: [ T F ]: 7 : if (Unity.TestFailures == 0U)
2250 : : : {
2251 : : 6 : UnityPrint(UnityStrOk);
2252 : : : }
2253 : : : else
2254 : : : {
2255 : : 1 : UnityPrint(UnityStrFail);
2256 : : : #ifdef UNITY_DIFFERENTIATE_FINAL_FAIL
2257 : : : UNITY_OUTPUT_CHAR('E'); UNITY_OUTPUT_CHAR('D');
2258 : : : #endif
2259 : : : }
2260 : : 7 : UNITY_PRINT_EOL();
2261 : : : UNITY_FLUSH_CALL();
2262 : : : UNITY_OUTPUT_COMPLETE();
2263 : : 7 : return (int)(Unity.TestFailures);
2264 : : : }
2265 : : :
2266 : : : /*-----------------------------------------------
2267 : : : * Command Line Argument Support
2268 : : : *-----------------------------------------------*/
2269 : : : #ifdef UNITY_USE_COMMAND_LINE_ARGS
2270 : : :
2271 : : : char* UnityOptionIncludeNamed = NULL;
2272 : : : char* UnityOptionExcludeNamed = NULL;
2273 : : : int UnityVerbosity = 1;
2274 : : : int UnityStrictMatch = 0;
2275 : : :
2276 : : : /*-----------------------------------------------*/
2277 : : : int UnityParseOptions(int argc, char** argv)
2278 : : : {
2279 : : : int i;
2280 : : : UnityOptionIncludeNamed = NULL;
2281 : : : UnityOptionExcludeNamed = NULL;
2282 : : : UnityStrictMatch = 0;
2283 : : :
2284 : : : for (i = 1; i < argc; i++)
2285 : : : {
2286 : : : if (argv[i][0] == '-')
2287 : : : {
2288 : : : switch (argv[i][1])
2289 : : : {
2290 : : : case 'l': /* list tests */
2291 : : : return -1;
2292 : : : case 'n': /* include tests with name including this string */
2293 : : : case 'f': /* an alias for -n */
2294 : : : UnityStrictMatch = (argv[i][1] == 'n'); /* strictly match this string if -n */
2295 : : : if (argv[i][2] == '=')
2296 : : : {
2297 : : : UnityOptionIncludeNamed = &argv[i][3];
2298 : : : }
2299 : : : else if (++i < argc)
2300 : : : {
2301 : : : UnityOptionIncludeNamed = argv[i];
2302 : : : }
2303 : : : else
2304 : : : {
2305 : : : UnityPrint("ERROR: No Test String to Include Matches For");
2306 : : : UNITY_PRINT_EOL();
2307 : : : return 1;
2308 : : : }
2309 : : : break;
2310 : : : case 'q': /* quiet */
2311 : : : UnityVerbosity = 0;
2312 : : : break;
2313 : : : case 'v': /* verbose */
2314 : : : UnityVerbosity = 2;
2315 : : : break;
2316 : : : case 'x': /* exclude tests with name including this string */
2317 : : : if (argv[i][2] == '=')
2318 : : : {
2319 : : : UnityOptionExcludeNamed = &argv[i][3];
2320 : : : }
2321 : : : else if (++i < argc)
2322 : : : {
2323 : : : UnityOptionExcludeNamed = argv[i];
2324 : : : }
2325 : : : else
2326 : : : {
2327 : : : UnityPrint("ERROR: No Test String to Exclude Matches For");
2328 : : : UNITY_PRINT_EOL();
2329 : : : return 1;
2330 : : : }
2331 : : : break;
2332 : : : default:
2333 : : : UnityPrint("ERROR: Unknown Option ");
2334 : : : UNITY_OUTPUT_CHAR(argv[i][1]);
2335 : : : UNITY_PRINT_EOL();
2336 : : : /* Now display help */
2337 : : : /* FALLTHRU */
2338 : : : case 'h':
2339 : : : UnityPrint("Options: "); UNITY_PRINT_EOL();
2340 : : : UnityPrint("-l List all tests and exit"); UNITY_PRINT_EOL();
2341 : : : UnityPrint("-f NAME Filter to run only tests whose name includes NAME"); UNITY_PRINT_EOL();
2342 : : : UnityPrint("-n NAME Run only the test named NAME"); UNITY_PRINT_EOL();
2343 : : : UnityPrint("-h show this Help menu"); UNITY_PRINT_EOL();
2344 : : : UnityPrint("-q Quiet/decrease verbosity"); UNITY_PRINT_EOL();
2345 : : : UnityPrint("-v increase Verbosity"); UNITY_PRINT_EOL();
2346 : : : UnityPrint("-x NAME eXclude tests whose name includes NAME"); UNITY_PRINT_EOL();
2347 : : : UNITY_OUTPUT_FLUSH();
2348 : : : return 1;
2349 : : : }
2350 : : : }
2351 : : : }
2352 : : :
2353 : : : return 0;
2354 : : : }
2355 : : :
2356 : : : /*-----------------------------------------------*/
2357 : : : static int IsStringInBiggerString(const char* longstring, const char* shortstring)
2358 : : : {
2359 : : : const char* lptr = longstring;
2360 : : : const char* sptr = shortstring;
2361 : : : const char* lnext = lptr;
2362 : : :
2363 : : : if (*sptr == '*')
2364 : : : {
2365 : : : return UnityStrictMatch ? 0 : 1;
2366 : : : }
2367 : : :
2368 : : : while (*lptr)
2369 : : : {
2370 : : : lnext = lptr + 1;
2371 : : :
2372 : : : /* If they current bytes match, go on to the next bytes */
2373 : : : while (*lptr && *sptr && (*lptr == *sptr))
2374 : : : {
2375 : : : lptr++;
2376 : : : sptr++;
2377 : : :
2378 : : : switch (*sptr)
2379 : : : {
2380 : : : case '*': /* we encountered a wild-card */
2381 : : : return UnityStrictMatch ? 0 : 1;
2382 : : :
2383 : : : case ',': /* we encountered the end of match string */
2384 : : : case '"':
2385 : : : case '\'':
2386 : : : case 0:
2387 : : : return (!UnityStrictMatch || (*lptr == 0)) ? 1 : 0;
2388 : : :
2389 : : : case ':': /* we encountered the end of a partial match */
2390 : : : return 2;
2391 : : :
2392 : : : default:
2393 : : : break;
2394 : : : }
2395 : : : }
2396 : : :
2397 : : : // If we didn't match and we're on strict matching, we already know we failed
2398 : : : if (UnityStrictMatch)
2399 : : : {
2400 : : : return 0;
2401 : : : }
2402 : : :
2403 : : : /* Otherwise we start in the long pointer 1 character further and try again */
2404 : : : lptr = lnext;
2405 : : : sptr = shortstring;
2406 : : : }
2407 : : :
2408 : : : return 0;
2409 : : : }
2410 : : :
2411 : : : /*-----------------------------------------------*/
2412 : : : static int UnityStringArgumentMatches(const char* str)
2413 : : : {
2414 : : : int retval;
2415 : : : const char* ptr1;
2416 : : : const char* ptr2;
2417 : : : const char* ptrf;
2418 : : :
2419 : : : /* Go through the options and get the substrings for matching one at a time */
2420 : : : ptr1 = str;
2421 : : : while (ptr1[0] != 0)
2422 : : : {
2423 : : : if ((ptr1[0] == '"') || (ptr1[0] == '\''))
2424 : : : {
2425 : : : ptr1++;
2426 : : : }
2427 : : :
2428 : : : /* look for the start of the next partial */
2429 : : : ptr2 = ptr1;
2430 : : : ptrf = 0;
2431 : : : do
2432 : : : {
2433 : : : ptr2++;
2434 : : : if ((ptr2[0] == ':') && (ptr2[1] != 0) && (ptr2[0] != '\'') && (ptr2[0] != '"') && (ptr2[0] != ','))
2435 : : : {
2436 : : : ptrf = &ptr2[1];
2437 : : : }
2438 : : : } while ((ptr2[0] != 0) && (ptr2[0] != '\'') && (ptr2[0] != '"') && (ptr2[0] != ','));
2439 : : :
2440 : : : while ((ptr2[0] != 0) && ((ptr2[0] == ':') || (ptr2[0] == '\'') || (ptr2[0] == '"') || (ptr2[0] == ',')))
2441 : : : {
2442 : : : ptr2++;
2443 : : : }
2444 : : :
2445 : : : /* done if complete filename match */
2446 : : : retval = IsStringInBiggerString(Unity.TestFile, ptr1);
2447 : : : if (retval == 1)
2448 : : : {
2449 : : : return retval;
2450 : : : }
2451 : : :
2452 : : : /* done if testname match after filename partial match */
2453 : : : if ((retval == 2) && (ptrf != 0))
2454 : : : {
2455 : : : if (IsStringInBiggerString(Unity.CurrentTestName, ptrf))
2456 : : : {
2457 : : : return 1;
2458 : : : }
2459 : : : }
2460 : : :
2461 : : : /* done if complete testname match */
2462 : : : if (IsStringInBiggerString(Unity.CurrentTestName, ptr1) == 1)
2463 : : : {
2464 : : : return 1;
2465 : : : }
2466 : : :
2467 : : : ptr1 = ptr2;
2468 : : : }
2469 : : :
2470 : : : /* we couldn't find a match for any substrings */
2471 : : : return 0;
2472 : : : }
2473 : : :
2474 : : : /*-----------------------------------------------*/
2475 : : : int UnityTestMatches(void)
2476 : : : {
2477 : : : /* Check if this test name matches the included test pattern */
2478 : : : int retval;
2479 : : : if (UnityOptionIncludeNamed)
2480 : : : {
2481 : : : retval = UnityStringArgumentMatches(UnityOptionIncludeNamed);
2482 : : : }
2483 : : : else
2484 : : : {
2485 : : : retval = 1;
2486 : : : }
2487 : : :
2488 : : : /* Check if this test name matches the excluded test pattern */
2489 : : : if (UnityOptionExcludeNamed)
2490 : : : {
2491 : : : if (UnityStringArgumentMatches(UnityOptionExcludeNamed))
2492 : : : {
2493 : : : retval = 0;
2494 : : : }
2495 : : : }
2496 : : :
2497 : : : return retval;
2498 : : : }
2499 : : :
2500 : : : #endif /* UNITY_USE_COMMAND_LINE_ARGS */
2501 : : : /*-----------------------------------------------*/
|