xref: /freebsd/contrib/ntp/sntp/unity/unity.c (revision b626f5a73a48f44a31a200291b141e1da408a2ff)
1276da39aSCy Schubert /* =========================================================================
2276da39aSCy Schubert     Unity Project - A Test Framework for C
3276da39aSCy Schubert     Copyright (c) 2007-14 Mike Karlesky, Mark VanderVoord, Greg Williams
4276da39aSCy Schubert     [Released under MIT License. Please refer to license.txt for details]
5276da39aSCy Schubert ============================================================================ */
6276da39aSCy Schubert 
7276da39aSCy Schubert #include "unity.h"
8276da39aSCy Schubert 
9276da39aSCy Schubert #define UNITY_FAIL_AND_BAIL   { Unity.CurrentTestFailed  = 1; longjmp(Unity.AbortFrame, 1); }
10276da39aSCy Schubert #define UNITY_IGNORE_AND_BAIL { Unity.CurrentTestIgnored = 1; longjmp(Unity.AbortFrame, 1); }
11276da39aSCy Schubert /// return prematurely if we are already in failure or ignore state
12276da39aSCy Schubert #define UNITY_SKIP_EXECUTION  { if ((Unity.CurrentTestFailed != 0) || (Unity.CurrentTestIgnored != 0)) {return;} }
13276da39aSCy Schubert #define UNITY_PRINT_EOL       { UNITY_OUTPUT_CHAR('\n'); }
14276da39aSCy Schubert 
15276da39aSCy Schubert struct _Unity Unity;
16276da39aSCy Schubert 
17276da39aSCy Schubert const char UnityStrOk[]                     = "OK";
18276da39aSCy Schubert const char UnityStrPass[]                   = "PASS";
19276da39aSCy Schubert const char UnityStrFail[]                   = "FAIL";
20276da39aSCy Schubert const char UnityStrIgnore[]                 = "IGNORE";
21276da39aSCy Schubert const char UnityStrXPASS[]                  = "XPASS";
22276da39aSCy Schubert const char UnityStrXFAIL[]                  = "XFAIL";
23276da39aSCy Schubert const char UnityStrNull[]                   = "NULL";
24276da39aSCy Schubert const char UnityStrSpacer[]                 = ". ";
25276da39aSCy Schubert const char UnityStrExpected[]               = " Expected ";
26276da39aSCy Schubert const char UnityStrWas[]                    = " Was ";
27276da39aSCy Schubert const char UnityStrTo[]                     = " To ";
28276da39aSCy Schubert const char UnityStrElement[]                = " Element ";
29276da39aSCy Schubert const char UnityStrByte[]                   = " Byte ";
30276da39aSCy Schubert const char UnityStrMemory[]                 = " Memory Mismatch.";
31276da39aSCy Schubert const char UnityStrDelta[]                  = " Values Not Within Delta ";
32276da39aSCy Schubert const char UnityStrPointless[]              = " You Asked Me To Compare Nothing, Which Was Pointless.";
33276da39aSCy Schubert const char UnityStrNullPointerForExpected[] = " Expected pointer to be NULL";
34276da39aSCy Schubert const char UnityStrNullPointerForActual[]   = " Actual pointer was NULL";
35276da39aSCy Schubert const char UnityStrNot[]                    = "Not ";
36276da39aSCy Schubert const char UnityStrInf[]                    = "Infinity";
37276da39aSCy Schubert const char UnityStrNegInf[]                 = "Negative Infinity";
38276da39aSCy Schubert const char UnityStrNaN[]                    = "NaN";
39276da39aSCy Schubert const char UnityStrDet[]                    = "Determinate";
40276da39aSCy Schubert const char UnityStrErrFloat[]               = "Unity Floating Point Disabled";
41276da39aSCy Schubert const char UnityStrErrDouble[]              = "Unity Double Precision Disabled";
42276da39aSCy Schubert const char UnityStrErr64[]                  = "Unity 64-bit Support Disabled";
43276da39aSCy Schubert const char UnityStrBreaker[]                = "-----------------------";
44276da39aSCy Schubert const char UnityStrResultsTests[]           = " Tests: ";
45276da39aSCy Schubert const char UnityStrResultsFailures[]        = " Failures ";
46276da39aSCy Schubert const char UnityStrResultsIgnored[]         = " Ignored ";
47276da39aSCy Schubert const char UnityStrResultsXFAIL[]           = " XFAIL ";
48276da39aSCy Schubert const char UnityStrResultsXPASS[]           = " XPASS ";
49276da39aSCy Schubert const char UnityStrResultsPass[]            = " PASS ";
50276da39aSCy Schubert 
51276da39aSCy Schubert 
52276da39aSCy Schubert #ifndef UNITY_EXCLUDE_FLOAT
53276da39aSCy Schubert // Dividing by these constants produces +/- infinity.
54276da39aSCy Schubert // The rationale is given in UnityAssertFloatIsInf's body.
55276da39aSCy Schubert static const _UF f_zero = 0.0f;
56276da39aSCy Schubert #ifndef UNITY_EXCLUDE_DOUBLE
57276da39aSCy Schubert static const _UD d_zero = 0.0;
58276da39aSCy Schubert #endif
59276da39aSCy Schubert #endif
60276da39aSCy Schubert 
61276da39aSCy Schubert // compiler-generic print formatting masks
62276da39aSCy Schubert const _U_UINT UnitySizeMask[] =
63276da39aSCy Schubert {
64276da39aSCy Schubert     255u,         // 0xFF
65276da39aSCy Schubert     65535u,       // 0xFFFF
66276da39aSCy Schubert     65535u,
67276da39aSCy Schubert     4294967295u,  // 0xFFFFFFFF
68276da39aSCy Schubert     4294967295u,
69276da39aSCy Schubert     4294967295u,
70276da39aSCy Schubert     4294967295u
71276da39aSCy Schubert #ifdef UNITY_SUPPORT_64
72276da39aSCy Schubert     ,0xFFFFFFFFFFFFFFFF
73276da39aSCy Schubert #endif
74276da39aSCy Schubert };
75276da39aSCy Schubert 
76276da39aSCy Schubert void UnityPrintFail(void);
77276da39aSCy Schubert void UnityPrintOk(void);
78276da39aSCy Schubert 
79276da39aSCy Schubert //-----------------------------------------------
80276da39aSCy Schubert // Pretty Printers & Test Result Output Handlers
81276da39aSCy Schubert //-----------------------------------------------
82276da39aSCy Schubert 
UnityPrint(const char * string)83276da39aSCy Schubert void UnityPrint(const char* string)
84276da39aSCy Schubert {
85276da39aSCy Schubert     const char* pch = string;
86276da39aSCy Schubert 
87276da39aSCy Schubert     if (pch != NULL)
88276da39aSCy Schubert     {
89276da39aSCy Schubert         while (*pch)
90276da39aSCy Schubert         {
91276da39aSCy Schubert             // printable characters plus CR & LF are printed
92276da39aSCy Schubert             if ((*pch <= 126) && (*pch >= 32))
93276da39aSCy Schubert             {
94276da39aSCy Schubert                 UNITY_OUTPUT_CHAR(*pch);
95276da39aSCy Schubert             }
96276da39aSCy Schubert             //write escaped carriage returns
97276da39aSCy Schubert             else if (*pch == 13)
98276da39aSCy Schubert             {
99276da39aSCy Schubert                 UNITY_OUTPUT_CHAR('\\');
100276da39aSCy Schubert                 UNITY_OUTPUT_CHAR('r');
101276da39aSCy Schubert             }
102276da39aSCy Schubert             //write escaped line feeds
103276da39aSCy Schubert             else if (*pch == 10)
104276da39aSCy Schubert             {
105276da39aSCy Schubert                 UNITY_OUTPUT_CHAR('\\');
106276da39aSCy Schubert                 UNITY_OUTPUT_CHAR('n');
107276da39aSCy Schubert             }
108276da39aSCy Schubert             // unprintable characters are shown as codes
109276da39aSCy Schubert             else
110276da39aSCy Schubert             {
111276da39aSCy Schubert                 UNITY_OUTPUT_CHAR('\\');
112276da39aSCy Schubert                 UnityPrintNumberHex((_U_UINT)*pch, 2);
113276da39aSCy Schubert             }
114276da39aSCy Schubert             pch++;
115276da39aSCy Schubert         }
116276da39aSCy Schubert     }
117276da39aSCy Schubert }
118276da39aSCy Schubert 
119276da39aSCy Schubert //-----------------------------------------------
UnityPrintNumberByStyle(const _U_SINT number,const UNITY_DISPLAY_STYLE_T style)120276da39aSCy Schubert void UnityPrintNumberByStyle(const _U_SINT number, const UNITY_DISPLAY_STYLE_T style)
121276da39aSCy Schubert {
122276da39aSCy Schubert     if ((style & UNITY_DISPLAY_RANGE_INT) == UNITY_DISPLAY_RANGE_INT)
123276da39aSCy Schubert     {
124276da39aSCy Schubert         UnityPrintNumber(number);
125276da39aSCy Schubert     }
126276da39aSCy Schubert     else if ((style & UNITY_DISPLAY_RANGE_UINT) == UNITY_DISPLAY_RANGE_UINT)
127276da39aSCy Schubert     {
128276da39aSCy Schubert         UnityPrintNumberUnsigned(  (_U_UINT)number  &  UnitySizeMask[((_U_UINT)style & (_U_UINT)0x0F) - 1]  );
129276da39aSCy Schubert     }
130276da39aSCy Schubert     else
131276da39aSCy Schubert     {
132276da39aSCy Schubert         UnityPrintNumberHex((_U_UINT)number, (char)((style & 0x000F) << 1));
133276da39aSCy Schubert     }
134276da39aSCy Schubert }
135276da39aSCy Schubert 
136276da39aSCy Schubert //-----------------------------------------------
137276da39aSCy Schubert /// basically do an itoa using as little ram as possible
UnityPrintNumber(const _U_SINT number_to_print)138276da39aSCy Schubert void UnityPrintNumber(const _U_SINT number_to_print)
139276da39aSCy Schubert {
140276da39aSCy Schubert     _U_SINT divisor = 1;
141276da39aSCy Schubert     _U_SINT next_divisor;
142276da39aSCy Schubert     _U_UINT number;
143276da39aSCy Schubert 
144276da39aSCy Schubert     if (number_to_print == (1l << (UNITY_LONG_WIDTH-1)))
145276da39aSCy Schubert     {
146276da39aSCy Schubert         //The largest representable negative number
147276da39aSCy Schubert         UNITY_OUTPUT_CHAR('-');
148276da39aSCy Schubert         number = (1ul << (UNITY_LONG_WIDTH-1));
149276da39aSCy Schubert     }
150276da39aSCy Schubert     else if (number_to_print < 0)
151276da39aSCy Schubert     {
152276da39aSCy Schubert         //Some other negative number
153276da39aSCy Schubert         UNITY_OUTPUT_CHAR('-');
154276da39aSCy Schubert         number = (_U_UINT)(-number_to_print);
155276da39aSCy Schubert     }
156276da39aSCy Schubert     else
157276da39aSCy Schubert     {
158276da39aSCy Schubert         //Positive number
159276da39aSCy Schubert         number = (_U_UINT)number_to_print;
160276da39aSCy Schubert     }
161276da39aSCy Schubert 
162276da39aSCy Schubert     // figure out initial divisor
163276da39aSCy Schubert     while (number / divisor > 9)
164276da39aSCy Schubert     {
165276da39aSCy Schubert         next_divisor = divisor * 10;
166276da39aSCy Schubert         if (next_divisor > divisor)
167276da39aSCy Schubert             divisor = next_divisor;
168276da39aSCy Schubert         else
169276da39aSCy Schubert             break;
170276da39aSCy Schubert     }
171276da39aSCy Schubert 
172276da39aSCy Schubert     // now mod and print, then divide divisor
173276da39aSCy Schubert     do
174276da39aSCy Schubert     {
175276da39aSCy Schubert         UNITY_OUTPUT_CHAR((char)('0' + (number / divisor % 10)));
176276da39aSCy Schubert         divisor /= 10;
177276da39aSCy Schubert     }
178276da39aSCy Schubert     while (divisor > 0);
179276da39aSCy Schubert }
180276da39aSCy Schubert 
181276da39aSCy Schubert //-----------------------------------------------
182276da39aSCy Schubert /// basically do an itoa using as little ram as possible
UnityPrintNumberUnsigned(const _U_UINT number)183276da39aSCy Schubert void UnityPrintNumberUnsigned(const _U_UINT number)
184276da39aSCy Schubert {
185276da39aSCy Schubert     _U_UINT divisor = 1;
186276da39aSCy Schubert     _U_UINT next_divisor;
187276da39aSCy Schubert 
188276da39aSCy Schubert     // figure out initial divisor
189276da39aSCy Schubert     while (number / divisor > 9)
190276da39aSCy Schubert     {
191276da39aSCy Schubert         next_divisor = divisor * 10;
192276da39aSCy Schubert         if (next_divisor > divisor)
193276da39aSCy Schubert             divisor = next_divisor;
194276da39aSCy Schubert         else
195276da39aSCy Schubert             break;
196276da39aSCy Schubert     }
197276da39aSCy Schubert 
198276da39aSCy Schubert     // now mod and print, then divide divisor
199276da39aSCy Schubert     do
200276da39aSCy Schubert     {
201276da39aSCy Schubert         UNITY_OUTPUT_CHAR((char)('0' + (number / divisor % 10)));
202276da39aSCy Schubert         divisor /= 10;
203276da39aSCy Schubert     }
204276da39aSCy Schubert     while (divisor > 0);
205276da39aSCy Schubert }
206276da39aSCy Schubert 
207276da39aSCy Schubert //-----------------------------------------------
UnityPrintNumberHex(const _U_UINT number,const char nibbles_to_print)208276da39aSCy Schubert void UnityPrintNumberHex(const _U_UINT number, const char nibbles_to_print)
209276da39aSCy Schubert {
210276da39aSCy Schubert     _U_UINT nibble;
211276da39aSCy Schubert     char nibbles = nibbles_to_print;
212276da39aSCy Schubert     UNITY_OUTPUT_CHAR('0');
213276da39aSCy Schubert     UNITY_OUTPUT_CHAR('x');
214276da39aSCy Schubert 
215276da39aSCy Schubert     while (nibbles > 0)
216276da39aSCy Schubert     {
217276da39aSCy Schubert         nibble = (number >> (--nibbles << 2)) & 0x0000000F;
218276da39aSCy Schubert         if (nibble <= 9)
219276da39aSCy Schubert         {
220276da39aSCy Schubert             UNITY_OUTPUT_CHAR((char)('0' + nibble));
221276da39aSCy Schubert         }
222276da39aSCy Schubert         else
223276da39aSCy Schubert         {
224276da39aSCy Schubert             UNITY_OUTPUT_CHAR((char)('A' - 10 + nibble));
225276da39aSCy Schubert         }
226276da39aSCy Schubert     }
227276da39aSCy Schubert }
228276da39aSCy Schubert 
229276da39aSCy Schubert //-----------------------------------------------
UnityPrintMask(const _U_UINT mask,const _U_UINT number)230276da39aSCy Schubert void UnityPrintMask(const _U_UINT mask, const _U_UINT number)
231276da39aSCy Schubert {
232276da39aSCy Schubert     _U_UINT current_bit = (_U_UINT)1 << (UNITY_INT_WIDTH - 1);
233276da39aSCy Schubert     _US32 i;
234276da39aSCy Schubert 
235276da39aSCy Schubert     for (i = 0; i < UNITY_INT_WIDTH; i++)
236276da39aSCy Schubert     {
237276da39aSCy Schubert         if (current_bit & mask)
238276da39aSCy Schubert         {
239276da39aSCy Schubert             if (current_bit & number)
240276da39aSCy Schubert             {
241276da39aSCy Schubert                 UNITY_OUTPUT_CHAR('1');
242276da39aSCy Schubert             }
243276da39aSCy Schubert             else
244276da39aSCy Schubert             {
245276da39aSCy Schubert                 UNITY_OUTPUT_CHAR('0');
246276da39aSCy Schubert             }
247276da39aSCy Schubert         }
248276da39aSCy Schubert         else
249276da39aSCy Schubert         {
250276da39aSCy Schubert             UNITY_OUTPUT_CHAR('X');
251276da39aSCy Schubert         }
252276da39aSCy Schubert         current_bit = current_bit >> 1;
253276da39aSCy Schubert     }
254276da39aSCy Schubert }
255276da39aSCy Schubert 
256276da39aSCy Schubert //-----------------------------------------------
257276da39aSCy Schubert #ifdef UNITY_FLOAT_VERBOSE
258276da39aSCy Schubert #include <string.h>
UnityPrintFloat(_UF number)259276da39aSCy Schubert void UnityPrintFloat(_UF number)
260276da39aSCy Schubert {
261276da39aSCy Schubert     char TempBuffer[32];
262276da39aSCy Schubert     sprintf(TempBuffer, "%.6f", number);
263276da39aSCy Schubert     UnityPrint(TempBuffer);
264276da39aSCy Schubert }
265276da39aSCy Schubert #endif
266276da39aSCy Schubert 
267276da39aSCy Schubert //-----------------------------------------------
268276da39aSCy Schubert 
UnityPrintFail(void)269276da39aSCy Schubert void UnityPrintFail(void)
270276da39aSCy Schubert {
271276da39aSCy Schubert     UnityPrint(UnityStrFail);
272276da39aSCy Schubert }
273276da39aSCy Schubert 
UnityPrintOk(void)274276da39aSCy Schubert void UnityPrintOk(void)
275276da39aSCy Schubert {
276276da39aSCy Schubert     UnityPrint(UnityStrOk);
277276da39aSCy Schubert }
278276da39aSCy Schubert 
279276da39aSCy Schubert //-----------------------------------------------
UnityTestResultsBegin(const char * file,const UNITY_LINE_TYPE line)280276da39aSCy Schubert static void UnityTestResultsBegin(const char* file, const UNITY_LINE_TYPE line)
281276da39aSCy Schubert {
282276da39aSCy Schubert     UnityPrint(file);
283276da39aSCy Schubert     UNITY_OUTPUT_CHAR(':');
284276da39aSCy Schubert     UnityPrintNumber((_U_SINT)line);
285276da39aSCy Schubert     UNITY_OUTPUT_CHAR(':');
286276da39aSCy Schubert     UnityPrint(Unity.CurrentTestName);
287276da39aSCy Schubert     UNITY_OUTPUT_CHAR(':');
288276da39aSCy Schubert }
289276da39aSCy Schubert 
290276da39aSCy Schubert //-----------------------------------------------
UnityTestResultsFailBegin(const UNITY_LINE_TYPE line)291276da39aSCy Schubert static void UnityTestResultsFailBegin(const UNITY_LINE_TYPE line)
292276da39aSCy Schubert {
293276da39aSCy Schubert     UnityTestResultsBegin(Unity.TestFile, line);
294276da39aSCy Schubert 	if (Unity.isExpectingFail)
295276da39aSCy Schubert 	{
296276da39aSCy Schubert 		UnityPrint(UnityStrXFAIL);
297276da39aSCy Schubert 	}
298276da39aSCy Schubert 	else
299276da39aSCy Schubert 	{
300276da39aSCy Schubert 		UnityPrint(UnityStrFail);
301276da39aSCy Schubert 	}
302276da39aSCy Schubert 
303276da39aSCy Schubert     UNITY_OUTPUT_CHAR(':');
304276da39aSCy Schubert }
305276da39aSCy Schubert 
306276da39aSCy Schubert //-----------------------------------------------
UnityConcludeTest(void)307276da39aSCy Schubert void UnityConcludeTest(void)
308276da39aSCy Schubert {
309276da39aSCy Schubert #if 0
310276da39aSCy Schubert 	if (Unity.isExpectingFail == 1 && Unity.CurrentTestFailed == 0)
311276da39aSCy Schubert 	{
312276da39aSCy Schubert 		printf("FAIL WAS EXPECTED, BUT IT DIDN'T HAPPEN?!");
313276da39aSCy Schubert 		Unity.TestXPASSES++;
314276da39aSCy Schubert 	}
315276da39aSCy Schubert 
316276da39aSCy Schubert 	else
317276da39aSCy Schubert #endif
318276da39aSCy Schubert 	//cant be ignored and accepting fail at the same time!
319276da39aSCy Schubert 	if (Unity.isExpectingFail == 1 && Unity.CurrentTestFailed == 1)
320276da39aSCy Schubert 	{
321276da39aSCy Schubert 		Unity.TestXFAILS++; //error message?!
322276da39aSCy Schubert 		if (Unity.XFAILMessage != NULL)
323276da39aSCy Schubert 		{
324276da39aSCy Schubert 			if (Unity.XFAILMessage[0] != ' ')
325276da39aSCy Schubert 			{
326276da39aSCy Schubert 				printf(" ");
327276da39aSCy Schubert 			}
328276da39aSCy Schubert 
329276da39aSCy Schubert 			printf("| ");
330*9034852cSGleb Smirnoff 			printf("%s", Unity.XFAILMessage);
331276da39aSCy Schubert 			Unity.XFAILMessage = NULL;
332276da39aSCy Schubert 		}
333276da39aSCy Schubert 		else
334276da39aSCy Schubert 		{
335276da39aSCy Schubert 			printf(" - EXPECTED FAIL!");
336276da39aSCy Schubert 		}
337276da39aSCy Schubert 	}
338276da39aSCy Schubert 	else
339276da39aSCy Schubert 
340276da39aSCy Schubert     if (Unity.CurrentTestIgnored)
341276da39aSCy Schubert     {
342276da39aSCy Schubert         Unity.TestIgnores++;
343276da39aSCy Schubert     }
344276da39aSCy Schubert     else if (!Unity.CurrentTestFailed)
345276da39aSCy Schubert     {
346276da39aSCy Schubert 	if(Unity.isExpectingFail == 0) {
347276da39aSCy Schubert 		UnityTestResultsBegin(Unity.TestFile, Unity.CurrentTestLineNumber);
348276da39aSCy Schubert 		UnityPrint(UnityStrPass);
349276da39aSCy Schubert 		Unity.TestPasses++;
350276da39aSCy Schubert 	}
351276da39aSCy Schubert 
352276da39aSCy Schubert 	//probably should remove the if... part
353276da39aSCy Schubert 	else if (Unity.isExpectingFail == 1 && Unity.CurrentTestFailed == 0)
354276da39aSCy Schubert 	{
355276da39aSCy Schubert 
356276da39aSCy Schubert 		UnityTestResultsBegin(Unity.TestFile, Unity.CurrentTestLineNumber);
357276da39aSCy Schubert 		UnityPrint(UnityStrXPASS);
358276da39aSCy Schubert 		Unity.TestXPASSES++;
359276da39aSCy Schubert 
360276da39aSCy Schubert 		printf(" - FAIL WAS EXPECTED, BUT DIDN'T HAPPEN?!");
361276da39aSCy Schubert 		//if (Unity.TestPasses > 0) { Unity.TestPasses--; }
362276da39aSCy Schubert 	}
363276da39aSCy Schubert     }
364276da39aSCy Schubert     else
365276da39aSCy Schubert     {
366276da39aSCy Schubert         Unity.TestFailures++;
367276da39aSCy Schubert     }
368276da39aSCy Schubert 
369276da39aSCy Schubert     Unity.CurrentTestFailed = 0;
370276da39aSCy Schubert     Unity.CurrentTestIgnored = 0;
371276da39aSCy Schubert     Unity.isExpectingFail = 0;
372276da39aSCy Schubert 
373276da39aSCy Schubert     UNITY_PRINT_EOL;
374276da39aSCy Schubert }
375276da39aSCy Schubert 
376276da39aSCy Schubert //-----------------------------------------------
UnityAddMsgIfSpecified(const char * msg)377276da39aSCy Schubert static void UnityAddMsgIfSpecified(const char* msg)
378276da39aSCy Schubert {
379276da39aSCy Schubert     if (msg)
380276da39aSCy Schubert     {
381276da39aSCy Schubert         UnityPrint(UnityStrSpacer);
382276da39aSCy Schubert         UnityPrint(msg);
383276da39aSCy Schubert     }
384276da39aSCy Schubert }
385276da39aSCy Schubert 
386276da39aSCy Schubert //-----------------------------------------------
UnityPrintExpectedAndActualStrings(const char * expected,const char * actual)387276da39aSCy Schubert static void UnityPrintExpectedAndActualStrings(const char* expected, const char* actual)
388276da39aSCy Schubert {
389276da39aSCy Schubert     UnityPrint(UnityStrExpected);
390276da39aSCy Schubert     if (expected != NULL)
391276da39aSCy Schubert     {
392276da39aSCy Schubert         UNITY_OUTPUT_CHAR('\'');
393276da39aSCy Schubert         UnityPrint(expected);
394276da39aSCy Schubert         UNITY_OUTPUT_CHAR('\'');
395276da39aSCy Schubert     }
396276da39aSCy Schubert     else
397276da39aSCy Schubert     {
398276da39aSCy Schubert       UnityPrint(UnityStrNull);
399276da39aSCy Schubert     }
400276da39aSCy Schubert     UnityPrint(UnityStrWas);
401276da39aSCy Schubert     if (actual != NULL)
402276da39aSCy Schubert     {
403276da39aSCy Schubert         UNITY_OUTPUT_CHAR('\'');
404276da39aSCy Schubert         UnityPrint(actual);
405276da39aSCy Schubert         UNITY_OUTPUT_CHAR('\'');
406276da39aSCy Schubert     }
407276da39aSCy Schubert     else
408276da39aSCy Schubert     {
409276da39aSCy Schubert       UnityPrint(UnityStrNull);
410276da39aSCy Schubert     }
411276da39aSCy Schubert }
412276da39aSCy Schubert 
413276da39aSCy Schubert //-----------------------------------------------
414276da39aSCy Schubert // Assertion & Control Helpers
415276da39aSCy Schubert //-----------------------------------------------
416276da39aSCy Schubert 
UnityCheckArraysForNull(UNITY_PTR_ATTRIBUTE const void * expected,UNITY_PTR_ATTRIBUTE const void * actual,const UNITY_LINE_TYPE lineNumber,const char * msg)417276da39aSCy Schubert static int UnityCheckArraysForNull(UNITY_PTR_ATTRIBUTE const void* expected, UNITY_PTR_ATTRIBUTE const void* actual, const UNITY_LINE_TYPE lineNumber, const char* msg)
418276da39aSCy Schubert {
419276da39aSCy Schubert     //return true if they are both NULL
420276da39aSCy Schubert     if ((expected == NULL) && (actual == NULL))
421276da39aSCy Schubert         return 1;
422276da39aSCy Schubert 
423276da39aSCy Schubert     //throw error if just expected is NULL
424276da39aSCy Schubert     if (expected == NULL)
425276da39aSCy Schubert     {
426276da39aSCy Schubert         UnityTestResultsFailBegin(lineNumber);
427276da39aSCy Schubert         UnityPrint(UnityStrNullPointerForExpected);
428276da39aSCy Schubert         UnityAddMsgIfSpecified(msg);
429276da39aSCy Schubert         UNITY_FAIL_AND_BAIL;
430276da39aSCy Schubert     }
431276da39aSCy Schubert 
432276da39aSCy Schubert     //throw error if just actual is NULL
433276da39aSCy Schubert     if (actual == NULL)
434276da39aSCy Schubert     {
435276da39aSCy Schubert         UnityTestResultsFailBegin(lineNumber);
436276da39aSCy Schubert         UnityPrint(UnityStrNullPointerForActual);
437276da39aSCy Schubert         UnityAddMsgIfSpecified(msg);
438276da39aSCy Schubert         UNITY_FAIL_AND_BAIL;
439276da39aSCy Schubert     }
440276da39aSCy Schubert 
441276da39aSCy Schubert     //return false if neither is NULL
442276da39aSCy Schubert     return 0;
443276da39aSCy Schubert }
444276da39aSCy Schubert 
445276da39aSCy Schubert //-----------------------------------------------
446276da39aSCy Schubert // Assertion Functions
447276da39aSCy Schubert //-----------------------------------------------
448276da39aSCy Schubert 
UnityAssertBits(const _U_SINT mask,const _U_SINT expected,const _U_SINT actual,const char * msg,const UNITY_LINE_TYPE lineNumber)449276da39aSCy Schubert void UnityAssertBits(const _U_SINT mask,
450276da39aSCy Schubert                      const _U_SINT expected,
451276da39aSCy Schubert                      const _U_SINT actual,
452276da39aSCy Schubert                      const char* msg,
453276da39aSCy Schubert                      const UNITY_LINE_TYPE lineNumber)
454276da39aSCy Schubert {
455276da39aSCy Schubert     UNITY_SKIP_EXECUTION;
456276da39aSCy Schubert 
457276da39aSCy Schubert     if ((mask & expected) != (mask & actual))
458276da39aSCy Schubert     {
459276da39aSCy Schubert         UnityTestResultsFailBegin(lineNumber);
460276da39aSCy Schubert         UnityPrint(UnityStrExpected);
461276da39aSCy Schubert         UnityPrintMask((_U_UINT)mask, (_U_UINT)expected);
462276da39aSCy Schubert         UnityPrint(UnityStrWas);
463276da39aSCy Schubert         UnityPrintMask((_U_UINT)mask, (_U_UINT)actual);
464276da39aSCy Schubert         UnityAddMsgIfSpecified(msg);
465276da39aSCy Schubert         UNITY_FAIL_AND_BAIL;
466276da39aSCy Schubert     }
467276da39aSCy Schubert }
468276da39aSCy Schubert 
469276da39aSCy Schubert //-----------------------------------------------
UnityAssertEqualNumber(const _U_SINT expected,const _U_SINT actual,const char * msg,const UNITY_LINE_TYPE lineNumber,const UNITY_DISPLAY_STYLE_T style)470276da39aSCy Schubert void UnityAssertEqualNumber(const _U_SINT expected,
471276da39aSCy Schubert                             const _U_SINT actual,
472276da39aSCy Schubert                             const char* msg,
473276da39aSCy Schubert                             const UNITY_LINE_TYPE lineNumber,
474276da39aSCy Schubert                             const UNITY_DISPLAY_STYLE_T style)
475276da39aSCy Schubert {
476276da39aSCy Schubert     UNITY_SKIP_EXECUTION;
477276da39aSCy Schubert 
478276da39aSCy Schubert     if (expected != actual)
479276da39aSCy Schubert     {
480276da39aSCy Schubert         UnityTestResultsFailBegin(lineNumber);
481276da39aSCy Schubert         UnityPrint(UnityStrExpected);
482276da39aSCy Schubert         UnityPrintNumberByStyle(expected, style);
483276da39aSCy Schubert         UnityPrint(UnityStrWas);
484276da39aSCy Schubert         UnityPrintNumberByStyle(actual, style);
485276da39aSCy Schubert         UnityAddMsgIfSpecified(msg);
486276da39aSCy Schubert         UNITY_FAIL_AND_BAIL;
487276da39aSCy Schubert     }
488276da39aSCy Schubert }
489276da39aSCy Schubert 
490276da39aSCy Schubert //-----------------------------------------------
UnityAssertEqualIntArray(UNITY_PTR_ATTRIBUTE const void * expected,UNITY_PTR_ATTRIBUTE const void * actual,const _UU32 num_elements,const char * msg,const UNITY_LINE_TYPE lineNumber,const UNITY_DISPLAY_STYLE_T style)491276da39aSCy Schubert void UnityAssertEqualIntArray(UNITY_PTR_ATTRIBUTE const void* expected,
492276da39aSCy Schubert                               UNITY_PTR_ATTRIBUTE const void* actual,
493276da39aSCy Schubert                               const _UU32 num_elements,
494276da39aSCy Schubert                               const char* msg,
495276da39aSCy Schubert                               const UNITY_LINE_TYPE lineNumber,
496276da39aSCy Schubert                               const UNITY_DISPLAY_STYLE_T style)
497276da39aSCy Schubert {
498276da39aSCy Schubert     _UU32 elements = num_elements;
499276da39aSCy Schubert     UNITY_PTR_ATTRIBUTE const _US8* ptr_exp = (UNITY_PTR_ATTRIBUTE const _US8*)expected;
500276da39aSCy Schubert     UNITY_PTR_ATTRIBUTE const _US8* ptr_act = (UNITY_PTR_ATTRIBUTE const _US8*)actual;
501276da39aSCy Schubert 
502276da39aSCy Schubert     UNITY_SKIP_EXECUTION;
503276da39aSCy Schubert 
504276da39aSCy Schubert     if (elements == 0)
505276da39aSCy Schubert     {
506276da39aSCy Schubert         UnityTestResultsFailBegin(lineNumber);
507276da39aSCy Schubert         UnityPrint(UnityStrPointless);
508276da39aSCy Schubert         UnityAddMsgIfSpecified(msg);
509276da39aSCy Schubert         UNITY_FAIL_AND_BAIL;
510276da39aSCy Schubert     }
511276da39aSCy Schubert 
512276da39aSCy Schubert     if (UnityCheckArraysForNull((UNITY_PTR_ATTRIBUTE const void*)expected, (UNITY_PTR_ATTRIBUTE const void*)actual, lineNumber, msg) == 1)
513276da39aSCy Schubert         return;
514276da39aSCy Schubert 
515276da39aSCy Schubert     // If style is UNITY_DISPLAY_STYLE_INT, we'll fall into the default case rather than the INT16 or INT32 (etc) case
516276da39aSCy Schubert     // as UNITY_DISPLAY_STYLE_INT includes a flag for UNITY_DISPLAY_RANGE_AUTO, which the width-specific
517276da39aSCy Schubert     // variants do not. Therefore remove this flag.
518276da39aSCy Schubert     switch(style & (UNITY_DISPLAY_STYLE_T)(~UNITY_DISPLAY_RANGE_AUTO))
519276da39aSCy Schubert     {
520276da39aSCy Schubert         case UNITY_DISPLAY_STYLE_HEX8:
521276da39aSCy Schubert         case UNITY_DISPLAY_STYLE_INT8:
522276da39aSCy Schubert         case UNITY_DISPLAY_STYLE_UINT8:
523276da39aSCy Schubert             while (elements--)
524276da39aSCy Schubert             {
525276da39aSCy Schubert                 if (*ptr_exp != *ptr_act)
526276da39aSCy Schubert                 {
527276da39aSCy Schubert                     UnityTestResultsFailBegin(lineNumber);
528276da39aSCy Schubert                     UnityPrint(UnityStrElement);
529276da39aSCy Schubert                     UnityPrintNumberByStyle((num_elements - elements - 1), UNITY_DISPLAY_STYLE_UINT);
530276da39aSCy Schubert                     UnityPrint(UnityStrExpected);
531276da39aSCy Schubert                     UnityPrintNumberByStyle(*ptr_exp, style);
532276da39aSCy Schubert                     UnityPrint(UnityStrWas);
533276da39aSCy Schubert                     UnityPrintNumberByStyle(*ptr_act, style);
534276da39aSCy Schubert                     UnityAddMsgIfSpecified(msg);
535276da39aSCy Schubert                     UNITY_FAIL_AND_BAIL;
536276da39aSCy Schubert                 }
537276da39aSCy Schubert                 ptr_exp += 1;
538276da39aSCy Schubert                 ptr_act += 1;
539276da39aSCy Schubert             }
540276da39aSCy Schubert             break;
541276da39aSCy Schubert         case UNITY_DISPLAY_STYLE_HEX16:
542276da39aSCy Schubert         case UNITY_DISPLAY_STYLE_INT16:
543276da39aSCy Schubert         case UNITY_DISPLAY_STYLE_UINT16:
544276da39aSCy Schubert             while (elements--)
545276da39aSCy Schubert             {
546276da39aSCy Schubert                 if (*(UNITY_PTR_ATTRIBUTE const _US16*)(void*)ptr_exp != *(UNITY_PTR_ATTRIBUTE const _US16*)(void*)ptr_act)
547276da39aSCy Schubert                 {
548276da39aSCy Schubert                     UnityTestResultsFailBegin(lineNumber);
549276da39aSCy Schubert                     UnityPrint(UnityStrElement);
550276da39aSCy Schubert                     UnityPrintNumberByStyle((num_elements - elements - 1), UNITY_DISPLAY_STYLE_UINT);
551276da39aSCy Schubert                     UnityPrint(UnityStrExpected);
552276da39aSCy Schubert                     UnityPrintNumberByStyle(*(UNITY_PTR_ATTRIBUTE const _US16*)(void*)ptr_exp, style);
553276da39aSCy Schubert                     UnityPrint(UnityStrWas);
554276da39aSCy Schubert                     UnityPrintNumberByStyle(*(UNITY_PTR_ATTRIBUTE const _US16*)(void*)ptr_act, style);
555276da39aSCy Schubert                     UnityAddMsgIfSpecified(msg);
556276da39aSCy Schubert                     UNITY_FAIL_AND_BAIL;
557276da39aSCy Schubert                 }
558276da39aSCy Schubert                 ptr_exp += 2;
559276da39aSCy Schubert                 ptr_act += 2;
560276da39aSCy Schubert             }
561276da39aSCy Schubert             break;
562276da39aSCy Schubert #ifdef UNITY_SUPPORT_64
563276da39aSCy Schubert         case UNITY_DISPLAY_STYLE_HEX64:
564276da39aSCy Schubert         case UNITY_DISPLAY_STYLE_INT64:
565276da39aSCy Schubert         case UNITY_DISPLAY_STYLE_UINT64:
566276da39aSCy Schubert             while (elements--)
567276da39aSCy Schubert             {
568276da39aSCy Schubert                 if (*(UNITY_PTR_ATTRIBUTE const _US64*)(void*)ptr_exp != *(UNITY_PTR_ATTRIBUTE const _US64*)(void*)ptr_act)
569276da39aSCy Schubert                 {
570276da39aSCy Schubert                     UnityTestResultsFailBegin(lineNumber);
571276da39aSCy Schubert                     UnityPrint(UnityStrElement);
572276da39aSCy Schubert                     UnityPrintNumberByStyle((num_elements - elements - 1), UNITY_DISPLAY_STYLE_UINT);
573276da39aSCy Schubert                     UnityPrint(UnityStrExpected);
574276da39aSCy Schubert                     UnityPrintNumberByStyle(*(UNITY_PTR_ATTRIBUTE const _US64*)(void*)ptr_exp, style);
575276da39aSCy Schubert                     UnityPrint(UnityStrWas);
576276da39aSCy Schubert                     UnityPrintNumberByStyle(*(UNITY_PTR_ATTRIBUTE const _US64*)(void*)ptr_act, style);
577276da39aSCy Schubert                     UnityAddMsgIfSpecified(msg);
578276da39aSCy Schubert                     UNITY_FAIL_AND_BAIL;
579276da39aSCy Schubert                 }
580276da39aSCy Schubert                 ptr_exp += 8;
581276da39aSCy Schubert                 ptr_act += 8;
582276da39aSCy Schubert             }
583276da39aSCy Schubert             break;
584276da39aSCy Schubert #endif
585276da39aSCy Schubert         default:
586276da39aSCy Schubert             while (elements--)
587276da39aSCy Schubert             {
588276da39aSCy Schubert                 if (*(UNITY_PTR_ATTRIBUTE const _US32*)(void*)ptr_exp != *(UNITY_PTR_ATTRIBUTE const _US32*)(void*)ptr_act)
589276da39aSCy Schubert                 {
590276da39aSCy Schubert                     UnityTestResultsFailBegin(lineNumber);
591276da39aSCy Schubert                     UnityPrint(UnityStrElement);
592276da39aSCy Schubert                     UnityPrintNumberByStyle((num_elements - elements - 1), UNITY_DISPLAY_STYLE_UINT);
593276da39aSCy Schubert                     UnityPrint(UnityStrExpected);
594276da39aSCy Schubert                     UnityPrintNumberByStyle(*(UNITY_PTR_ATTRIBUTE const _US32*)(void*)ptr_exp, style);
595276da39aSCy Schubert                     UnityPrint(UnityStrWas);
596276da39aSCy Schubert                     UnityPrintNumberByStyle(*(UNITY_PTR_ATTRIBUTE const _US32*)(void*)ptr_act, style);
597276da39aSCy Schubert                     UnityAddMsgIfSpecified(msg);
598276da39aSCy Schubert                     UNITY_FAIL_AND_BAIL;
599276da39aSCy Schubert                 }
600276da39aSCy Schubert                 ptr_exp += 4;
601276da39aSCy Schubert                 ptr_act += 4;
602276da39aSCy Schubert             }
603276da39aSCy Schubert             break;
604276da39aSCy Schubert     }
605276da39aSCy Schubert }
606276da39aSCy Schubert 
607276da39aSCy Schubert //-----------------------------------------------
608276da39aSCy Schubert #ifndef UNITY_EXCLUDE_FLOAT
UnityAssertEqualFloatArray(UNITY_PTR_ATTRIBUTE const _UF * expected,UNITY_PTR_ATTRIBUTE const _UF * actual,const _UU32 num_elements,const char * msg,const UNITY_LINE_TYPE lineNumber)609276da39aSCy Schubert void UnityAssertEqualFloatArray(UNITY_PTR_ATTRIBUTE const _UF* expected,
610276da39aSCy Schubert                                 UNITY_PTR_ATTRIBUTE const _UF* actual,
611276da39aSCy Schubert                                 const _UU32 num_elements,
612276da39aSCy Schubert                                 const char* msg,
613276da39aSCy Schubert                                 const UNITY_LINE_TYPE lineNumber)
614276da39aSCy Schubert {
615276da39aSCy Schubert     _UU32 elements = num_elements;
616276da39aSCy Schubert     UNITY_PTR_ATTRIBUTE const _UF* ptr_expected = expected;
617276da39aSCy Schubert     UNITY_PTR_ATTRIBUTE const _UF* ptr_actual = actual;
618276da39aSCy Schubert     _UF diff, tol;
619276da39aSCy Schubert 
620276da39aSCy Schubert     UNITY_SKIP_EXECUTION;
621276da39aSCy Schubert 
622276da39aSCy Schubert     if (elements == 0)
623276da39aSCy Schubert     {
624276da39aSCy Schubert         UnityTestResultsFailBegin(lineNumber);
625276da39aSCy Schubert         UnityPrint(UnityStrPointless);
626276da39aSCy Schubert         UnityAddMsgIfSpecified(msg);
627276da39aSCy Schubert         UNITY_FAIL_AND_BAIL;
628276da39aSCy Schubert     }
629276da39aSCy Schubert 
630276da39aSCy Schubert     if (UnityCheckArraysForNull((UNITY_PTR_ATTRIBUTE const void*)expected, (UNITY_PTR_ATTRIBUTE const void*)actual, lineNumber, msg) == 1)
631276da39aSCy Schubert         return;
632276da39aSCy Schubert 
633276da39aSCy Schubert     while (elements--)
634276da39aSCy Schubert     {
635276da39aSCy Schubert         diff = *ptr_expected - *ptr_actual;
636276da39aSCy Schubert         if (diff < 0.0f)
637276da39aSCy Schubert           diff = 0.0f - diff;
638276da39aSCy Schubert         tol = UNITY_FLOAT_PRECISION * *ptr_expected;
639276da39aSCy Schubert         if (tol < 0.0f)
640276da39aSCy Schubert             tol = 0.0f - tol;
641276da39aSCy Schubert 
642276da39aSCy Schubert         //This first part of this condition will catch any NaN or Infinite values
643276da39aSCy Schubert         if ((diff * 0.0f != 0.0f) || (diff > tol))
644276da39aSCy Schubert         {
645276da39aSCy Schubert             UnityTestResultsFailBegin(lineNumber);
646276da39aSCy Schubert             UnityPrint(UnityStrElement);
647276da39aSCy Schubert             UnityPrintNumberByStyle((num_elements - elements - 1), UNITY_DISPLAY_STYLE_UINT);
648276da39aSCy Schubert #ifdef UNITY_FLOAT_VERBOSE
649276da39aSCy Schubert             UnityPrint(UnityStrExpected);
650276da39aSCy Schubert             UnityPrintFloat(*ptr_expected);
651276da39aSCy Schubert             UnityPrint(UnityStrWas);
652276da39aSCy Schubert             UnityPrintFloat(*ptr_actual);
653276da39aSCy Schubert #else
654276da39aSCy Schubert             UnityPrint(UnityStrDelta);
655276da39aSCy Schubert #endif
656276da39aSCy Schubert             UnityAddMsgIfSpecified(msg);
657276da39aSCy Schubert             UNITY_FAIL_AND_BAIL;
658276da39aSCy Schubert         }
659276da39aSCy Schubert         ptr_expected++;
660276da39aSCy Schubert         ptr_actual++;
661276da39aSCy Schubert     }
662276da39aSCy Schubert }
663276da39aSCy Schubert 
664276da39aSCy Schubert //-----------------------------------------------
UnityAssertFloatsWithin(const _UF delta,const _UF expected,const _UF actual,const char * msg,const UNITY_LINE_TYPE lineNumber)665276da39aSCy Schubert void UnityAssertFloatsWithin(const _UF delta,
666276da39aSCy Schubert                              const _UF expected,
667276da39aSCy Schubert                              const _UF actual,
668276da39aSCy Schubert                              const char* msg,
669276da39aSCy Schubert                              const UNITY_LINE_TYPE lineNumber)
670276da39aSCy Schubert {
671276da39aSCy Schubert     _UF diff = actual - expected;
672276da39aSCy Schubert     _UF pos_delta = delta;
673276da39aSCy Schubert 
674276da39aSCy Schubert     UNITY_SKIP_EXECUTION;
675276da39aSCy Schubert 
676276da39aSCy Schubert     if (diff < 0.0f)
677276da39aSCy Schubert     {
678276da39aSCy Schubert         diff = 0.0f - diff;
679276da39aSCy Schubert     }
680276da39aSCy Schubert     if (pos_delta < 0.0f)
681276da39aSCy Schubert     {
682276da39aSCy Schubert         pos_delta = 0.0f - pos_delta;
683276da39aSCy Schubert     }
684276da39aSCy Schubert 
685276da39aSCy Schubert     //This first part of this condition will catch any NaN or Infinite values
686276da39aSCy Schubert     if ((diff * 0.0f != 0.0f) || (pos_delta < diff))
687276da39aSCy Schubert     {
688276da39aSCy Schubert         UnityTestResultsFailBegin(lineNumber);
689276da39aSCy Schubert #ifdef UNITY_FLOAT_VERBOSE
690276da39aSCy Schubert         UnityPrint(UnityStrExpected);
691276da39aSCy Schubert         UnityPrintFloat(expected);
692276da39aSCy Schubert         UnityPrint(UnityStrWas);
693276da39aSCy Schubert         UnityPrintFloat(actual);
694276da39aSCy Schubert #else
695276da39aSCy Schubert         UnityPrint(UnityStrDelta);
696276da39aSCy Schubert #endif
697276da39aSCy Schubert         UnityAddMsgIfSpecified(msg);
698276da39aSCy Schubert         UNITY_FAIL_AND_BAIL;
699276da39aSCy Schubert     }
700276da39aSCy Schubert }
701276da39aSCy Schubert 
702276da39aSCy Schubert //-----------------------------------------------
UnityAssertFloatSpecial(const _UF actual,const char * msg,const UNITY_LINE_TYPE lineNumber,const UNITY_FLOAT_TRAIT_T style)703276da39aSCy Schubert void UnityAssertFloatSpecial(const _UF actual,
704276da39aSCy Schubert                              const char* msg,
705276da39aSCy Schubert                              const UNITY_LINE_TYPE lineNumber,
706276da39aSCy Schubert                              const UNITY_FLOAT_TRAIT_T style)
707276da39aSCy Schubert {
708276da39aSCy Schubert     const char* trait_names[] = { UnityStrInf, UnityStrNegInf, UnityStrNaN, UnityStrDet };
709276da39aSCy Schubert     _U_SINT should_be_trait   = ((_U_SINT)style & 1);
710276da39aSCy Schubert     _U_SINT is_trait          = !should_be_trait;
711276da39aSCy Schubert     _U_SINT trait_index       = style >> 1;
712276da39aSCy Schubert 
713276da39aSCy Schubert     UNITY_SKIP_EXECUTION;
714276da39aSCy Schubert 
715276da39aSCy Schubert     switch(style)
716276da39aSCy Schubert     {
717276da39aSCy Schubert         //To determine Inf / Neg Inf, we compare to an Inf / Neg Inf value we create on the fly
718276da39aSCy Schubert         //We are using a variable to hold the zero value because some compilers complain about dividing by zero otherwise
719276da39aSCy Schubert         case UNITY_FLOAT_IS_INF:
720276da39aSCy Schubert         case UNITY_FLOAT_IS_NOT_INF:
721276da39aSCy Schubert             is_trait = ((1.0f / f_zero) == actual) ? 1 : 0;
722276da39aSCy Schubert             break;
723276da39aSCy Schubert         case UNITY_FLOAT_IS_NEG_INF:
724276da39aSCy Schubert         case UNITY_FLOAT_IS_NOT_NEG_INF:
725276da39aSCy Schubert             is_trait = ((-1.0f / f_zero) == actual) ? 1 : 0;
726276da39aSCy Schubert             break;
727276da39aSCy Schubert 
728276da39aSCy Schubert         //NaN is the only floating point value that does NOT equal itself. Therefore if Actual == Actual, then it is NOT NaN.
729276da39aSCy Schubert         case UNITY_FLOAT_IS_NAN:
730276da39aSCy Schubert         case UNITY_FLOAT_IS_NOT_NAN:
731276da39aSCy Schubert             is_trait = (actual == actual) ? 0 : 1;
732276da39aSCy Schubert             break;
733276da39aSCy Schubert 
734276da39aSCy Schubert         //A determinate number is non infinite and not NaN. (therefore the opposite of the two above)
735276da39aSCy Schubert         case UNITY_FLOAT_IS_DET:
736276da39aSCy Schubert         case UNITY_FLOAT_IS_NOT_DET:
737276da39aSCy Schubert             if ( (actual != actual) || ((1.0f / f_zero) == actual) || ((-1.0f / f_zero) == actual) )
738276da39aSCy Schubert                 is_trait = 0;
739276da39aSCy Schubert             else
740276da39aSCy Schubert                 is_trait = 1;
741276da39aSCy Schubert             break;
742276da39aSCy Schubert 	default:
743276da39aSCy Schubert 	    ;
744276da39aSCy Schubert     }
745276da39aSCy Schubert 
746276da39aSCy Schubert     if (is_trait != should_be_trait)
747276da39aSCy Schubert     {
748276da39aSCy Schubert         UnityTestResultsFailBegin(lineNumber);
749276da39aSCy Schubert         UnityPrint(UnityStrExpected);
750276da39aSCy Schubert         if (!should_be_trait)
751276da39aSCy Schubert             UnityPrint(UnityStrNot);
752276da39aSCy Schubert         UnityPrint(trait_names[trait_index]);
753276da39aSCy Schubert         UnityPrint(UnityStrWas);
754276da39aSCy Schubert #ifdef UNITY_FLOAT_VERBOSE
755276da39aSCy Schubert         UnityPrintFloat(actual);
756276da39aSCy Schubert #else
757276da39aSCy Schubert         if (should_be_trait)
758276da39aSCy Schubert             UnityPrint(UnityStrNot);
759276da39aSCy Schubert         UnityPrint(trait_names[trait_index]);
760276da39aSCy Schubert #endif
761276da39aSCy Schubert         UnityAddMsgIfSpecified(msg);
762276da39aSCy Schubert         UNITY_FAIL_AND_BAIL;
763276da39aSCy Schubert     }
764276da39aSCy Schubert }
765276da39aSCy Schubert 
766276da39aSCy Schubert #endif //not UNITY_EXCLUDE_FLOAT
767276da39aSCy Schubert 
768276da39aSCy Schubert //-----------------------------------------------
769276da39aSCy Schubert #ifndef UNITY_EXCLUDE_DOUBLE
UnityAssertEqualDoubleArray(UNITY_PTR_ATTRIBUTE const _UD * expected,UNITY_PTR_ATTRIBUTE const _UD * actual,const _UU32 num_elements,const char * msg,const UNITY_LINE_TYPE lineNumber)770276da39aSCy Schubert void UnityAssertEqualDoubleArray(UNITY_PTR_ATTRIBUTE const _UD* expected,
771276da39aSCy Schubert                                  UNITY_PTR_ATTRIBUTE const _UD* actual,
772276da39aSCy Schubert                                  const _UU32 num_elements,
773276da39aSCy Schubert                                  const char* msg,
774276da39aSCy Schubert                                  const UNITY_LINE_TYPE lineNumber)
775276da39aSCy Schubert {
776276da39aSCy Schubert     _UU32 elements = num_elements;
777276da39aSCy Schubert     UNITY_PTR_ATTRIBUTE const _UD* ptr_expected = expected;
778276da39aSCy Schubert     UNITY_PTR_ATTRIBUTE const _UD* ptr_actual = actual;
779276da39aSCy Schubert     _UD diff, tol;
780276da39aSCy Schubert 
781276da39aSCy Schubert     UNITY_SKIP_EXECUTION;
782276da39aSCy Schubert 
783276da39aSCy Schubert     if (elements == 0)
784276da39aSCy Schubert     {
785276da39aSCy Schubert         UnityTestResultsFailBegin(lineNumber);
786276da39aSCy Schubert         UnityPrint(UnityStrPointless);
787276da39aSCy Schubert         UnityAddMsgIfSpecified(msg);
788276da39aSCy Schubert         UNITY_FAIL_AND_BAIL;
789276da39aSCy Schubert     }
790276da39aSCy Schubert 
791276da39aSCy Schubert     if (UnityCheckArraysForNull((UNITY_PTR_ATTRIBUTE void*)expected, (UNITY_PTR_ATTRIBUTE void*)actual, lineNumber, msg) == 1)
792276da39aSCy Schubert         return;
793276da39aSCy Schubert 
794276da39aSCy Schubert     while (elements--)
795276da39aSCy Schubert     {
796276da39aSCy Schubert         diff = *ptr_expected - *ptr_actual;
797276da39aSCy Schubert         if (diff < 0.0)
798276da39aSCy Schubert           diff = 0.0 - diff;
799276da39aSCy Schubert         tol = UNITY_DOUBLE_PRECISION * *ptr_expected;
800276da39aSCy Schubert         if (tol < 0.0)
801276da39aSCy Schubert             tol = 0.0 - tol;
802276da39aSCy Schubert 
803276da39aSCy Schubert         //This first part of this condition will catch any NaN or Infinite values
804276da39aSCy Schubert         if ((diff * 0.0 != 0.0) || (diff > tol))
805276da39aSCy Schubert         {
806276da39aSCy Schubert             UnityTestResultsFailBegin(lineNumber);
807276da39aSCy Schubert             UnityPrint(UnityStrElement);
808276da39aSCy Schubert             UnityPrintNumberByStyle((num_elements - elements - 1), UNITY_DISPLAY_STYLE_UINT);
809276da39aSCy Schubert #ifdef UNITY_DOUBLE_VERBOSE
810276da39aSCy Schubert             UnityPrint(UnityStrExpected);
811276da39aSCy Schubert             UnityPrintFloat((float)(*ptr_expected));
812276da39aSCy Schubert             UnityPrint(UnityStrWas);
813276da39aSCy Schubert             UnityPrintFloat((float)(*ptr_actual));
814276da39aSCy Schubert #else
815276da39aSCy Schubert             UnityPrint(UnityStrDelta);
816276da39aSCy Schubert #endif
817276da39aSCy Schubert             UnityAddMsgIfSpecified(msg);
818276da39aSCy Schubert             UNITY_FAIL_AND_BAIL;
819276da39aSCy Schubert         }
820276da39aSCy Schubert         ptr_expected++;
821276da39aSCy Schubert         ptr_actual++;
822276da39aSCy Schubert     }
823276da39aSCy Schubert }
824276da39aSCy Schubert 
825276da39aSCy Schubert //-----------------------------------------------
UnityAssertDoublesWithin(const _UD delta,const _UD expected,const _UD actual,const char * msg,const UNITY_LINE_TYPE lineNumber)826276da39aSCy Schubert void UnityAssertDoublesWithin(const _UD delta,
827276da39aSCy Schubert                               const _UD expected,
828276da39aSCy Schubert                               const _UD actual,
829276da39aSCy Schubert                               const char* msg,
830276da39aSCy Schubert                               const UNITY_LINE_TYPE lineNumber)
831276da39aSCy Schubert {
832276da39aSCy Schubert     _UD diff = actual - expected;
833276da39aSCy Schubert     _UD pos_delta = delta;
834276da39aSCy Schubert 
835276da39aSCy Schubert     UNITY_SKIP_EXECUTION;
836276da39aSCy Schubert 
837276da39aSCy Schubert     if (diff < 0.0)
838276da39aSCy Schubert     {
839276da39aSCy Schubert         diff = 0.0 - diff;
840276da39aSCy Schubert     }
841276da39aSCy Schubert     if (pos_delta < 0.0)
842276da39aSCy Schubert     {
843276da39aSCy Schubert         pos_delta = 0.0 - pos_delta;
844276da39aSCy Schubert     }
845276da39aSCy Schubert 
846276da39aSCy Schubert     //This first part of this condition will catch any NaN or Infinite values
847276da39aSCy Schubert     if ((diff * 0.0 != 0.0) || (pos_delta < diff))
848276da39aSCy Schubert     {
849276da39aSCy Schubert         UnityTestResultsFailBegin(lineNumber);
850276da39aSCy Schubert #ifdef UNITY_DOUBLE_VERBOSE
851276da39aSCy Schubert         UnityPrint(UnityStrExpected);
852276da39aSCy Schubert         UnityPrintFloat((float)expected);
853276da39aSCy Schubert         UnityPrint(UnityStrWas);
854276da39aSCy Schubert         UnityPrintFloat((float)actual);
855276da39aSCy Schubert #else
856276da39aSCy Schubert         UnityPrint(UnityStrDelta);
857276da39aSCy Schubert #endif
858276da39aSCy Schubert         UnityAddMsgIfSpecified(msg);
859276da39aSCy Schubert         UNITY_FAIL_AND_BAIL;
860276da39aSCy Schubert     }
861276da39aSCy Schubert }
862276da39aSCy Schubert 
863276da39aSCy Schubert //-----------------------------------------------
864276da39aSCy Schubert 
UnityAssertDoubleSpecial(const _UD actual,const char * msg,const UNITY_LINE_TYPE lineNumber,const UNITY_FLOAT_TRAIT_T style)865276da39aSCy Schubert void UnityAssertDoubleSpecial(const _UD actual,
866276da39aSCy Schubert                               const char* msg,
867276da39aSCy Schubert                               const UNITY_LINE_TYPE lineNumber,
868276da39aSCy Schubert                               const UNITY_FLOAT_TRAIT_T style)
869276da39aSCy Schubert {
870276da39aSCy Schubert     const char* trait_names[] = { UnityStrInf, UnityStrNegInf, UnityStrNaN, UnityStrDet };
871276da39aSCy Schubert     _U_SINT should_be_trait   = ((_U_SINT)style & 1);
872276da39aSCy Schubert     _U_SINT is_trait          = !should_be_trait;
873276da39aSCy Schubert     _U_SINT trait_index       = style >> 1;
874276da39aSCy Schubert 
875276da39aSCy Schubert     UNITY_SKIP_EXECUTION;
876276da39aSCy Schubert 
877276da39aSCy Schubert     switch(style)
878276da39aSCy Schubert     {
879276da39aSCy Schubert         //To determine Inf / Neg Inf, we compare to an Inf / Neg Inf value we create on the fly
880276da39aSCy Schubert         //We are using a variable to hold the zero value because some compilers complain about dividing by zero otherwise
881276da39aSCy Schubert         case UNITY_FLOAT_IS_INF:
882276da39aSCy Schubert         case UNITY_FLOAT_IS_NOT_INF:
883276da39aSCy Schubert             is_trait = ((1.0 / d_zero) == actual) ? 1 : 0;
884276da39aSCy Schubert             break;
885276da39aSCy Schubert         case UNITY_FLOAT_IS_NEG_INF:
886276da39aSCy Schubert         case UNITY_FLOAT_IS_NOT_NEG_INF:
887276da39aSCy Schubert             is_trait = ((-1.0 / d_zero) == actual) ? 1 : 0;
888276da39aSCy Schubert             break;
889276da39aSCy Schubert 
890276da39aSCy Schubert         //NaN is the only floating point value that does NOT equal itself. Therefore if Actual == Actual, then it is NOT NaN.
891276da39aSCy Schubert         case UNITY_FLOAT_IS_NAN:
892276da39aSCy Schubert         case UNITY_FLOAT_IS_NOT_NAN:
893276da39aSCy Schubert             is_trait = (actual == actual) ? 0 : 1;
894276da39aSCy Schubert             break;
895276da39aSCy Schubert 
896276da39aSCy Schubert         //A determinate number is non infinite and not NaN. (therefore the opposite of the two above)
897276da39aSCy Schubert         case UNITY_FLOAT_IS_DET:
898276da39aSCy Schubert         case UNITY_FLOAT_IS_NOT_DET:
899276da39aSCy Schubert             if ( (actual != actual) || ((1.0 / d_zero) == actual) || ((-1.0 / d_zero) == actual) )
900276da39aSCy Schubert                 is_trait = 0;
901276da39aSCy Schubert             else
902276da39aSCy Schubert                 is_trait = 1;
903276da39aSCy Schubert             break;
904276da39aSCy Schubert 	default:
905276da39aSCy Schubert 	    ;
906276da39aSCy Schubert     }
907276da39aSCy Schubert 
908276da39aSCy Schubert     if (is_trait != should_be_trait)
909276da39aSCy Schubert     {
910276da39aSCy Schubert         UnityTestResultsFailBegin(lineNumber);
911276da39aSCy Schubert         UnityPrint(UnityStrExpected);
912276da39aSCy Schubert         if (!should_be_trait)
913276da39aSCy Schubert             UnityPrint(UnityStrNot);
914276da39aSCy Schubert         UnityPrint(trait_names[trait_index]);
915276da39aSCy Schubert         UnityPrint(UnityStrWas);
916276da39aSCy Schubert #ifdef UNITY_DOUBLE_VERBOSE
917276da39aSCy Schubert         UnityPrintFloat(actual);
918276da39aSCy Schubert #else
919276da39aSCy Schubert         if (should_be_trait)
920276da39aSCy Schubert             UnityPrint(UnityStrNot);
921276da39aSCy Schubert         UnityPrint(trait_names[trait_index]);
922276da39aSCy Schubert #endif
923276da39aSCy Schubert         UnityAddMsgIfSpecified(msg);
924276da39aSCy Schubert         UNITY_FAIL_AND_BAIL;
925276da39aSCy Schubert     }
926276da39aSCy Schubert }
927276da39aSCy Schubert 
928276da39aSCy Schubert 
929276da39aSCy Schubert #endif // not UNITY_EXCLUDE_DOUBLE
930276da39aSCy Schubert 
931276da39aSCy Schubert //-----------------------------------------------
UnityAssertNumbersWithin(const _U_SINT delta,const _U_SINT expected,const _U_SINT actual,const char * msg,const UNITY_LINE_TYPE lineNumber,const UNITY_DISPLAY_STYLE_T style)932276da39aSCy Schubert void UnityAssertNumbersWithin( const _U_SINT delta,
933276da39aSCy Schubert                                const _U_SINT expected,
934276da39aSCy Schubert                                const _U_SINT actual,
935276da39aSCy Schubert                                const char* msg,
936276da39aSCy Schubert                                const UNITY_LINE_TYPE lineNumber,
937276da39aSCy Schubert                                const UNITY_DISPLAY_STYLE_T style)
938276da39aSCy Schubert {
939276da39aSCy Schubert     UNITY_SKIP_EXECUTION;
940276da39aSCy Schubert 
941276da39aSCy Schubert     if ((style & UNITY_DISPLAY_RANGE_INT) == UNITY_DISPLAY_RANGE_INT)
942276da39aSCy Schubert     {
943276da39aSCy Schubert         if (actual > expected)
944276da39aSCy Schubert           Unity.CurrentTestFailed = ((actual - expected) > delta);
945276da39aSCy Schubert         else
946276da39aSCy Schubert           Unity.CurrentTestFailed = ((expected - actual) > delta);
947276da39aSCy Schubert     }
948276da39aSCy Schubert     else
949276da39aSCy Schubert     {
950276da39aSCy Schubert         if ((_U_UINT)actual > (_U_UINT)expected)
951276da39aSCy Schubert             Unity.CurrentTestFailed = ((_U_UINT)(actual - expected) > (_U_UINT)delta);
952276da39aSCy Schubert         else
953276da39aSCy Schubert             Unity.CurrentTestFailed = ((_U_UINT)(expected - actual) > (_U_UINT)delta);
954276da39aSCy Schubert     }
955276da39aSCy Schubert 
956276da39aSCy Schubert     if (Unity.CurrentTestFailed)
957276da39aSCy Schubert     {
958276da39aSCy Schubert         UnityTestResultsFailBegin(lineNumber);
959276da39aSCy Schubert         UnityPrint(UnityStrDelta);
960276da39aSCy Schubert         UnityPrintNumberByStyle(delta, style);
961276da39aSCy Schubert         UnityPrint(UnityStrExpected);
962276da39aSCy Schubert         UnityPrintNumberByStyle(expected, style);
963276da39aSCy Schubert         UnityPrint(UnityStrWas);
964276da39aSCy Schubert         UnityPrintNumberByStyle(actual, style);
965276da39aSCy Schubert         UnityAddMsgIfSpecified(msg);
966276da39aSCy Schubert         UNITY_FAIL_AND_BAIL;
967276da39aSCy Schubert     }
968276da39aSCy Schubert }
969276da39aSCy Schubert 
970276da39aSCy Schubert //-----------------------------------------------
UnityAssertEqualString(const char * expected,const char * actual,const char * msg,const UNITY_LINE_TYPE lineNumber)971276da39aSCy Schubert void UnityAssertEqualString(const char* expected,
972276da39aSCy Schubert                             const char* actual,
973276da39aSCy Schubert                             const char* msg,
974276da39aSCy Schubert                             const UNITY_LINE_TYPE lineNumber)
975276da39aSCy Schubert {
976276da39aSCy Schubert     _UU32 i;
977276da39aSCy Schubert 
978276da39aSCy Schubert     UNITY_SKIP_EXECUTION;
979276da39aSCy Schubert 
980276da39aSCy Schubert     // if both pointers not null compare the strings
981276da39aSCy Schubert     if (expected && actual)
982276da39aSCy Schubert     {
983276da39aSCy Schubert         for (i = 0; expected[i] || actual[i]; i++)
984276da39aSCy Schubert         {
985276da39aSCy Schubert             if (expected[i] != actual[i])
986276da39aSCy Schubert             {
987276da39aSCy Schubert                 Unity.CurrentTestFailed = 1;
988276da39aSCy Schubert                 break;
989276da39aSCy Schubert             }
990276da39aSCy Schubert         }
991276da39aSCy Schubert     }
992276da39aSCy Schubert     else
993276da39aSCy Schubert     { // handle case of one pointers being null (if both null, test should pass)
994276da39aSCy Schubert         if (expected != actual)
995276da39aSCy Schubert         {
996276da39aSCy Schubert             Unity.CurrentTestFailed = 1;
997276da39aSCy Schubert         }
998276da39aSCy Schubert     }
999276da39aSCy Schubert 
1000276da39aSCy Schubert     if (Unity.CurrentTestFailed)
1001276da39aSCy Schubert     {
1002276da39aSCy Schubert       UnityTestResultsFailBegin(lineNumber);
1003276da39aSCy Schubert       UnityPrintExpectedAndActualStrings(expected, actual);
1004276da39aSCy Schubert       UnityAddMsgIfSpecified(msg);
1005276da39aSCy Schubert       UNITY_FAIL_AND_BAIL;
1006276da39aSCy Schubert     }
1007276da39aSCy Schubert }
1008276da39aSCy Schubert 
1009276da39aSCy Schubert //-----------------------------------------------
UnityAssertEqualStringArray(const char ** expected,const char ** actual,const _UU32 num_elements,const char * msg,const UNITY_LINE_TYPE lineNumber)1010276da39aSCy Schubert void UnityAssertEqualStringArray( const char** expected,
1011276da39aSCy Schubert                                   const char** actual,
1012276da39aSCy Schubert                                   const _UU32 num_elements,
1013276da39aSCy Schubert                                   const char* msg,
1014276da39aSCy Schubert                                   const UNITY_LINE_TYPE lineNumber)
1015276da39aSCy Schubert {
1016276da39aSCy Schubert     _UU32 i, j = 0;
1017276da39aSCy Schubert 
1018276da39aSCy Schubert     UNITY_SKIP_EXECUTION;
1019276da39aSCy Schubert 
1020276da39aSCy Schubert     // if no elements, it's an error
1021276da39aSCy Schubert     if (num_elements == 0)
1022276da39aSCy Schubert     {
1023276da39aSCy Schubert         UnityTestResultsFailBegin(lineNumber);
1024276da39aSCy Schubert         UnityPrint(UnityStrPointless);
1025276da39aSCy Schubert         UnityAddMsgIfSpecified(msg);
1026276da39aSCy Schubert         UNITY_FAIL_AND_BAIL;
1027276da39aSCy Schubert     }
1028276da39aSCy Schubert 
1029276da39aSCy Schubert     if (UnityCheckArraysForNull((UNITY_PTR_ATTRIBUTE void*)expected, (UNITY_PTR_ATTRIBUTE void*)actual, lineNumber, msg) == 1)
1030276da39aSCy Schubert         return;
1031276da39aSCy Schubert 
1032276da39aSCy Schubert     do
1033276da39aSCy Schubert     {
1034276da39aSCy Schubert         // if both pointers not null compare the strings
1035276da39aSCy Schubert         if (expected[j] && actual[j])
1036276da39aSCy Schubert         {
1037276da39aSCy Schubert             for (i = 0; expected[j][i] || actual[j][i]; i++)
1038276da39aSCy Schubert             {
1039276da39aSCy Schubert                 if (expected[j][i] != actual[j][i])
1040276da39aSCy Schubert                 {
1041276da39aSCy Schubert                     Unity.CurrentTestFailed = 1;
1042276da39aSCy Schubert                     break;
1043276da39aSCy Schubert                 }
1044276da39aSCy Schubert             }
1045276da39aSCy Schubert         }
1046276da39aSCy Schubert         else
1047276da39aSCy Schubert         { // handle case of one pointers being null (if both null, test should pass)
1048276da39aSCy Schubert             if (expected[j] != actual[j])
1049276da39aSCy Schubert             {
1050276da39aSCy Schubert                 Unity.CurrentTestFailed = 1;
1051276da39aSCy Schubert             }
1052276da39aSCy Schubert         }
1053276da39aSCy Schubert 
1054276da39aSCy Schubert         if (Unity.CurrentTestFailed)
1055276da39aSCy Schubert         {
1056276da39aSCy Schubert             UnityTestResultsFailBegin(lineNumber);
1057276da39aSCy Schubert             if (num_elements > 1)
1058276da39aSCy Schubert             {
1059276da39aSCy Schubert                 UnityPrint(UnityStrElement);
1060276da39aSCy Schubert                 UnityPrintNumberByStyle((j), UNITY_DISPLAY_STYLE_UINT);
1061276da39aSCy Schubert             }
1062276da39aSCy Schubert             UnityPrintExpectedAndActualStrings((const char*)(expected[j]), (const char*)(actual[j]));
1063276da39aSCy Schubert             UnityAddMsgIfSpecified(msg);
1064276da39aSCy Schubert             UNITY_FAIL_AND_BAIL;
1065276da39aSCy Schubert         }
1066276da39aSCy Schubert     } while (++j < num_elements);
1067276da39aSCy Schubert }
1068276da39aSCy Schubert 
1069276da39aSCy Schubert //-----------------------------------------------
UnityAssertEqualMemory(UNITY_PTR_ATTRIBUTE const void * expected,UNITY_PTR_ATTRIBUTE const void * actual,const _UU32 length,const _UU32 num_elements,const char * msg,const UNITY_LINE_TYPE lineNumber)1070276da39aSCy Schubert void UnityAssertEqualMemory( UNITY_PTR_ATTRIBUTE const void* expected,
1071276da39aSCy Schubert                              UNITY_PTR_ATTRIBUTE const void* actual,
1072276da39aSCy Schubert                              const _UU32 length,
1073276da39aSCy Schubert                              const _UU32 num_elements,
1074276da39aSCy Schubert                              const char* msg,
1075276da39aSCy Schubert                              const UNITY_LINE_TYPE lineNumber)
1076276da39aSCy Schubert {
1077276da39aSCy Schubert     UNITY_PTR_ATTRIBUTE const unsigned char* ptr_exp = (UNITY_PTR_ATTRIBUTE const unsigned char*)expected;
1078276da39aSCy Schubert     UNITY_PTR_ATTRIBUTE const unsigned char* ptr_act = (UNITY_PTR_ATTRIBUTE const unsigned char*)actual;
1079276da39aSCy Schubert     _UU32 elements = num_elements;
1080276da39aSCy Schubert     _UU32 bytes;
1081276da39aSCy Schubert 
1082276da39aSCy Schubert     UNITY_SKIP_EXECUTION;
1083276da39aSCy Schubert 
1084276da39aSCy Schubert     if ((elements == 0) || (length == 0))
1085276da39aSCy Schubert     {
1086276da39aSCy Schubert         UnityTestResultsFailBegin(lineNumber);
1087276da39aSCy Schubert         UnityPrint(UnityStrPointless);
1088276da39aSCy Schubert         UnityAddMsgIfSpecified(msg);
1089276da39aSCy Schubert         UNITY_FAIL_AND_BAIL;
1090276da39aSCy Schubert     }
1091276da39aSCy Schubert 
1092276da39aSCy Schubert     if (UnityCheckArraysForNull((UNITY_PTR_ATTRIBUTE const void*)expected, (UNITY_PTR_ATTRIBUTE const void*)actual, lineNumber, msg) == 1)
1093276da39aSCy Schubert         return;
1094276da39aSCy Schubert 
1095276da39aSCy Schubert     while (elements--)
1096276da39aSCy Schubert     {
1097276da39aSCy Schubert         /////////////////////////////////////
1098276da39aSCy Schubert         bytes = length;
1099276da39aSCy Schubert         while (bytes--)
1100276da39aSCy Schubert         {
1101276da39aSCy Schubert             if (*ptr_exp != *ptr_act)
1102276da39aSCy Schubert             {
1103276da39aSCy Schubert                 UnityTestResultsFailBegin(lineNumber);
1104276da39aSCy Schubert                 UnityPrint(UnityStrMemory);
1105276da39aSCy Schubert                 if (num_elements > 1)
1106276da39aSCy Schubert                 {
1107276da39aSCy Schubert                     UnityPrint(UnityStrElement);
1108276da39aSCy Schubert                     UnityPrintNumberByStyle((num_elements - elements - 1), UNITY_DISPLAY_STYLE_UINT);
1109276da39aSCy Schubert                 }
1110276da39aSCy Schubert                 UnityPrint(UnityStrByte);
1111276da39aSCy Schubert                 UnityPrintNumberByStyle((length - bytes - 1), UNITY_DISPLAY_STYLE_UINT);
1112276da39aSCy Schubert                 UnityPrint(UnityStrExpected);
1113276da39aSCy Schubert                 UnityPrintNumberByStyle(*ptr_exp, UNITY_DISPLAY_STYLE_HEX8);
1114276da39aSCy Schubert                 UnityPrint(UnityStrWas);
1115276da39aSCy Schubert                 UnityPrintNumberByStyle(*ptr_act, UNITY_DISPLAY_STYLE_HEX8);
1116276da39aSCy Schubert                 UnityAddMsgIfSpecified(msg);
1117276da39aSCy Schubert                 UNITY_FAIL_AND_BAIL;
1118276da39aSCy Schubert             }
1119276da39aSCy Schubert             ptr_exp += 1;
1120276da39aSCy Schubert             ptr_act += 1;
1121276da39aSCy Schubert         }
1122276da39aSCy Schubert         /////////////////////////////////////
1123276da39aSCy Schubert 
1124276da39aSCy Schubert     }
1125276da39aSCy Schubert }
1126276da39aSCy Schubert 
1127276da39aSCy Schubert //-----------------------------------------------
1128276da39aSCy Schubert // Control Functions
1129276da39aSCy Schubert //-----------------------------------------------
1130276da39aSCy Schubert 
UnityFail(const char * msg,const UNITY_LINE_TYPE line)1131276da39aSCy Schubert void UnityFail(const char* msg, const UNITY_LINE_TYPE line)
1132276da39aSCy Schubert {
1133276da39aSCy Schubert     UNITY_SKIP_EXECUTION;
1134276da39aSCy Schubert 
1135276da39aSCy Schubert     UnityTestResultsBegin(Unity.TestFile, line);
1136276da39aSCy Schubert     UnityPrintFail();
1137276da39aSCy Schubert     if (msg != NULL)
1138276da39aSCy Schubert     {
1139276da39aSCy Schubert       UNITY_OUTPUT_CHAR(':');
1140276da39aSCy Schubert       if (msg[0] != ' ')
1141276da39aSCy Schubert       {
1142276da39aSCy Schubert         UNITY_OUTPUT_CHAR(' ');
1143276da39aSCy Schubert       }
1144276da39aSCy Schubert       UnityPrint(msg);
1145276da39aSCy Schubert     }
1146276da39aSCy Schubert     UNITY_FAIL_AND_BAIL;
1147276da39aSCy Schubert }
1148276da39aSCy Schubert 
1149276da39aSCy Schubert //-----------------------------------------------
UnityIgnore(const char * msg,const UNITY_LINE_TYPE line)1150276da39aSCy Schubert void UnityIgnore(const char* msg, const UNITY_LINE_TYPE line)
1151276da39aSCy Schubert {
1152276da39aSCy Schubert     UNITY_SKIP_EXECUTION;
1153276da39aSCy Schubert 
1154276da39aSCy Schubert     UnityTestResultsBegin(Unity.TestFile, line);
1155276da39aSCy Schubert     UnityPrint(UnityStrIgnore);
1156276da39aSCy Schubert     if (msg != NULL)
1157276da39aSCy Schubert     {
1158276da39aSCy Schubert       UNITY_OUTPUT_CHAR(':');
1159276da39aSCy Schubert       UNITY_OUTPUT_CHAR(' ');
1160276da39aSCy Schubert       UnityPrint(msg);
1161276da39aSCy Schubert     }
1162276da39aSCy Schubert     UNITY_IGNORE_AND_BAIL;
1163276da39aSCy Schubert }
1164276da39aSCy Schubert 
1165276da39aSCy Schubert //----------------------------------------------
1166276da39aSCy Schubert 
UnityExpectFail()1167276da39aSCy Schubert void UnityExpectFail(){
1168276da39aSCy Schubert 
1169276da39aSCy Schubert 	Unity.isExpectingFail = 1;
1170276da39aSCy Schubert 
1171276da39aSCy Schubert }
1172276da39aSCy Schubert 
UnityExpectFailMessage(const char * msg,const UNITY_LINE_TYPE line)1173276da39aSCy Schubert void UnityExpectFailMessage(const char* msg, const UNITY_LINE_TYPE line ){
1174276da39aSCy Schubert 
1175276da39aSCy Schubert 	Unity.isExpectingFail = 1;
1176276da39aSCy Schubert 	  if (msg != NULL)
1177276da39aSCy Schubert     {
1178276da39aSCy Schubert 		Unity.XFAILMessage = msg;
1179276da39aSCy Schubert     }
1180276da39aSCy Schubert }
1181276da39aSCy Schubert 
1182276da39aSCy Schubert //-----------------------------------------------
1183276da39aSCy Schubert #if defined(UNITY_WEAK_ATTRIBUTE)
1184276da39aSCy Schubert     void setUp(void);
1185276da39aSCy Schubert     void tearDown(void);
setUp(void)1186276da39aSCy Schubert     UNITY_WEAK_ATTRIBUTE void setUp(void) { }
tearDown(void)1187276da39aSCy Schubert     UNITY_WEAK_ATTRIBUTE void tearDown(void) { }
1188276da39aSCy Schubert #elif defined(UNITY_WEAK_PRAGMA)
1189276da39aSCy Schubert #   pragma weak setUp
1190276da39aSCy Schubert     void setUp(void);
1191276da39aSCy Schubert #   pragma weak tearDown
1192276da39aSCy Schubert     void tearDown(void);
1193276da39aSCy Schubert #else
1194276da39aSCy Schubert     void setUp(void);
1195276da39aSCy Schubert     void tearDown(void);
1196276da39aSCy Schubert #endif
1197276da39aSCy Schubert 
1198276da39aSCy Schubert //-----------------------------------------------
UnityDefaultTestRun(UnityTestFunction Func,const char * FuncName,const int FuncLineNum)1199276da39aSCy Schubert void UnityDefaultTestRun(UnityTestFunction Func, const char* FuncName, const int FuncLineNum)
1200276da39aSCy Schubert {
1201276da39aSCy Schubert     Unity.CurrentTestName = FuncName;
1202276da39aSCy Schubert     Unity.CurrentTestLineNumber = (UNITY_LINE_TYPE)FuncLineNum;
1203276da39aSCy Schubert     Unity.NumberOfTests++;
1204276da39aSCy Schubert 
1205276da39aSCy Schubert     if (TEST_PROTECT())
1206276da39aSCy Schubert     {
1207276da39aSCy Schubert         setUp();
1208276da39aSCy Schubert         Func();
1209276da39aSCy Schubert     }
1210276da39aSCy Schubert     if (TEST_PROTECT() && !(Unity.CurrentTestIgnored))
1211276da39aSCy Schubert     {
1212276da39aSCy Schubert         tearDown();
1213276da39aSCy Schubert     }
1214276da39aSCy Schubert 
1215276da39aSCy Schubert     UnityConcludeTest();
1216276da39aSCy Schubert }
1217276da39aSCy Schubert 
1218276da39aSCy Schubert 
1219276da39aSCy Schubert //-----------------------------------------------
UnityBegin(const char * filename)1220276da39aSCy Schubert void UnityBegin(const char* filename)
1221276da39aSCy Schubert {
1222276da39aSCy Schubert     Unity.TestFile = filename;
1223276da39aSCy Schubert     Unity.CurrentTestName = NULL;
1224276da39aSCy Schubert     Unity.CurrentTestLineNumber = 0;
1225276da39aSCy Schubert     Unity.NumberOfTests = 0;
1226276da39aSCy Schubert     Unity.TestFailures = 0;
1227276da39aSCy Schubert     Unity.TestIgnores = 0;
1228276da39aSCy Schubert     Unity.CurrentTestFailed = 0;
1229276da39aSCy Schubert     Unity.CurrentTestIgnored = 0;
1230276da39aSCy Schubert     Unity.TestXFAILS = 0;
1231276da39aSCy Schubert     Unity.isExpectingFail = 0;
1232276da39aSCy Schubert     Unity.TestPasses = 0;
1233276da39aSCy Schubert     Unity.TestXPASSES = 0;
1234276da39aSCy Schubert     Unity.XFAILMessage = NULL;
1235276da39aSCy Schubert 
1236276da39aSCy Schubert     UNITY_OUTPUT_START();
1237276da39aSCy Schubert }
1238276da39aSCy Schubert 
1239276da39aSCy Schubert 
1240276da39aSCy Schubert //-----------------------------------------------
UnityEnd(void)1241276da39aSCy Schubert int UnityEnd(void)
1242276da39aSCy Schubert {
1243276da39aSCy Schubert     UNITY_PRINT_EOL;
1244276da39aSCy Schubert     UnityPrint(UnityStrBreaker);
1245276da39aSCy Schubert     UNITY_PRINT_EOL;
1246276da39aSCy Schubert     UnityPrintNumber((_U_SINT)(Unity.NumberOfTests));
1247276da39aSCy Schubert     UnityPrint(UnityStrResultsTests);
1248276da39aSCy Schubert     UNITY_PRINT_EOL;
1249276da39aSCy Schubert     UnityPrintNumber((_U_SINT)(Unity.TestPasses));
1250276da39aSCy Schubert     UnityPrint(UnityStrResultsPass);
1251276da39aSCy Schubert     UNITY_PRINT_EOL;
1252276da39aSCy Schubert     UnityPrintNumber((_U_SINT)(Unity.TestXFAILS));
1253276da39aSCy Schubert     UnityPrint(UnityStrResultsXFAIL);
1254276da39aSCy Schubert     UNITY_PRINT_EOL;
1255276da39aSCy Schubert     UnityPrintNumber((_U_SINT)(Unity.TestFailures));
1256276da39aSCy Schubert     UnityPrint(UnityStrResultsFailures);
1257276da39aSCy Schubert     UNITY_PRINT_EOL;
1258276da39aSCy Schubert     UnityPrintNumber((_U_SINT)(Unity.TestXPASSES));
1259276da39aSCy Schubert     UnityPrint(UnityStrResultsXPASS);
1260276da39aSCy Schubert     UNITY_PRINT_EOL;
1261276da39aSCy Schubert     UnityPrintNumber((_U_SINT)(Unity.TestIgnores));
1262276da39aSCy Schubert     UnityPrint(UnityStrResultsIgnored);
1263276da39aSCy Schubert     UNITY_PRINT_EOL;
1264276da39aSCy Schubert 
1265276da39aSCy Schubert     UNITY_PRINT_EOL;
1266276da39aSCy Schubert     if (Unity.TestFailures == 0U && Unity.TestXPASSES == 0U)
1267276da39aSCy Schubert     {
1268276da39aSCy Schubert         UnityPrintOk();
1269276da39aSCy Schubert     }
1270276da39aSCy Schubert     else
1271276da39aSCy Schubert     {
1272276da39aSCy Schubert         UnityPrintFail();
1273276da39aSCy Schubert     }
1274276da39aSCy Schubert     UNITY_PRINT_EOL;
1275276da39aSCy Schubert     UNITY_OUTPUT_COMPLETE();
1276276da39aSCy Schubert     return (int)(Unity.TestFailures);
1277276da39aSCy Schubert }
1278276da39aSCy Schubert 
1279276da39aSCy Schubert 
1280276da39aSCy Schubert //-----------------------------------------------
1281