xref: /freebsd/contrib/ntp/sntp/unity/unity.c (revision 1251590741d28695f233a1798cfc8428e78ff991)
1 /* =========================================================================
2     Unity Project - A Test Framework for C
3     Copyright (c) 2007-14 Mike Karlesky, Mark VanderVoord, Greg Williams
4     [Released under MIT License. Please refer to license.txt for details]
5 ============================================================================ */
6 
7 #include "unity.h"
8 
9 #define UNITY_FAIL_AND_BAIL   { Unity.CurrentTestFailed  = 1; longjmp(Unity.AbortFrame, 1); }
10 #define UNITY_IGNORE_AND_BAIL { Unity.CurrentTestIgnored = 1; longjmp(Unity.AbortFrame, 1); }
11 /// return prematurely if we are already in failure or ignore state
12 #define UNITY_SKIP_EXECUTION  { if ((Unity.CurrentTestFailed != 0) || (Unity.CurrentTestIgnored != 0)) {return;} }
13 #define UNITY_PRINT_EOL       { UNITY_OUTPUT_CHAR('\n'); }
14 
15 struct _Unity Unity;
16 
17 const char UnityStrOk[]                     = "OK";
18 const char UnityStrPass[]                   = "PASS";
19 const char UnityStrFail[]                   = "FAIL";
20 const char UnityStrIgnore[]                 = "IGNORE";
21 const char UnityStrXPASS[]                  = "XPASS";
22 const char UnityStrXFAIL[]                  = "XFAIL";
23 const char UnityStrNull[]                   = "NULL";
24 const char UnityStrSpacer[]                 = ". ";
25 const char UnityStrExpected[]               = " Expected ";
26 const char UnityStrWas[]                    = " Was ";
27 const char UnityStrTo[]                     = " To ";
28 const char UnityStrElement[]                = " Element ";
29 const char UnityStrByte[]                   = " Byte ";
30 const char UnityStrMemory[]                 = " Memory Mismatch.";
31 const char UnityStrDelta[]                  = " Values Not Within Delta ";
32 const char UnityStrPointless[]              = " You Asked Me To Compare Nothing, Which Was Pointless.";
33 const char UnityStrNullPointerForExpected[] = " Expected pointer to be NULL";
34 const char UnityStrNullPointerForActual[]   = " Actual pointer was NULL";
35 const char UnityStrNot[]                    = "Not ";
36 const char UnityStrInf[]                    = "Infinity";
37 const char UnityStrNegInf[]                 = "Negative Infinity";
38 const char UnityStrNaN[]                    = "NaN";
39 const char UnityStrDet[]                    = "Determinate";
40 const char UnityStrErrFloat[]               = "Unity Floating Point Disabled";
41 const char UnityStrErrDouble[]              = "Unity Double Precision Disabled";
42 const char UnityStrErr64[]                  = "Unity 64-bit Support Disabled";
43 const char UnityStrBreaker[]                = "-----------------------";
44 const char UnityStrResultsTests[]           = " Tests: ";
45 const char UnityStrResultsFailures[]        = " Failures ";
46 const char UnityStrResultsIgnored[]         = " Ignored ";
47 const char UnityStrResultsXFAIL[]           = " XFAIL ";
48 const char UnityStrResultsXPASS[]           = " XPASS ";
49 const char UnityStrResultsPass[]            = " PASS ";
50 
51 
52 #ifndef UNITY_EXCLUDE_FLOAT
53 // Dividing by these constants produces +/- infinity.
54 // The rationale is given in UnityAssertFloatIsInf's body.
55 static const _UF f_zero = 0.0f;
56 #ifndef UNITY_EXCLUDE_DOUBLE
57 static const _UD d_zero = 0.0;
58 #endif
59 #endif
60 
61 // compiler-generic print formatting masks
62 const _U_UINT UnitySizeMask[] =
63 {
64     255u,         // 0xFF
65     65535u,       // 0xFFFF
66     65535u,
67     4294967295u,  // 0xFFFFFFFF
68     4294967295u,
69     4294967295u,
70     4294967295u
71 #ifdef UNITY_SUPPORT_64
72     ,0xFFFFFFFFFFFFFFFF
73 #endif
74 };
75 
76 void UnityPrintFail(void);
77 void UnityPrintOk(void);
78 
79 //-----------------------------------------------
80 // Pretty Printers & Test Result Output Handlers
81 //-----------------------------------------------
82 
83 void UnityPrint(const char* string)
84 {
85     const char* pch = string;
86 
87     if (pch != NULL)
88     {
89         while (*pch)
90         {
91             // printable characters plus CR & LF are printed
92             if ((*pch <= 126) && (*pch >= 32))
93             {
94                 UNITY_OUTPUT_CHAR(*pch);
95             }
96             //write escaped carriage returns
97             else if (*pch == 13)
98             {
99                 UNITY_OUTPUT_CHAR('\\');
100                 UNITY_OUTPUT_CHAR('r');
101             }
102             //write escaped line feeds
103             else if (*pch == 10)
104             {
105                 UNITY_OUTPUT_CHAR('\\');
106                 UNITY_OUTPUT_CHAR('n');
107             }
108             // unprintable characters are shown as codes
109             else
110             {
111                 UNITY_OUTPUT_CHAR('\\');
112                 UnityPrintNumberHex((_U_UINT)*pch, 2);
113             }
114             pch++;
115         }
116     }
117 }
118 
119 //-----------------------------------------------
120 void UnityPrintNumberByStyle(const _U_SINT number, const UNITY_DISPLAY_STYLE_T style)
121 {
122     if ((style & UNITY_DISPLAY_RANGE_INT) == UNITY_DISPLAY_RANGE_INT)
123     {
124         UnityPrintNumber(number);
125     }
126     else if ((style & UNITY_DISPLAY_RANGE_UINT) == UNITY_DISPLAY_RANGE_UINT)
127     {
128         UnityPrintNumberUnsigned(  (_U_UINT)number  &  UnitySizeMask[((_U_UINT)style & (_U_UINT)0x0F) - 1]  );
129     }
130     else
131     {
132         UnityPrintNumberHex((_U_UINT)number, (char)((style & 0x000F) << 1));
133     }
134 }
135 
136 //-----------------------------------------------
137 /// basically do an itoa using as little ram as possible
138 void UnityPrintNumber(const _U_SINT number_to_print)
139 {
140     _U_SINT divisor = 1;
141     _U_SINT next_divisor;
142     _U_UINT number;
143 
144     if (number_to_print == (1l << (UNITY_LONG_WIDTH-1)))
145     {
146         //The largest representable negative number
147         UNITY_OUTPUT_CHAR('-');
148         number = (1ul << (UNITY_LONG_WIDTH-1));
149     }
150     else if (number_to_print < 0)
151     {
152         //Some other negative number
153         UNITY_OUTPUT_CHAR('-');
154         number = (_U_UINT)(-number_to_print);
155     }
156     else
157     {
158         //Positive number
159         number = (_U_UINT)number_to_print;
160     }
161 
162     // figure out initial divisor
163     while (number / divisor > 9)
164     {
165         next_divisor = divisor * 10;
166         if (next_divisor > divisor)
167             divisor = next_divisor;
168         else
169             break;
170     }
171 
172     // now mod and print, then divide divisor
173     do
174     {
175         UNITY_OUTPUT_CHAR((char)('0' + (number / divisor % 10)));
176         divisor /= 10;
177     }
178     while (divisor > 0);
179 }
180 
181 //-----------------------------------------------
182 /// basically do an itoa using as little ram as possible
183 void UnityPrintNumberUnsigned(const _U_UINT number)
184 {
185     _U_UINT divisor = 1;
186     _U_UINT next_divisor;
187 
188     // figure out initial divisor
189     while (number / divisor > 9)
190     {
191         next_divisor = divisor * 10;
192         if (next_divisor > divisor)
193             divisor = next_divisor;
194         else
195             break;
196     }
197 
198     // now mod and print, then divide divisor
199     do
200     {
201         UNITY_OUTPUT_CHAR((char)('0' + (number / divisor % 10)));
202         divisor /= 10;
203     }
204     while (divisor > 0);
205 }
206 
207 //-----------------------------------------------
208 void UnityPrintNumberHex(const _U_UINT number, const char nibbles_to_print)
209 {
210     _U_UINT nibble;
211     char nibbles = nibbles_to_print;
212     UNITY_OUTPUT_CHAR('0');
213     UNITY_OUTPUT_CHAR('x');
214 
215     while (nibbles > 0)
216     {
217         nibble = (number >> (--nibbles << 2)) & 0x0000000F;
218         if (nibble <= 9)
219         {
220             UNITY_OUTPUT_CHAR((char)('0' + nibble));
221         }
222         else
223         {
224             UNITY_OUTPUT_CHAR((char)('A' - 10 + nibble));
225         }
226     }
227 }
228 
229 //-----------------------------------------------
230 void UnityPrintMask(const _U_UINT mask, const _U_UINT number)
231 {
232     _U_UINT current_bit = (_U_UINT)1 << (UNITY_INT_WIDTH - 1);
233     _US32 i;
234 
235     for (i = 0; i < UNITY_INT_WIDTH; i++)
236     {
237         if (current_bit & mask)
238         {
239             if (current_bit & number)
240             {
241                 UNITY_OUTPUT_CHAR('1');
242             }
243             else
244             {
245                 UNITY_OUTPUT_CHAR('0');
246             }
247         }
248         else
249         {
250             UNITY_OUTPUT_CHAR('X');
251         }
252         current_bit = current_bit >> 1;
253     }
254 }
255 
256 //-----------------------------------------------
257 #ifdef UNITY_FLOAT_VERBOSE
258 #include <string.h>
259 void UnityPrintFloat(_UF number)
260 {
261     char TempBuffer[32];
262     sprintf(TempBuffer, "%.6f", number);
263     UnityPrint(TempBuffer);
264 }
265 #endif
266 
267 //-----------------------------------------------
268 
269 void UnityPrintFail(void)
270 {
271     UnityPrint(UnityStrFail);
272 }
273 
274 void UnityPrintOk(void)
275 {
276     UnityPrint(UnityStrOk);
277 }
278 
279 //-----------------------------------------------
280 static void UnityTestResultsBegin(const char* file, const UNITY_LINE_TYPE line)
281 {
282     UnityPrint(file);
283     UNITY_OUTPUT_CHAR(':');
284     UnityPrintNumber((_U_SINT)line);
285     UNITY_OUTPUT_CHAR(':');
286     UnityPrint(Unity.CurrentTestName);
287     UNITY_OUTPUT_CHAR(':');
288 }
289 
290 //-----------------------------------------------
291 static void UnityTestResultsFailBegin(const UNITY_LINE_TYPE line)
292 {
293     UnityTestResultsBegin(Unity.TestFile, line);
294 	if (Unity.isExpectingFail)
295 	{
296 		UnityPrint(UnityStrXFAIL);
297 	}
298 	else
299 	{
300 		UnityPrint(UnityStrFail);
301 	}
302 
303     UNITY_OUTPUT_CHAR(':');
304 }
305 
306 //-----------------------------------------------
307 void UnityConcludeTest(void)
308 {
309 #if 0
310 	if (Unity.isExpectingFail == 1 && Unity.CurrentTestFailed == 0)
311 	{
312 		printf("FAIL WAS EXPECTED, BUT IT DIDN'T HAPPEN?!");
313 		Unity.TestXPASSES++;
314 	}
315 
316 	else
317 #endif
318 	//cant be ignored and accepting fail at the same time!
319 	if (Unity.isExpectingFail == 1 && Unity.CurrentTestFailed == 1)
320 	{
321 		Unity.TestXFAILS++; //error message?!
322 		if (Unity.XFAILMessage != NULL)
323 		{
324 			if (Unity.XFAILMessage[0] != ' ')
325 			{
326 				printf(" ");
327 			}
328 
329 			printf("| ");
330 			printf("%s", Unity.XFAILMessage);
331 			Unity.XFAILMessage = NULL;
332 		}
333 		else
334 		{
335 			printf(" - EXPECTED FAIL!");
336 		}
337 	}
338 	else
339 
340     if (Unity.CurrentTestIgnored)
341     {
342         Unity.TestIgnores++;
343     }
344     else if (!Unity.CurrentTestFailed)
345     {
346 	if(Unity.isExpectingFail == 0) {
347 		UnityTestResultsBegin(Unity.TestFile, Unity.CurrentTestLineNumber);
348 		UnityPrint(UnityStrPass);
349 		Unity.TestPasses++;
350 	}
351 
352 	//probably should remove the if... part
353 	else if (Unity.isExpectingFail == 1 && Unity.CurrentTestFailed == 0)
354 	{
355 
356 		UnityTestResultsBegin(Unity.TestFile, Unity.CurrentTestLineNumber);
357 		UnityPrint(UnityStrXPASS);
358 		Unity.TestXPASSES++;
359 
360 		printf(" - FAIL WAS EXPECTED, BUT DIDN'T HAPPEN?!");
361 		//if (Unity.TestPasses > 0) { Unity.TestPasses--; }
362 	}
363     }
364     else
365     {
366         Unity.TestFailures++;
367     }
368 
369     Unity.CurrentTestFailed = 0;
370     Unity.CurrentTestIgnored = 0;
371     Unity.isExpectingFail = 0;
372 
373     UNITY_PRINT_EOL;
374 }
375 
376 //-----------------------------------------------
377 static void UnityAddMsgIfSpecified(const char* msg)
378 {
379     if (msg)
380     {
381         UnityPrint(UnityStrSpacer);
382         UnityPrint(msg);
383     }
384 }
385 
386 //-----------------------------------------------
387 static void UnityPrintExpectedAndActualStrings(const char* expected, const char* actual)
388 {
389     UnityPrint(UnityStrExpected);
390     if (expected != NULL)
391     {
392         UNITY_OUTPUT_CHAR('\'');
393         UnityPrint(expected);
394         UNITY_OUTPUT_CHAR('\'');
395     }
396     else
397     {
398       UnityPrint(UnityStrNull);
399     }
400     UnityPrint(UnityStrWas);
401     if (actual != NULL)
402     {
403         UNITY_OUTPUT_CHAR('\'');
404         UnityPrint(actual);
405         UNITY_OUTPUT_CHAR('\'');
406     }
407     else
408     {
409       UnityPrint(UnityStrNull);
410     }
411 }
412 
413 //-----------------------------------------------
414 // Assertion & Control Helpers
415 //-----------------------------------------------
416 
417 static int UnityCheckArraysForNull(UNITY_PTR_ATTRIBUTE const void* expected, UNITY_PTR_ATTRIBUTE const void* actual, const UNITY_LINE_TYPE lineNumber, const char* msg)
418 {
419     //return true if they are both NULL
420     if ((expected == NULL) && (actual == NULL))
421         return 1;
422 
423     //throw error if just expected is NULL
424     if (expected == NULL)
425     {
426         UnityTestResultsFailBegin(lineNumber);
427         UnityPrint(UnityStrNullPointerForExpected);
428         UnityAddMsgIfSpecified(msg);
429         UNITY_FAIL_AND_BAIL;
430     }
431 
432     //throw error if just actual is NULL
433     if (actual == NULL)
434     {
435         UnityTestResultsFailBegin(lineNumber);
436         UnityPrint(UnityStrNullPointerForActual);
437         UnityAddMsgIfSpecified(msg);
438         UNITY_FAIL_AND_BAIL;
439     }
440 
441     //return false if neither is NULL
442     return 0;
443 }
444 
445 //-----------------------------------------------
446 // Assertion Functions
447 //-----------------------------------------------
448 
449 void UnityAssertBits(const _U_SINT mask,
450                      const _U_SINT expected,
451                      const _U_SINT actual,
452                      const char* msg,
453                      const UNITY_LINE_TYPE lineNumber)
454 {
455     UNITY_SKIP_EXECUTION;
456 
457     if ((mask & expected) != (mask & actual))
458     {
459         UnityTestResultsFailBegin(lineNumber);
460         UnityPrint(UnityStrExpected);
461         UnityPrintMask((_U_UINT)mask, (_U_UINT)expected);
462         UnityPrint(UnityStrWas);
463         UnityPrintMask((_U_UINT)mask, (_U_UINT)actual);
464         UnityAddMsgIfSpecified(msg);
465         UNITY_FAIL_AND_BAIL;
466     }
467 }
468 
469 //-----------------------------------------------
470 void UnityAssertEqualNumber(const _U_SINT expected,
471                             const _U_SINT actual,
472                             const char* msg,
473                             const UNITY_LINE_TYPE lineNumber,
474                             const UNITY_DISPLAY_STYLE_T style)
475 {
476     UNITY_SKIP_EXECUTION;
477 
478     if (expected != actual)
479     {
480         UnityTestResultsFailBegin(lineNumber);
481         UnityPrint(UnityStrExpected);
482         UnityPrintNumberByStyle(expected, style);
483         UnityPrint(UnityStrWas);
484         UnityPrintNumberByStyle(actual, style);
485         UnityAddMsgIfSpecified(msg);
486         UNITY_FAIL_AND_BAIL;
487     }
488 }
489 
490 //-----------------------------------------------
491 void UnityAssertEqualIntArray(UNITY_PTR_ATTRIBUTE const void* expected,
492                               UNITY_PTR_ATTRIBUTE const void* actual,
493                               const _UU32 num_elements,
494                               const char* msg,
495                               const UNITY_LINE_TYPE lineNumber,
496                               const UNITY_DISPLAY_STYLE_T style)
497 {
498     _UU32 elements = num_elements;
499     UNITY_PTR_ATTRIBUTE const _US8* ptr_exp = (UNITY_PTR_ATTRIBUTE const _US8*)expected;
500     UNITY_PTR_ATTRIBUTE const _US8* ptr_act = (UNITY_PTR_ATTRIBUTE const _US8*)actual;
501 
502     UNITY_SKIP_EXECUTION;
503 
504     if (elements == 0)
505     {
506         UnityTestResultsFailBegin(lineNumber);
507         UnityPrint(UnityStrPointless);
508         UnityAddMsgIfSpecified(msg);
509         UNITY_FAIL_AND_BAIL;
510     }
511 
512     if (UnityCheckArraysForNull((UNITY_PTR_ATTRIBUTE const void*)expected, (UNITY_PTR_ATTRIBUTE const void*)actual, lineNumber, msg) == 1)
513         return;
514 
515     // If style is UNITY_DISPLAY_STYLE_INT, we'll fall into the default case rather than the INT16 or INT32 (etc) case
516     // as UNITY_DISPLAY_STYLE_INT includes a flag for UNITY_DISPLAY_RANGE_AUTO, which the width-specific
517     // variants do not. Therefore remove this flag.
518     switch(style & (UNITY_DISPLAY_STYLE_T)(~UNITY_DISPLAY_RANGE_AUTO))
519     {
520         case UNITY_DISPLAY_STYLE_HEX8:
521         case UNITY_DISPLAY_STYLE_INT8:
522         case UNITY_DISPLAY_STYLE_UINT8:
523             while (elements--)
524             {
525                 if (*ptr_exp != *ptr_act)
526                 {
527                     UnityTestResultsFailBegin(lineNumber);
528                     UnityPrint(UnityStrElement);
529                     UnityPrintNumberByStyle((num_elements - elements - 1), UNITY_DISPLAY_STYLE_UINT);
530                     UnityPrint(UnityStrExpected);
531                     UnityPrintNumberByStyle(*ptr_exp, style);
532                     UnityPrint(UnityStrWas);
533                     UnityPrintNumberByStyle(*ptr_act, style);
534                     UnityAddMsgIfSpecified(msg);
535                     UNITY_FAIL_AND_BAIL;
536                 }
537                 ptr_exp += 1;
538                 ptr_act += 1;
539             }
540             break;
541         case UNITY_DISPLAY_STYLE_HEX16:
542         case UNITY_DISPLAY_STYLE_INT16:
543         case UNITY_DISPLAY_STYLE_UINT16:
544             while (elements--)
545             {
546                 if (*(UNITY_PTR_ATTRIBUTE const _US16*)(void*)ptr_exp != *(UNITY_PTR_ATTRIBUTE const _US16*)(void*)ptr_act)
547                 {
548                     UnityTestResultsFailBegin(lineNumber);
549                     UnityPrint(UnityStrElement);
550                     UnityPrintNumberByStyle((num_elements - elements - 1), UNITY_DISPLAY_STYLE_UINT);
551                     UnityPrint(UnityStrExpected);
552                     UnityPrintNumberByStyle(*(UNITY_PTR_ATTRIBUTE const _US16*)(void*)ptr_exp, style);
553                     UnityPrint(UnityStrWas);
554                     UnityPrintNumberByStyle(*(UNITY_PTR_ATTRIBUTE const _US16*)(void*)ptr_act, style);
555                     UnityAddMsgIfSpecified(msg);
556                     UNITY_FAIL_AND_BAIL;
557                 }
558                 ptr_exp += 2;
559                 ptr_act += 2;
560             }
561             break;
562 #ifdef UNITY_SUPPORT_64
563         case UNITY_DISPLAY_STYLE_HEX64:
564         case UNITY_DISPLAY_STYLE_INT64:
565         case UNITY_DISPLAY_STYLE_UINT64:
566             while (elements--)
567             {
568                 if (*(UNITY_PTR_ATTRIBUTE const _US64*)(void*)ptr_exp != *(UNITY_PTR_ATTRIBUTE const _US64*)(void*)ptr_act)
569                 {
570                     UnityTestResultsFailBegin(lineNumber);
571                     UnityPrint(UnityStrElement);
572                     UnityPrintNumberByStyle((num_elements - elements - 1), UNITY_DISPLAY_STYLE_UINT);
573                     UnityPrint(UnityStrExpected);
574                     UnityPrintNumberByStyle(*(UNITY_PTR_ATTRIBUTE const _US64*)(void*)ptr_exp, style);
575                     UnityPrint(UnityStrWas);
576                     UnityPrintNumberByStyle(*(UNITY_PTR_ATTRIBUTE const _US64*)(void*)ptr_act, style);
577                     UnityAddMsgIfSpecified(msg);
578                     UNITY_FAIL_AND_BAIL;
579                 }
580                 ptr_exp += 8;
581                 ptr_act += 8;
582             }
583             break;
584 #endif
585         default:
586             while (elements--)
587             {
588                 if (*(UNITY_PTR_ATTRIBUTE const _US32*)(void*)ptr_exp != *(UNITY_PTR_ATTRIBUTE const _US32*)(void*)ptr_act)
589                 {
590                     UnityTestResultsFailBegin(lineNumber);
591                     UnityPrint(UnityStrElement);
592                     UnityPrintNumberByStyle((num_elements - elements - 1), UNITY_DISPLAY_STYLE_UINT);
593                     UnityPrint(UnityStrExpected);
594                     UnityPrintNumberByStyle(*(UNITY_PTR_ATTRIBUTE const _US32*)(void*)ptr_exp, style);
595                     UnityPrint(UnityStrWas);
596                     UnityPrintNumberByStyle(*(UNITY_PTR_ATTRIBUTE const _US32*)(void*)ptr_act, style);
597                     UnityAddMsgIfSpecified(msg);
598                     UNITY_FAIL_AND_BAIL;
599                 }
600                 ptr_exp += 4;
601                 ptr_act += 4;
602             }
603             break;
604     }
605 }
606 
607 //-----------------------------------------------
608 #ifndef UNITY_EXCLUDE_FLOAT
609 void UnityAssertEqualFloatArray(UNITY_PTR_ATTRIBUTE const _UF* expected,
610                                 UNITY_PTR_ATTRIBUTE const _UF* actual,
611                                 const _UU32 num_elements,
612                                 const char* msg,
613                                 const UNITY_LINE_TYPE lineNumber)
614 {
615     _UU32 elements = num_elements;
616     UNITY_PTR_ATTRIBUTE const _UF* ptr_expected = expected;
617     UNITY_PTR_ATTRIBUTE const _UF* ptr_actual = actual;
618     _UF diff, tol;
619 
620     UNITY_SKIP_EXECUTION;
621 
622     if (elements == 0)
623     {
624         UnityTestResultsFailBegin(lineNumber);
625         UnityPrint(UnityStrPointless);
626         UnityAddMsgIfSpecified(msg);
627         UNITY_FAIL_AND_BAIL;
628     }
629 
630     if (UnityCheckArraysForNull((UNITY_PTR_ATTRIBUTE const void*)expected, (UNITY_PTR_ATTRIBUTE const void*)actual, lineNumber, msg) == 1)
631         return;
632 
633     while (elements--)
634     {
635         diff = *ptr_expected - *ptr_actual;
636         if (diff < 0.0f)
637           diff = 0.0f - diff;
638         tol = UNITY_FLOAT_PRECISION * *ptr_expected;
639         if (tol < 0.0f)
640             tol = 0.0f - tol;
641 
642         //This first part of this condition will catch any NaN or Infinite values
643         if ((diff * 0.0f != 0.0f) || (diff > tol))
644         {
645             UnityTestResultsFailBegin(lineNumber);
646             UnityPrint(UnityStrElement);
647             UnityPrintNumberByStyle((num_elements - elements - 1), UNITY_DISPLAY_STYLE_UINT);
648 #ifdef UNITY_FLOAT_VERBOSE
649             UnityPrint(UnityStrExpected);
650             UnityPrintFloat(*ptr_expected);
651             UnityPrint(UnityStrWas);
652             UnityPrintFloat(*ptr_actual);
653 #else
654             UnityPrint(UnityStrDelta);
655 #endif
656             UnityAddMsgIfSpecified(msg);
657             UNITY_FAIL_AND_BAIL;
658         }
659         ptr_expected++;
660         ptr_actual++;
661     }
662 }
663 
664 //-----------------------------------------------
665 void UnityAssertFloatsWithin(const _UF delta,
666                              const _UF expected,
667                              const _UF actual,
668                              const char* msg,
669                              const UNITY_LINE_TYPE lineNumber)
670 {
671     _UF diff = actual - expected;
672     _UF pos_delta = delta;
673 
674     UNITY_SKIP_EXECUTION;
675 
676     if (diff < 0.0f)
677     {
678         diff = 0.0f - diff;
679     }
680     if (pos_delta < 0.0f)
681     {
682         pos_delta = 0.0f - pos_delta;
683     }
684 
685     //This first part of this condition will catch any NaN or Infinite values
686     if ((diff * 0.0f != 0.0f) || (pos_delta < diff))
687     {
688         UnityTestResultsFailBegin(lineNumber);
689 #ifdef UNITY_FLOAT_VERBOSE
690         UnityPrint(UnityStrExpected);
691         UnityPrintFloat(expected);
692         UnityPrint(UnityStrWas);
693         UnityPrintFloat(actual);
694 #else
695         UnityPrint(UnityStrDelta);
696 #endif
697         UnityAddMsgIfSpecified(msg);
698         UNITY_FAIL_AND_BAIL;
699     }
700 }
701 
702 //-----------------------------------------------
703 void UnityAssertFloatSpecial(const _UF actual,
704                              const char* msg,
705                              const UNITY_LINE_TYPE lineNumber,
706                              const UNITY_FLOAT_TRAIT_T style)
707 {
708     const char* trait_names[] = { UnityStrInf, UnityStrNegInf, UnityStrNaN, UnityStrDet };
709     _U_SINT should_be_trait   = ((_U_SINT)style & 1);
710     _U_SINT is_trait          = !should_be_trait;
711     _U_SINT trait_index       = style >> 1;
712 
713     UNITY_SKIP_EXECUTION;
714 
715     switch(style)
716     {
717         //To determine Inf / Neg Inf, we compare to an Inf / Neg Inf value we create on the fly
718         //We are using a variable to hold the zero value because some compilers complain about dividing by zero otherwise
719         case UNITY_FLOAT_IS_INF:
720         case UNITY_FLOAT_IS_NOT_INF:
721             is_trait = ((1.0f / f_zero) == actual) ? 1 : 0;
722             break;
723         case UNITY_FLOAT_IS_NEG_INF:
724         case UNITY_FLOAT_IS_NOT_NEG_INF:
725             is_trait = ((-1.0f / f_zero) == actual) ? 1 : 0;
726             break;
727 
728         //NaN is the only floating point value that does NOT equal itself. Therefore if Actual == Actual, then it is NOT NaN.
729         case UNITY_FLOAT_IS_NAN:
730         case UNITY_FLOAT_IS_NOT_NAN:
731             is_trait = (actual == actual) ? 0 : 1;
732             break;
733 
734         //A determinate number is non infinite and not NaN. (therefore the opposite of the two above)
735         case UNITY_FLOAT_IS_DET:
736         case UNITY_FLOAT_IS_NOT_DET:
737             if ( (actual != actual) || ((1.0f / f_zero) == actual) || ((-1.0f / f_zero) == actual) )
738                 is_trait = 0;
739             else
740                 is_trait = 1;
741             break;
742 	default:
743 	    ;
744     }
745 
746     if (is_trait != should_be_trait)
747     {
748         UnityTestResultsFailBegin(lineNumber);
749         UnityPrint(UnityStrExpected);
750         if (!should_be_trait)
751             UnityPrint(UnityStrNot);
752         UnityPrint(trait_names[trait_index]);
753         UnityPrint(UnityStrWas);
754 #ifdef UNITY_FLOAT_VERBOSE
755         UnityPrintFloat(actual);
756 #else
757         if (should_be_trait)
758             UnityPrint(UnityStrNot);
759         UnityPrint(trait_names[trait_index]);
760 #endif
761         UnityAddMsgIfSpecified(msg);
762         UNITY_FAIL_AND_BAIL;
763     }
764 }
765 
766 #endif //not UNITY_EXCLUDE_FLOAT
767 
768 //-----------------------------------------------
769 #ifndef UNITY_EXCLUDE_DOUBLE
770 void UnityAssertEqualDoubleArray(UNITY_PTR_ATTRIBUTE const _UD* expected,
771                                  UNITY_PTR_ATTRIBUTE const _UD* actual,
772                                  const _UU32 num_elements,
773                                  const char* msg,
774                                  const UNITY_LINE_TYPE lineNumber)
775 {
776     _UU32 elements = num_elements;
777     UNITY_PTR_ATTRIBUTE const _UD* ptr_expected = expected;
778     UNITY_PTR_ATTRIBUTE const _UD* ptr_actual = actual;
779     _UD diff, tol;
780 
781     UNITY_SKIP_EXECUTION;
782 
783     if (elements == 0)
784     {
785         UnityTestResultsFailBegin(lineNumber);
786         UnityPrint(UnityStrPointless);
787         UnityAddMsgIfSpecified(msg);
788         UNITY_FAIL_AND_BAIL;
789     }
790 
791     if (UnityCheckArraysForNull((UNITY_PTR_ATTRIBUTE void*)expected, (UNITY_PTR_ATTRIBUTE void*)actual, lineNumber, msg) == 1)
792         return;
793 
794     while (elements--)
795     {
796         diff = *ptr_expected - *ptr_actual;
797         if (diff < 0.0)
798           diff = 0.0 - diff;
799         tol = UNITY_DOUBLE_PRECISION * *ptr_expected;
800         if (tol < 0.0)
801             tol = 0.0 - tol;
802 
803         //This first part of this condition will catch any NaN or Infinite values
804         if ((diff * 0.0 != 0.0) || (diff > tol))
805         {
806             UnityTestResultsFailBegin(lineNumber);
807             UnityPrint(UnityStrElement);
808             UnityPrintNumberByStyle((num_elements - elements - 1), UNITY_DISPLAY_STYLE_UINT);
809 #ifdef UNITY_DOUBLE_VERBOSE
810             UnityPrint(UnityStrExpected);
811             UnityPrintFloat((float)(*ptr_expected));
812             UnityPrint(UnityStrWas);
813             UnityPrintFloat((float)(*ptr_actual));
814 #else
815             UnityPrint(UnityStrDelta);
816 #endif
817             UnityAddMsgIfSpecified(msg);
818             UNITY_FAIL_AND_BAIL;
819         }
820         ptr_expected++;
821         ptr_actual++;
822     }
823 }
824 
825 //-----------------------------------------------
826 void UnityAssertDoublesWithin(const _UD delta,
827                               const _UD expected,
828                               const _UD actual,
829                               const char* msg,
830                               const UNITY_LINE_TYPE lineNumber)
831 {
832     _UD diff = actual - expected;
833     _UD pos_delta = delta;
834 
835     UNITY_SKIP_EXECUTION;
836 
837     if (diff < 0.0)
838     {
839         diff = 0.0 - diff;
840     }
841     if (pos_delta < 0.0)
842     {
843         pos_delta = 0.0 - pos_delta;
844     }
845 
846     //This first part of this condition will catch any NaN or Infinite values
847     if ((diff * 0.0 != 0.0) || (pos_delta < diff))
848     {
849         UnityTestResultsFailBegin(lineNumber);
850 #ifdef UNITY_DOUBLE_VERBOSE
851         UnityPrint(UnityStrExpected);
852         UnityPrintFloat((float)expected);
853         UnityPrint(UnityStrWas);
854         UnityPrintFloat((float)actual);
855 #else
856         UnityPrint(UnityStrDelta);
857 #endif
858         UnityAddMsgIfSpecified(msg);
859         UNITY_FAIL_AND_BAIL;
860     }
861 }
862 
863 //-----------------------------------------------
864 
865 void UnityAssertDoubleSpecial(const _UD actual,
866                               const char* msg,
867                               const UNITY_LINE_TYPE lineNumber,
868                               const UNITY_FLOAT_TRAIT_T style)
869 {
870     const char* trait_names[] = { UnityStrInf, UnityStrNegInf, UnityStrNaN, UnityStrDet };
871     _U_SINT should_be_trait   = ((_U_SINT)style & 1);
872     _U_SINT is_trait          = !should_be_trait;
873     _U_SINT trait_index       = style >> 1;
874 
875     UNITY_SKIP_EXECUTION;
876 
877     switch(style)
878     {
879         //To determine Inf / Neg Inf, we compare to an Inf / Neg Inf value we create on the fly
880         //We are using a variable to hold the zero value because some compilers complain about dividing by zero otherwise
881         case UNITY_FLOAT_IS_INF:
882         case UNITY_FLOAT_IS_NOT_INF:
883             is_trait = ((1.0 / d_zero) == actual) ? 1 : 0;
884             break;
885         case UNITY_FLOAT_IS_NEG_INF:
886         case UNITY_FLOAT_IS_NOT_NEG_INF:
887             is_trait = ((-1.0 / d_zero) == actual) ? 1 : 0;
888             break;
889 
890         //NaN is the only floating point value that does NOT equal itself. Therefore if Actual == Actual, then it is NOT NaN.
891         case UNITY_FLOAT_IS_NAN:
892         case UNITY_FLOAT_IS_NOT_NAN:
893             is_trait = (actual == actual) ? 0 : 1;
894             break;
895 
896         //A determinate number is non infinite and not NaN. (therefore the opposite of the two above)
897         case UNITY_FLOAT_IS_DET:
898         case UNITY_FLOAT_IS_NOT_DET:
899             if ( (actual != actual) || ((1.0 / d_zero) == actual) || ((-1.0 / d_zero) == actual) )
900                 is_trait = 0;
901             else
902                 is_trait = 1;
903             break;
904 	default:
905 	    ;
906     }
907 
908     if (is_trait != should_be_trait)
909     {
910         UnityTestResultsFailBegin(lineNumber);
911         UnityPrint(UnityStrExpected);
912         if (!should_be_trait)
913             UnityPrint(UnityStrNot);
914         UnityPrint(trait_names[trait_index]);
915         UnityPrint(UnityStrWas);
916 #ifdef UNITY_DOUBLE_VERBOSE
917         UnityPrintFloat(actual);
918 #else
919         if (should_be_trait)
920             UnityPrint(UnityStrNot);
921         UnityPrint(trait_names[trait_index]);
922 #endif
923         UnityAddMsgIfSpecified(msg);
924         UNITY_FAIL_AND_BAIL;
925     }
926 }
927 
928 
929 #endif // not UNITY_EXCLUDE_DOUBLE
930 
931 //-----------------------------------------------
932 void UnityAssertNumbersWithin( const _U_SINT delta,
933                                const _U_SINT expected,
934                                const _U_SINT actual,
935                                const char* msg,
936                                const UNITY_LINE_TYPE lineNumber,
937                                const UNITY_DISPLAY_STYLE_T style)
938 {
939     UNITY_SKIP_EXECUTION;
940 
941     if ((style & UNITY_DISPLAY_RANGE_INT) == UNITY_DISPLAY_RANGE_INT)
942     {
943         if (actual > expected)
944           Unity.CurrentTestFailed = ((actual - expected) > delta);
945         else
946           Unity.CurrentTestFailed = ((expected - actual) > delta);
947     }
948     else
949     {
950         if ((_U_UINT)actual > (_U_UINT)expected)
951             Unity.CurrentTestFailed = ((_U_UINT)(actual - expected) > (_U_UINT)delta);
952         else
953             Unity.CurrentTestFailed = ((_U_UINT)(expected - actual) > (_U_UINT)delta);
954     }
955 
956     if (Unity.CurrentTestFailed)
957     {
958         UnityTestResultsFailBegin(lineNumber);
959         UnityPrint(UnityStrDelta);
960         UnityPrintNumberByStyle(delta, style);
961         UnityPrint(UnityStrExpected);
962         UnityPrintNumberByStyle(expected, style);
963         UnityPrint(UnityStrWas);
964         UnityPrintNumberByStyle(actual, style);
965         UnityAddMsgIfSpecified(msg);
966         UNITY_FAIL_AND_BAIL;
967     }
968 }
969 
970 //-----------------------------------------------
971 void UnityAssertEqualString(const char* expected,
972                             const char* actual,
973                             const char* msg,
974                             const UNITY_LINE_TYPE lineNumber)
975 {
976     _UU32 i;
977 
978     UNITY_SKIP_EXECUTION;
979 
980     // if both pointers not null compare the strings
981     if (expected && actual)
982     {
983         for (i = 0; expected[i] || actual[i]; i++)
984         {
985             if (expected[i] != actual[i])
986             {
987                 Unity.CurrentTestFailed = 1;
988                 break;
989             }
990         }
991     }
992     else
993     { // handle case of one pointers being null (if both null, test should pass)
994         if (expected != actual)
995         {
996             Unity.CurrentTestFailed = 1;
997         }
998     }
999 
1000     if (Unity.CurrentTestFailed)
1001     {
1002       UnityTestResultsFailBegin(lineNumber);
1003       UnityPrintExpectedAndActualStrings(expected, actual);
1004       UnityAddMsgIfSpecified(msg);
1005       UNITY_FAIL_AND_BAIL;
1006     }
1007 }
1008 
1009 //-----------------------------------------------
1010 void UnityAssertEqualStringArray( const char** expected,
1011                                   const char** actual,
1012                                   const _UU32 num_elements,
1013                                   const char* msg,
1014                                   const UNITY_LINE_TYPE lineNumber)
1015 {
1016     _UU32 i, j = 0;
1017 
1018     UNITY_SKIP_EXECUTION;
1019 
1020     // if no elements, it's an error
1021     if (num_elements == 0)
1022     {
1023         UnityTestResultsFailBegin(lineNumber);
1024         UnityPrint(UnityStrPointless);
1025         UnityAddMsgIfSpecified(msg);
1026         UNITY_FAIL_AND_BAIL;
1027     }
1028 
1029     if (UnityCheckArraysForNull((UNITY_PTR_ATTRIBUTE void*)expected, (UNITY_PTR_ATTRIBUTE void*)actual, lineNumber, msg) == 1)
1030         return;
1031 
1032     do
1033     {
1034         // if both pointers not null compare the strings
1035         if (expected[j] && actual[j])
1036         {
1037             for (i = 0; expected[j][i] || actual[j][i]; i++)
1038             {
1039                 if (expected[j][i] != actual[j][i])
1040                 {
1041                     Unity.CurrentTestFailed = 1;
1042                     break;
1043                 }
1044             }
1045         }
1046         else
1047         { // handle case of one pointers being null (if both null, test should pass)
1048             if (expected[j] != actual[j])
1049             {
1050                 Unity.CurrentTestFailed = 1;
1051             }
1052         }
1053 
1054         if (Unity.CurrentTestFailed)
1055         {
1056             UnityTestResultsFailBegin(lineNumber);
1057             if (num_elements > 1)
1058             {
1059                 UnityPrint(UnityStrElement);
1060                 UnityPrintNumberByStyle((j), UNITY_DISPLAY_STYLE_UINT);
1061             }
1062             UnityPrintExpectedAndActualStrings((const char*)(expected[j]), (const char*)(actual[j]));
1063             UnityAddMsgIfSpecified(msg);
1064             UNITY_FAIL_AND_BAIL;
1065         }
1066     } while (++j < num_elements);
1067 }
1068 
1069 //-----------------------------------------------
1070 void UnityAssertEqualMemory( UNITY_PTR_ATTRIBUTE const void* expected,
1071                              UNITY_PTR_ATTRIBUTE const void* actual,
1072                              const _UU32 length,
1073                              const _UU32 num_elements,
1074                              const char* msg,
1075                              const UNITY_LINE_TYPE lineNumber)
1076 {
1077     UNITY_PTR_ATTRIBUTE const unsigned char* ptr_exp = (UNITY_PTR_ATTRIBUTE const unsigned char*)expected;
1078     UNITY_PTR_ATTRIBUTE const unsigned char* ptr_act = (UNITY_PTR_ATTRIBUTE const unsigned char*)actual;
1079     _UU32 elements = num_elements;
1080     _UU32 bytes;
1081 
1082     UNITY_SKIP_EXECUTION;
1083 
1084     if ((elements == 0) || (length == 0))
1085     {
1086         UnityTestResultsFailBegin(lineNumber);
1087         UnityPrint(UnityStrPointless);
1088         UnityAddMsgIfSpecified(msg);
1089         UNITY_FAIL_AND_BAIL;
1090     }
1091 
1092     if (UnityCheckArraysForNull((UNITY_PTR_ATTRIBUTE const void*)expected, (UNITY_PTR_ATTRIBUTE const void*)actual, lineNumber, msg) == 1)
1093         return;
1094 
1095     while (elements--)
1096     {
1097         /////////////////////////////////////
1098         bytes = length;
1099         while (bytes--)
1100         {
1101             if (*ptr_exp != *ptr_act)
1102             {
1103                 UnityTestResultsFailBegin(lineNumber);
1104                 UnityPrint(UnityStrMemory);
1105                 if (num_elements > 1)
1106                 {
1107                     UnityPrint(UnityStrElement);
1108                     UnityPrintNumberByStyle((num_elements - elements - 1), UNITY_DISPLAY_STYLE_UINT);
1109                 }
1110                 UnityPrint(UnityStrByte);
1111                 UnityPrintNumberByStyle((length - bytes - 1), UNITY_DISPLAY_STYLE_UINT);
1112                 UnityPrint(UnityStrExpected);
1113                 UnityPrintNumberByStyle(*ptr_exp, UNITY_DISPLAY_STYLE_HEX8);
1114                 UnityPrint(UnityStrWas);
1115                 UnityPrintNumberByStyle(*ptr_act, UNITY_DISPLAY_STYLE_HEX8);
1116                 UnityAddMsgIfSpecified(msg);
1117                 UNITY_FAIL_AND_BAIL;
1118             }
1119             ptr_exp += 1;
1120             ptr_act += 1;
1121         }
1122         /////////////////////////////////////
1123 
1124     }
1125 }
1126 
1127 //-----------------------------------------------
1128 // Control Functions
1129 //-----------------------------------------------
1130 
1131 void UnityFail(const char* msg, const UNITY_LINE_TYPE line)
1132 {
1133     UNITY_SKIP_EXECUTION;
1134 
1135     UnityTestResultsBegin(Unity.TestFile, line);
1136     UnityPrintFail();
1137     if (msg != NULL)
1138     {
1139       UNITY_OUTPUT_CHAR(':');
1140       if (msg[0] != ' ')
1141       {
1142         UNITY_OUTPUT_CHAR(' ');
1143       }
1144       UnityPrint(msg);
1145     }
1146     UNITY_FAIL_AND_BAIL;
1147 }
1148 
1149 //-----------------------------------------------
1150 void UnityIgnore(const char* msg, const UNITY_LINE_TYPE line)
1151 {
1152     UNITY_SKIP_EXECUTION;
1153 
1154     UnityTestResultsBegin(Unity.TestFile, line);
1155     UnityPrint(UnityStrIgnore);
1156     if (msg != NULL)
1157     {
1158       UNITY_OUTPUT_CHAR(':');
1159       UNITY_OUTPUT_CHAR(' ');
1160       UnityPrint(msg);
1161     }
1162     UNITY_IGNORE_AND_BAIL;
1163 }
1164 
1165 //----------------------------------------------
1166 
1167 void UnityExpectFail(){
1168 
1169 	Unity.isExpectingFail = 1;
1170 
1171 }
1172 
1173 void UnityExpectFailMessage(const char* msg, const UNITY_LINE_TYPE line ){
1174 
1175 	Unity.isExpectingFail = 1;
1176 	  if (msg != NULL)
1177     {
1178 		Unity.XFAILMessage = msg;
1179     }
1180 }
1181 
1182 //-----------------------------------------------
1183 #if defined(UNITY_WEAK_ATTRIBUTE)
1184     void setUp(void);
1185     void tearDown(void);
1186     UNITY_WEAK_ATTRIBUTE void setUp(void) { }
1187     UNITY_WEAK_ATTRIBUTE void tearDown(void) { }
1188 #elif defined(UNITY_WEAK_PRAGMA)
1189 #   pragma weak setUp
1190     void setUp(void);
1191 #   pragma weak tearDown
1192     void tearDown(void);
1193 #else
1194     void setUp(void);
1195     void tearDown(void);
1196 #endif
1197 
1198 //-----------------------------------------------
1199 void UnityDefaultTestRun(UnityTestFunction Func, const char* FuncName, const int FuncLineNum)
1200 {
1201     Unity.CurrentTestName = FuncName;
1202     Unity.CurrentTestLineNumber = (UNITY_LINE_TYPE)FuncLineNum;
1203     Unity.NumberOfTests++;
1204 
1205     if (TEST_PROTECT())
1206     {
1207         setUp();
1208         Func();
1209     }
1210     if (TEST_PROTECT() && !(Unity.CurrentTestIgnored))
1211     {
1212         tearDown();
1213     }
1214 
1215     UnityConcludeTest();
1216 }
1217 
1218 
1219 //-----------------------------------------------
1220 void UnityBegin(const char* filename)
1221 {
1222     Unity.TestFile = filename;
1223     Unity.CurrentTestName = NULL;
1224     Unity.CurrentTestLineNumber = 0;
1225     Unity.NumberOfTests = 0;
1226     Unity.TestFailures = 0;
1227     Unity.TestIgnores = 0;
1228     Unity.CurrentTestFailed = 0;
1229     Unity.CurrentTestIgnored = 0;
1230     Unity.TestXFAILS = 0;
1231     Unity.isExpectingFail = 0;
1232     Unity.TestPasses = 0;
1233     Unity.TestXPASSES = 0;
1234     Unity.XFAILMessage = NULL;
1235 
1236     UNITY_OUTPUT_START();
1237 }
1238 
1239 
1240 //-----------------------------------------------
1241 int UnityEnd(void)
1242 {
1243     UNITY_PRINT_EOL;
1244     UnityPrint(UnityStrBreaker);
1245     UNITY_PRINT_EOL;
1246     UnityPrintNumber((_U_SINT)(Unity.NumberOfTests));
1247     UnityPrint(UnityStrResultsTests);
1248     UNITY_PRINT_EOL;
1249     UnityPrintNumber((_U_SINT)(Unity.TestPasses));
1250     UnityPrint(UnityStrResultsPass);
1251     UNITY_PRINT_EOL;
1252     UnityPrintNumber((_U_SINT)(Unity.TestXFAILS));
1253     UnityPrint(UnityStrResultsXFAIL);
1254     UNITY_PRINT_EOL;
1255     UnityPrintNumber((_U_SINT)(Unity.TestFailures));
1256     UnityPrint(UnityStrResultsFailures);
1257     UNITY_PRINT_EOL;
1258     UnityPrintNumber((_U_SINT)(Unity.TestXPASSES));
1259     UnityPrint(UnityStrResultsXPASS);
1260     UNITY_PRINT_EOL;
1261     UnityPrintNumber((_U_SINT)(Unity.TestIgnores));
1262     UnityPrint(UnityStrResultsIgnored);
1263     UNITY_PRINT_EOL;
1264 
1265     UNITY_PRINT_EOL;
1266     if (Unity.TestFailures == 0U && Unity.TestXPASSES == 0U)
1267     {
1268         UnityPrintOk();
1269     }
1270     else
1271     {
1272         UnityPrintFail();
1273     }
1274     UNITY_PRINT_EOL;
1275     UNITY_OUTPUT_COMPLETE();
1276     return (int)(Unity.TestFailures);
1277 }
1278 
1279 
1280 //-----------------------------------------------
1281