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