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