From f52538d401136c93e2c9099e3366055293ed7b26 Mon Sep 17 00:00:00 2001 From: Mark VanderVoord Date: Mon, 4 Jan 2016 19:30:38 -0500 Subject: [PATCH] - fix whitespace - tweak docs --- .gitattributes | 30 + docs/Unity Summary.odt | Bin 37198 -> 35836 bytes src/unity.c | 2648 ++++++++++++++++++++-------------------- 3 files changed, 1354 insertions(+), 1324 deletions(-) create mode 100644 .gitattributes diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..ad95226 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,30 @@ +* text=auto + +# These files are text and should be normalized (convert crlf to lf) +*.rb text +*.test text +*.c text +*.cpp text +*.h text +*.txt text +*.yml text +*.s79 text +*.bat text +*.xcl text +*.inc text +*.info text +*.md text +makefile text +rakefile text + + +#These files are binary and should not be normalized +*.doc binary +*.odt binary +*.pdf binary +*.ewd binary +*.eww binary +*.dni binary +*.wsdt binary +*.dbgdt binary +*.mac binary diff --git a/docs/Unity Summary.odt b/docs/Unity Summary.odt index 2da4d3d368dc0159524f636b1eefd5df33439c0a..92f00105479aa0fd2622b4585343809fe7e51fd3 100644 GIT binary patch delta 29196 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 delta 30678 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 VU=W2Uhms4sCZF$CXEW{r@c~5GB1QlJ diff --git a/src/unity.c b/src/unity.c index cfdcd76..b5c788e 100644 --- a/src/unity.c +++ b/src/unity.c @@ -1,1324 +1,1324 @@ -/* ========================================================================= - Unity Project - A Test Framework for C - Copyright (c) 2007-14 Mike Karlesky, Mark VanderVoord, Greg Williams - [Released under MIT License. Please refer to license.txt for details] -============================================================================ */ - -#include "unity.h" -#include - -#define UNITY_FAIL_AND_BAIL { Unity.CurrentTestFailed = 1; longjmp(Unity.AbortFrame, 1); } -#define UNITY_IGNORE_AND_BAIL { Unity.CurrentTestIgnored = 1; longjmp(Unity.AbortFrame, 1); } -/// return prematurely if we are already in failure or ignore state -#define UNITY_SKIP_EXECUTION { if ((Unity.CurrentTestFailed != 0) || (Unity.CurrentTestIgnored != 0)) {return;} } - -struct _Unity Unity; - -const char UnityStrOk[] = "OK"; -const char UnityStrPass[] = "PASS"; -const char UnityStrFail[] = "FAIL"; -const char UnityStrIgnore[] = "IGNORE"; -const char UnityStrNull[] = "NULL"; -const char UnityStrSpacer[] = ". "; -const char UnityStrExpected[] = " Expected "; -const char UnityStrWas[] = " Was "; -const char UnityStrTo[] = " To "; -const char UnityStrElement[] = " Element "; -const char UnityStrByte[] = " Byte "; -const char UnityStrMemory[] = " Memory Mismatch."; -const char UnityStrDelta[] = " Values Not Within Delta "; -const char UnityStrPointless[] = " You Asked Me To Compare Nothing, Which Was Pointless."; -const char UnityStrNullPointerForExpected[] = " Expected pointer to be NULL"; -const char UnityStrNullPointerForActual[] = " Actual pointer was NULL"; -const char UnityStrNot[] = "Not "; -const char UnityStrInf[] = "Infinity"; -const char UnityStrNegInf[] = "Negative Infinity"; -const char UnityStrNaN[] = "NaN"; -const char UnityStrDet[] = "Determinate"; -const char UnityStrErrFloat[] = "Unity Floating Point Disabled"; -const char UnityStrErrDouble[] = "Unity Double Precision Disabled"; -const char UnityStrErr64[] = "Unity 64-bit Support Disabled"; -const char UnityStrBreaker[] = "-----------------------"; -const char UnityStrResultsTests[] = " Tests "; -const char UnityStrResultsFailures[] = " Failures "; -const char UnityStrResultsIgnored[] = " Ignored "; -const char UnityStrDetail1Name[] = UNITY_DETAIL1_NAME " "; -const char UnityStrDetail2Name[] = " " UNITY_DETAIL2_NAME " "; - -#ifdef UNITY_FLOAT_NEEDS_ZERO -// Dividing by these constants produces +/- infinity. -// The rationale is given in UnityAssertFloatIsInf's body. -static const _UF f_zero = 0.0f; -#endif - -// compiler-generic print formatting masks -const _U_UINT UnitySizeMask[] = -{ - 255u, // 0xFF - 65535u, // 0xFFFF - 65535u, - 4294967295u, // 0xFFFFFFFF - 4294967295u, - 4294967295u, - 4294967295u -#ifdef UNITY_SUPPORT_64 - ,0xFFFFFFFFFFFFFFFF -#endif -}; - -void UnityPrintFail(void); -void UnityPrintOk(void); - -//----------------------------------------------- -// Pretty Printers & Test Result Output Handlers -//----------------------------------------------- - -void UnityPrint(const char* string) -{ - const char* pch = string; - - if (pch != NULL) - { - while (*pch) - { - // printable characters plus CR & LF are printed - if ((*pch <= 126) && (*pch >= 32)) - { - UNITY_OUTPUT_CHAR(*pch); - } - //write escaped carriage returns - else if (*pch == 13) - { - UNITY_OUTPUT_CHAR('\\'); - UNITY_OUTPUT_CHAR('r'); - } - //write escaped line feeds - else if (*pch == 10) - { - UNITY_OUTPUT_CHAR('\\'); - UNITY_OUTPUT_CHAR('n'); - } - // unprintable characters are shown as codes - else - { - UNITY_OUTPUT_CHAR('\\'); - UnityPrintNumberHex((_U_UINT)*pch, 2); - } - pch++; - } - } -} - -void UnityPrintLen(const char* string, const _UU32 length); -void UnityPrintLen(const char* string, const _UU32 length) -{ - const char* pch = string; - - if (pch != NULL) - { - while (*pch && (_UU32)(pch - string) < length) - { - // printable characters plus CR & LF are printed - if ((*pch <= 126) && (*pch >= 32)) - { - UNITY_OUTPUT_CHAR(*pch); - } - //write escaped carriage returns - else if (*pch == 13) - { - UNITY_OUTPUT_CHAR('\\'); - UNITY_OUTPUT_CHAR('r'); - } - //write escaped line feeds - else if (*pch == 10) - { - UNITY_OUTPUT_CHAR('\\'); - UNITY_OUTPUT_CHAR('n'); - } - // unprintable characters are shown as codes - else - { - UNITY_OUTPUT_CHAR('\\'); - UnityPrintNumberHex((_U_UINT)*pch, 2); - } - pch++; - } - } -} - -//----------------------------------------------- -void UnityPrintNumberByStyle(const _U_SINT number, const UNITY_DISPLAY_STYLE_T style) -{ - if ((style & UNITY_DISPLAY_RANGE_INT) == UNITY_DISPLAY_RANGE_INT) - { - UnityPrintNumber(number); - } - else if ((style & UNITY_DISPLAY_RANGE_UINT) == UNITY_DISPLAY_RANGE_UINT) - { - UnityPrintNumberUnsigned( (_U_UINT)number & UnitySizeMask[((_U_UINT)style & (_U_UINT)0x0F) - 1] ); - } - else - { - UnityPrintNumberHex((_U_UINT)number, (char)((style & 0x000F) << 1)); - } -} - -//----------------------------------------------- -/// basically do an itoa using as little ram as possible -void UnityPrintNumber(const _U_SINT number_to_print) -{ - _U_UINT divisor = 1; - _U_UINT next_divisor; - _U_UINT number; - - if (number_to_print < 0) - { - //A negative number, including MIN negative - UNITY_OUTPUT_CHAR('-'); - number = (_U_UINT)(-number_to_print); - } - else - { - //Non-negative number - number = (_U_UINT)number_to_print; - } - - // figure out initial divisor - while (number / divisor > 9) - { - next_divisor = divisor * 10; - if (next_divisor > divisor) - divisor = next_divisor; - else - break; - } - - // now mod and print, then divide divisor - do - { - UNITY_OUTPUT_CHAR((char)('0' + (number / divisor % 10))); - divisor /= 10; - } - while (divisor > 0); -} - -//----------------------------------------------- -/// basically do an itoa using as little ram as possible -void UnityPrintNumberUnsigned(const _U_UINT number) -{ - _U_UINT divisor = 1; - _U_UINT next_divisor; - - // figure out initial divisor - while (number / divisor > 9) - { - next_divisor = divisor * 10; - if (next_divisor > divisor) - divisor = next_divisor; - else - break; - } - - // now mod and print, then divide divisor - do - { - UNITY_OUTPUT_CHAR((char)('0' + (number / divisor % 10))); - divisor /= 10; - } - while (divisor > 0); -} - -//----------------------------------------------- -void UnityPrintNumberHex(const _U_UINT number, const char nibbles_to_print) -{ - _U_UINT nibble; - char nibbles = nibbles_to_print; - UNITY_OUTPUT_CHAR('0'); - UNITY_OUTPUT_CHAR('x'); - - while (nibbles > 0) - { - nibble = (number >> (--nibbles << 2)) & 0x0000000F; - if (nibble <= 9) - { - UNITY_OUTPUT_CHAR((char)('0' + nibble)); - } - else - { - UNITY_OUTPUT_CHAR((char)('A' - 10 + nibble)); - } - } -} - -//----------------------------------------------- -void UnityPrintMask(const _U_UINT mask, const _U_UINT number) -{ - _U_UINT current_bit = (_U_UINT)1 << (UNITY_INT_WIDTH - 1); - _US32 i; - - for (i = 0; i < UNITY_INT_WIDTH; i++) - { - if (current_bit & mask) - { - if (current_bit & number) - { - UNITY_OUTPUT_CHAR('1'); - } - else - { - UNITY_OUTPUT_CHAR('0'); - } - } - else - { - UNITY_OUTPUT_CHAR('X'); - } - current_bit = current_bit >> 1; - } -} - -//----------------------------------------------- -#ifdef UNITY_FLOAT_VERBOSE -#include -void UnityPrintFloat(_UF number) -{ - char TempBuffer[32]; - sprintf(TempBuffer, "%.6f", number); - UnityPrint(TempBuffer); -} -#endif - -//----------------------------------------------- - -void UnityPrintFail(void); -void UnityPrintFail(void) -{ - UnityPrint(UnityStrFail); -} - -void UnityPrintOk(void); -void UnityPrintOk(void) -{ - UnityPrint(UnityStrOk); -} - -//----------------------------------------------- -static void UnityTestResultsBegin(const char* file, const UNITY_LINE_TYPE line); -static void UnityTestResultsBegin(const char* file, const UNITY_LINE_TYPE line) -{ -#ifndef UNITY_FIXTURES - UnityPrint(file); - UNITY_OUTPUT_CHAR(':'); - UnityPrintNumber((_U_SINT)line); - UNITY_OUTPUT_CHAR(':'); - UnityPrint(Unity.CurrentTestName); - UNITY_OUTPUT_CHAR(':'); -#else - UNITY_UNUSED(file); - UNITY_UNUSED(line); -#endif -} - -//----------------------------------------------- -static void UnityTestResultsFailBegin(const UNITY_LINE_TYPE line); -static void UnityTestResultsFailBegin(const UNITY_LINE_TYPE line) -{ -#ifndef UNITY_FIXTURES - UnityTestResultsBegin(Unity.TestFile, line); -#else - UNITY_UNUSED(line); -#endif - UnityPrint(UnityStrFail); - UNITY_OUTPUT_CHAR(':'); -} - -//----------------------------------------------- -void UnityConcludeTest(void) -{ - if (Unity.CurrentTestIgnored) - { - Unity.TestIgnores++; - } - else if (!Unity.CurrentTestFailed) - { - UnityTestResultsBegin(Unity.TestFile, Unity.CurrentTestLineNumber); - UnityPrint(UnityStrPass); - } - else - { - Unity.TestFailures++; - } - - Unity.CurrentTestFailed = 0; - Unity.CurrentTestIgnored = 0; - UNITY_PRINT_EOL(); -} - -//----------------------------------------------- -static void UnityAddMsgIfSpecified(const char* msg); -static void UnityAddMsgIfSpecified(const char* msg) -{ - if (msg) - { - UnityPrint(UnityStrSpacer); -#ifndef UNITY_EXCLUDE_DETAILS - if (Unity.CurrentDetail1) - { - UnityPrint(UnityStrDetail1Name); - UnityPrint(Unity.CurrentDetail1); - if (Unity.CurrentDetail2) - { - UnityPrint(UnityStrDetail2Name); - UnityPrint(Unity.CurrentDetail2); - } - UnityPrint(UnityStrSpacer); - } -#endif - UnityPrint(msg); - } -} - -//----------------------------------------------- -static void UnityPrintExpectedAndActualStrings(const char* expected, const char* actual); -static void UnityPrintExpectedAndActualStrings(const char* expected, const char* actual) -{ - UnityPrint(UnityStrExpected); - if (expected != NULL) - { - UNITY_OUTPUT_CHAR('\''); - UnityPrint(expected); - UNITY_OUTPUT_CHAR('\''); - } - else - { - UnityPrint(UnityStrNull); - } - UnityPrint(UnityStrWas); - if (actual != NULL) - { - UNITY_OUTPUT_CHAR('\''); - UnityPrint(actual); - UNITY_OUTPUT_CHAR('\''); - } - else - { - UnityPrint(UnityStrNull); - } -} - -//----------------------------------------------- -static void UnityPrintExpectedAndActualStringsLen(const char* expected, const char* actual, const _UU32 length) -{ - UnityPrint(UnityStrExpected); - if (expected != NULL) - { - UNITY_OUTPUT_CHAR('\''); - UnityPrintLen(expected, length); - UNITY_OUTPUT_CHAR('\''); - } - else - { - UnityPrint(UnityStrNull); - } - UnityPrint(UnityStrWas); - if (actual != NULL) - { - UNITY_OUTPUT_CHAR('\''); - UnityPrintLen(actual, length); - UNITY_OUTPUT_CHAR('\''); - } - else - { - UnityPrint(UnityStrNull); - } -} - - - -//----------------------------------------------- -// Assertion & Control Helpers -//----------------------------------------------- - -static int UnityCheckArraysForNull(UNITY_INTERNAL_PTR expected, UNITY_INTERNAL_PTR actual, const UNITY_LINE_TYPE lineNumber, const char* msg) -{ - //return true if they are both NULL - if ((expected == NULL) && (actual == NULL)) - return 1; - - //throw error if just expected is NULL - if (expected == NULL) - { - UnityTestResultsFailBegin(lineNumber); - UnityPrint(UnityStrNullPointerForExpected); - UnityAddMsgIfSpecified(msg); - UNITY_FAIL_AND_BAIL; - } - - //throw error if just actual is NULL - if (actual == NULL) - { - UnityTestResultsFailBegin(lineNumber); - UnityPrint(UnityStrNullPointerForActual); - UnityAddMsgIfSpecified(msg); - UNITY_FAIL_AND_BAIL; - } - - //return false if neither is NULL - return 0; -} - -//----------------------------------------------- -// Assertion Functions -//----------------------------------------------- - -void UnityAssertBits(const _U_SINT mask, - const _U_SINT expected, - const _U_SINT actual, - const char* msg, - const UNITY_LINE_TYPE lineNumber) -{ - UNITY_SKIP_EXECUTION; - - if ((mask & expected) != (mask & actual)) - { - UnityTestResultsFailBegin(lineNumber); - UnityPrint(UnityStrExpected); - UnityPrintMask((_U_UINT)mask, (_U_UINT)expected); - UnityPrint(UnityStrWas); - UnityPrintMask((_U_UINT)mask, (_U_UINT)actual); - UnityAddMsgIfSpecified(msg); - UNITY_FAIL_AND_BAIL; - } -} - -//----------------------------------------------- -void UnityAssertEqualNumber(const _U_SINT expected, - const _U_SINT actual, - const char* msg, - const UNITY_LINE_TYPE lineNumber, - const UNITY_DISPLAY_STYLE_T style) -{ - UNITY_SKIP_EXECUTION; - - if (expected != actual) - { - UnityTestResultsFailBegin(lineNumber); - UnityPrint(UnityStrExpected); - UnityPrintNumberByStyle(expected, style); - UnityPrint(UnityStrWas); - UnityPrintNumberByStyle(actual, style); - UnityAddMsgIfSpecified(msg); - UNITY_FAIL_AND_BAIL; - } -} - -//----------------------------------------------- -void UnityAssertEqualIntArray(UNITY_INTERNAL_PTR expected, - UNITY_INTERNAL_PTR actual, - const _UU32 num_elements, - const char* msg, - const UNITY_LINE_TYPE lineNumber, - const UNITY_DISPLAY_STYLE_T style) -{ - _UU32 elements = num_elements; - UNITY_INTERNAL_PTR ptr_exp = (UNITY_INTERNAL_PTR)expected; - UNITY_INTERNAL_PTR ptr_act = (UNITY_INTERNAL_PTR)actual; - - UNITY_SKIP_EXECUTION; - - if (elements == 0) - { - UnityTestResultsFailBegin(lineNumber); - UnityPrint(UnityStrPointless); - UnityAddMsgIfSpecified(msg); - UNITY_FAIL_AND_BAIL; - } - - if (UnityCheckArraysForNull((UNITY_INTERNAL_PTR)expected, (UNITY_INTERNAL_PTR)actual, lineNumber, msg) == 1) - return; - - // If style is UNITY_DISPLAY_STYLE_INT, we'll fall into the default case rather than the INT16 or INT32 (etc) case - // as UNITY_DISPLAY_STYLE_INT includes a flag for UNITY_DISPLAY_RANGE_AUTO, which the width-specific - // variants do not. Therefore remove this flag. - switch(style & (UNITY_DISPLAY_STYLE_T)(~UNITY_DISPLAY_RANGE_AUTO)) - { - case UNITY_DISPLAY_STYLE_HEX8: - case UNITY_DISPLAY_STYLE_INT8: - case UNITY_DISPLAY_STYLE_UINT8: - while (elements--) - { - if (*(UNITY_PTR_ATTRIBUTE const _US8*)ptr_exp != *(UNITY_PTR_ATTRIBUTE const _US8*)ptr_act) - { - UnityTestResultsFailBegin(lineNumber); - UnityPrint(UnityStrElement); - UnityPrintNumberByStyle((num_elements - elements - 1), UNITY_DISPLAY_STYLE_UINT); - UnityPrint(UnityStrExpected); - UnityPrintNumberByStyle(*(UNITY_PTR_ATTRIBUTE const _US8*)ptr_exp, style); - UnityPrint(UnityStrWas); - UnityPrintNumberByStyle(*(UNITY_PTR_ATTRIBUTE const _US8*)ptr_act, style); - UnityAddMsgIfSpecified(msg); - UNITY_FAIL_AND_BAIL; - } - ptr_exp = (UNITY_INTERNAL_PTR)((_UP)ptr_exp + 1); - ptr_act = (UNITY_INTERNAL_PTR)((_UP)ptr_act + 1); - } - break; - case UNITY_DISPLAY_STYLE_HEX16: - case UNITY_DISPLAY_STYLE_INT16: - case UNITY_DISPLAY_STYLE_UINT16: - while (elements--) - { - if (*(UNITY_PTR_ATTRIBUTE const _US16*)ptr_exp != *(UNITY_PTR_ATTRIBUTE const _US16*)ptr_act) - { - UnityTestResultsFailBegin(lineNumber); - UnityPrint(UnityStrElement); - UnityPrintNumberByStyle((num_elements - elements - 1), UNITY_DISPLAY_STYLE_UINT); - UnityPrint(UnityStrExpected); - UnityPrintNumberByStyle(*(UNITY_PTR_ATTRIBUTE const _US16*)ptr_exp, style); - UnityPrint(UnityStrWas); - UnityPrintNumberByStyle(*(UNITY_PTR_ATTRIBUTE const _US16*)ptr_act, style); - UnityAddMsgIfSpecified(msg); - UNITY_FAIL_AND_BAIL; - } - ptr_exp = (UNITY_INTERNAL_PTR)((_UP)ptr_exp + 2); - ptr_act = (UNITY_INTERNAL_PTR)((_UP)ptr_act + 2); - } - break; -#ifdef UNITY_SUPPORT_64 - case UNITY_DISPLAY_STYLE_HEX64: - case UNITY_DISPLAY_STYLE_INT64: - case UNITY_DISPLAY_STYLE_UINT64: - while (elements--) - { - if (*(UNITY_PTR_ATTRIBUTE const _US64*)ptr_exp != *(UNITY_PTR_ATTRIBUTE const _US64*)ptr_act) - { - UnityTestResultsFailBegin(lineNumber); - UnityPrint(UnityStrElement); - UnityPrintNumberByStyle((num_elements - elements - 1), UNITY_DISPLAY_STYLE_UINT); - UnityPrint(UnityStrExpected); - UnityPrintNumberByStyle(*(UNITY_PTR_ATTRIBUTE const _US64*)ptr_exp, style); - UnityPrint(UnityStrWas); - UnityPrintNumberByStyle(*(UNITY_PTR_ATTRIBUTE const _US64*)ptr_act, style); - UnityAddMsgIfSpecified(msg); - UNITY_FAIL_AND_BAIL; - } - ptr_exp = (UNITY_INTERNAL_PTR)((_UP)ptr_exp + 8); - ptr_act = (UNITY_INTERNAL_PTR)((_UP)ptr_act + 8); - } - break; -#endif - default: - while (elements--) - { - if (*(UNITY_PTR_ATTRIBUTE const _US32*)ptr_exp != *(UNITY_PTR_ATTRIBUTE const _US32*)ptr_act) - { - UnityTestResultsFailBegin(lineNumber); - UnityPrint(UnityStrElement); - UnityPrintNumberByStyle((num_elements - elements - 1), UNITY_DISPLAY_STYLE_UINT); - UnityPrint(UnityStrExpected); - UnityPrintNumberByStyle(*(UNITY_PTR_ATTRIBUTE const _US32*)ptr_exp, style); - UnityPrint(UnityStrWas); - UnityPrintNumberByStyle(*(UNITY_PTR_ATTRIBUTE const _US32*)ptr_act, style); - UnityAddMsgIfSpecified(msg); - UNITY_FAIL_AND_BAIL; - } - ptr_exp = (UNITY_INTERNAL_PTR)((_UP)ptr_exp + 4); - ptr_act = (UNITY_INTERNAL_PTR)((_UP)ptr_act + 4); - } - break; - } -} - -//----------------------------------------------- -#ifndef UNITY_EXCLUDE_FLOAT -void 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) -{ - _UU32 elements = num_elements; - UNITY_PTR_ATTRIBUTE const _UF* ptr_expected = expected; - UNITY_PTR_ATTRIBUTE const _UF* ptr_actual = actual; - _UF diff, tol; - - UNITY_SKIP_EXECUTION; - - if (elements == 0) - { - UnityTestResultsFailBegin(lineNumber); - UnityPrint(UnityStrPointless); - UnityAddMsgIfSpecified(msg); - UNITY_FAIL_AND_BAIL; - } - - if (UnityCheckArraysForNull((UNITY_INTERNAL_PTR)expected, (UNITY_INTERNAL_PTR)actual, lineNumber, msg) == 1) - return; - - while (elements--) - { - diff = *ptr_expected - *ptr_actual; - if (diff < 0.0f) - diff = 0.0f - diff; - tol = UNITY_FLOAT_PRECISION * *ptr_expected; - if (tol < 0.0f) - tol = 0.0f - tol; - - //This first part of this condition will catch any NaN or Infinite values - if ((diff * 0.0f != 0.0f) || (diff > tol)) - { - UnityTestResultsFailBegin(lineNumber); - UnityPrint(UnityStrElement); - UnityPrintNumberByStyle((num_elements - elements - 1), UNITY_DISPLAY_STYLE_UINT); -#ifdef UNITY_FLOAT_VERBOSE - UnityPrint(UnityStrExpected); - UnityPrintFloat(*ptr_expected); - UnityPrint(UnityStrWas); - UnityPrintFloat(*ptr_actual); -#else - UnityPrint(UnityStrDelta); -#endif - UnityAddMsgIfSpecified(msg); - UNITY_FAIL_AND_BAIL; - } - ptr_expected++; - ptr_actual++; - } -} - -//----------------------------------------------- -void UnityAssertFloatsWithin(const _UF delta, - const _UF expected, - const _UF actual, - const char* msg, - const UNITY_LINE_TYPE lineNumber) -{ - _UF diff = actual - expected; - _UF pos_delta = delta; - - UNITY_SKIP_EXECUTION; - - if (diff < 0.0f) - { - diff = 0.0f - diff; - } - if (pos_delta < 0.0f) - { - pos_delta = 0.0f - pos_delta; - } - - //This first part of this condition will catch any NaN or Infinite values - if ((diff * 0.0f != 0.0f) || (pos_delta < diff)) - { - UnityTestResultsFailBegin(lineNumber); -#ifdef UNITY_FLOAT_VERBOSE - UnityPrint(UnityStrExpected); - UnityPrintFloat(expected); - UnityPrint(UnityStrWas); - UnityPrintFloat(actual); -#else - UnityPrint(UnityStrDelta); -#endif - UnityAddMsgIfSpecified(msg); - UNITY_FAIL_AND_BAIL; - } -} - -//----------------------------------------------- -void UnityAssertFloatSpecial(const _UF actual, - const char* msg, - const UNITY_LINE_TYPE lineNumber, - const UNITY_FLOAT_TRAIT_T style) -{ - const char* trait_names[] = { UnityStrInf, UnityStrNegInf, UnityStrNaN, UnityStrDet }; - _U_SINT should_be_trait = ((_U_SINT)style & 1); - _U_SINT is_trait = !should_be_trait; - _U_SINT trait_index = style >> 1; - - UNITY_SKIP_EXECUTION; - - switch(style) - { - //To determine Inf / Neg Inf, we compare to an Inf / Neg Inf value we create on the fly - //We are using a variable to hold the zero value because some compilers complain about dividing by zero otherwise - case UNITY_FLOAT_IS_INF: - case UNITY_FLOAT_IS_NOT_INF: - is_trait = isinf(actual) & ispos(actual); - break; - case UNITY_FLOAT_IS_NEG_INF: - case UNITY_FLOAT_IS_NOT_NEG_INF: - is_trait = isinf(actual) & isneg(actual); - break; - - //NaN is the only floating point value that does NOT equal itself. Therefore if Actual == Actual, then it is NOT NaN. - case UNITY_FLOAT_IS_NAN: - case UNITY_FLOAT_IS_NOT_NAN: - is_trait = isnan(actual); - break; - - //A determinate number is non infinite and not NaN. (therefore the opposite of the two above) - case UNITY_FLOAT_IS_DET: - case UNITY_FLOAT_IS_NOT_DET: - if (isinf(actual) | isnan(actual)) - is_trait = 0; - else - is_trait = 1; - break; - - default: - break; - } - - if (is_trait != should_be_trait) - { - UnityTestResultsFailBegin(lineNumber); - UnityPrint(UnityStrExpected); - if (!should_be_trait) - UnityPrint(UnityStrNot); - UnityPrint(trait_names[trait_index]); - UnityPrint(UnityStrWas); -#ifdef UNITY_FLOAT_VERBOSE - UnityPrintFloat(actual); -#else - if (should_be_trait) - UnityPrint(UnityStrNot); - UnityPrint(trait_names[trait_index]); -#endif - UnityAddMsgIfSpecified(msg); - UNITY_FAIL_AND_BAIL; - } -} - -#endif //not UNITY_EXCLUDE_FLOAT - -//----------------------------------------------- -#ifndef UNITY_EXCLUDE_DOUBLE -void 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) -{ - _UU32 elements = num_elements; - UNITY_PTR_ATTRIBUTE const _UD* ptr_expected = expected; - UNITY_PTR_ATTRIBUTE const _UD* ptr_actual = actual; - _UD diff, tol; - - UNITY_SKIP_EXECUTION; - - if (elements == 0) - { - UnityTestResultsFailBegin(lineNumber); - UnityPrint(UnityStrPointless); - UnityAddMsgIfSpecified(msg); - UNITY_FAIL_AND_BAIL; - } - - if (UnityCheckArraysForNull((UNITY_INTERNAL_PTR)expected, (UNITY_INTERNAL_PTR)actual, lineNumber, msg) == 1) - return; - - while (elements--) - { - diff = *ptr_expected - *ptr_actual; - if (diff < 0.0) - diff = 0.0 - diff; - tol = UNITY_DOUBLE_PRECISION * *ptr_expected; - if (tol < 0.0) - tol = 0.0 - tol; - - //This first part of this condition will catch any NaN or Infinite values - if ((diff * 0.0 != 0.0) || (diff > tol)) - { - UnityTestResultsFailBegin(lineNumber); - UnityPrint(UnityStrElement); - UnityPrintNumberByStyle((num_elements - elements - 1), UNITY_DISPLAY_STYLE_UINT); -#ifdef UNITY_DOUBLE_VERBOSE - UnityPrint(UnityStrExpected); - UnityPrintFloat((float)(*ptr_expected)); - UnityPrint(UnityStrWas); - UnityPrintFloat((float)(*ptr_actual)); -#else - UnityPrint(UnityStrDelta); -#endif - UnityAddMsgIfSpecified(msg); - UNITY_FAIL_AND_BAIL; - } - ptr_expected++; - ptr_actual++; - } -} - -//----------------------------------------------- -void UnityAssertDoublesWithin(const _UD delta, - const _UD expected, - const _UD actual, - const char* msg, - const UNITY_LINE_TYPE lineNumber) -{ - _UD diff = actual - expected; - _UD pos_delta = delta; - - UNITY_SKIP_EXECUTION; - - if (diff < 0.0) - { - diff = 0.0 - diff; - } - if (pos_delta < 0.0) - { - pos_delta = 0.0 - pos_delta; - } - - //This first part of this condition will catch any NaN or Infinite values - if ((diff * 0.0 != 0.0) || (pos_delta < diff)) - { - UnityTestResultsFailBegin(lineNumber); -#ifdef UNITY_DOUBLE_VERBOSE - UnityPrint(UnityStrExpected); - UnityPrintFloat((float)expected); - UnityPrint(UnityStrWas); - UnityPrintFloat((float)actual); -#else - UnityPrint(UnityStrDelta); -#endif - UnityAddMsgIfSpecified(msg); - UNITY_FAIL_AND_BAIL; - } -} - -//----------------------------------------------- - -void UnityAssertDoubleSpecial(const _UD actual, - const char* msg, - const UNITY_LINE_TYPE lineNumber, - const UNITY_FLOAT_TRAIT_T style) -{ - const char* trait_names[] = { UnityStrInf, UnityStrNegInf, UnityStrNaN, UnityStrDet }; - _U_SINT should_be_trait = ((_U_SINT)style & 1); - _U_SINT is_trait = !should_be_trait; - _U_SINT trait_index = style >> 1; - - UNITY_SKIP_EXECUTION; - - switch(style) - { - //To determine Inf / Neg Inf, we compare to an Inf / Neg Inf value we create on the fly - //We are using a variable to hold the zero value because some compilers complain about dividing by zero otherwise - case UNITY_FLOAT_IS_INF: - case UNITY_FLOAT_IS_NOT_INF: - is_trait = isinf(actual) & ispos(actual); - break; - case UNITY_FLOAT_IS_NEG_INF: - case UNITY_FLOAT_IS_NOT_NEG_INF: - is_trait = isinf(actual) & isneg(actual); - break; - - //NaN is the only floating point value that does NOT equal itself. Therefore if Actual == Actual, then it is NOT NaN. - case UNITY_FLOAT_IS_NAN: - case UNITY_FLOAT_IS_NOT_NAN: - is_trait = isnan(actual); - break; - - //A determinate number is non infinite and not NaN. (therefore the opposite of the two above) - case UNITY_FLOAT_IS_DET: - case UNITY_FLOAT_IS_NOT_DET: - if (isinf(actual) | isnan(actual)) - is_trait = 0; - else - is_trait = 1; - break; - - default: - break; - } - - if (is_trait != should_be_trait) - { - UnityTestResultsFailBegin(lineNumber); - UnityPrint(UnityStrExpected); - if (!should_be_trait) - UnityPrint(UnityStrNot); - UnityPrint(trait_names[trait_index]); - UnityPrint(UnityStrWas); -#ifdef UNITY_DOUBLE_VERBOSE - UnityPrintFloat(actual); -#else - if (should_be_trait) - UnityPrint(UnityStrNot); - UnityPrint(trait_names[trait_index]); -#endif - UnityAddMsgIfSpecified(msg); - UNITY_FAIL_AND_BAIL; - } -} - - -#endif // not UNITY_EXCLUDE_DOUBLE - -//----------------------------------------------- -void 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) -{ - UNITY_SKIP_EXECUTION; - - if ((style & UNITY_DISPLAY_RANGE_INT) == UNITY_DISPLAY_RANGE_INT) - { - if (actual > expected) - Unity.CurrentTestFailed = ((actual - expected) > delta); - else - Unity.CurrentTestFailed = ((expected - actual) > delta); - } - else - { - if ((_U_UINT)actual > (_U_UINT)expected) - Unity.CurrentTestFailed = ((_U_UINT)(actual - expected) > (_U_UINT)delta); - else - Unity.CurrentTestFailed = ((_U_UINT)(expected - actual) > (_U_UINT)delta); - } - - if (Unity.CurrentTestFailed) - { - UnityTestResultsFailBegin(lineNumber); - UnityPrint(UnityStrDelta); - UnityPrintNumberByStyle(delta, style); - UnityPrint(UnityStrExpected); - UnityPrintNumberByStyle(expected, style); - UnityPrint(UnityStrWas); - UnityPrintNumberByStyle(actual, style); - UnityAddMsgIfSpecified(msg); - UNITY_FAIL_AND_BAIL; - } -} - -//----------------------------------------------- -void UnityAssertEqualString(const char* expected, - const char* actual, - const char* msg, - const UNITY_LINE_TYPE lineNumber) -{ - _UU32 i; - - UNITY_SKIP_EXECUTION; - - // if both pointers not null compare the strings - if (expected && actual) - { - for (i = 0; expected[i] || actual[i]; i++) - { - if (expected[i] != actual[i]) - { - Unity.CurrentTestFailed = 1; - break; - } - } - } - else - { // handle case of one pointers being null (if both null, test should pass) - if (expected != actual) - { - Unity.CurrentTestFailed = 1; - } - } - - if (Unity.CurrentTestFailed) - { - UnityTestResultsFailBegin(lineNumber); - UnityPrintExpectedAndActualStrings(expected, actual); - UnityAddMsgIfSpecified(msg); - UNITY_FAIL_AND_BAIL; - } -} - -//----------------------------------------------- -void UnityAssertEqualStringLen(const char* expected, - const char* actual, - const _UU32 length, - const char* msg, - const UNITY_LINE_TYPE lineNumber) -{ - _UU32 i; - - UNITY_SKIP_EXECUTION; - - // if both pointers not null compare the strings - if (expected && actual) - { - for (i = 0; (expected[i] || actual[i]) && i < length; i++) - { - if (expected[i] != actual[i]) - { - Unity.CurrentTestFailed = 1; - break; - } - } - } - else - { // handle case of one pointers being null (if both null, test should pass) - if (expected != actual) - { - Unity.CurrentTestFailed = 1; - } - } - - if (Unity.CurrentTestFailed) - { - UnityTestResultsFailBegin(lineNumber); - UnityPrintExpectedAndActualStringsLen(expected, actual, length); - UnityAddMsgIfSpecified(msg); - UNITY_FAIL_AND_BAIL; - } -} - - -//----------------------------------------------- -void UnityAssertEqualStringArray( const char** expected, - const char** actual, - const _UU32 num_elements, - const char* msg, - const UNITY_LINE_TYPE lineNumber) -{ - _UU32 i, j = 0; - - UNITY_SKIP_EXECUTION; - - // if no elements, it's an error - if (num_elements == 0) - { - UnityTestResultsFailBegin(lineNumber); - UnityPrint(UnityStrPointless); - UnityAddMsgIfSpecified(msg); - UNITY_FAIL_AND_BAIL; - } - - if (UnityCheckArraysForNull((UNITY_INTERNAL_PTR)expected, (UNITY_INTERNAL_PTR)actual, lineNumber, msg) == 1) - return; - - do - { - // if both pointers not null compare the strings - if (expected[j] && actual[j]) - { - for (i = 0; expected[j][i] || actual[j][i]; i++) - { - if (expected[j][i] != actual[j][i]) - { - Unity.CurrentTestFailed = 1; - break; - } - } - } - else - { // handle case of one pointers being null (if both null, test should pass) - if (expected[j] != actual[j]) - { - Unity.CurrentTestFailed = 1; - } - } - - if (Unity.CurrentTestFailed) - { - UnityTestResultsFailBegin(lineNumber); - if (num_elements > 1) - { - UnityPrint(UnityStrElement); - UnityPrintNumberByStyle((j), UNITY_DISPLAY_STYLE_UINT); - } - UnityPrintExpectedAndActualStrings((const char*)(expected[j]), (const char*)(actual[j])); - UnityAddMsgIfSpecified(msg); - UNITY_FAIL_AND_BAIL; - } - } while (++j < num_elements); -} - -//----------------------------------------------- -void UnityAssertEqualMemory( UNITY_INTERNAL_PTR expected, - UNITY_INTERNAL_PTR actual, - const _UU32 length, - const _UU32 num_elements, - const char* msg, - const UNITY_LINE_TYPE lineNumber) -{ - UNITY_PTR_ATTRIBUTE const unsigned char* ptr_exp = (UNITY_PTR_ATTRIBUTE const unsigned char*)expected; - UNITY_PTR_ATTRIBUTE const unsigned char* ptr_act = (UNITY_PTR_ATTRIBUTE const unsigned char*)actual; - _UU32 elements = num_elements; - _UU32 bytes; - - UNITY_SKIP_EXECUTION; - - if ((elements == 0) || (length == 0)) - { - UnityTestResultsFailBegin(lineNumber); - UnityPrint(UnityStrPointless); - UnityAddMsgIfSpecified(msg); - UNITY_FAIL_AND_BAIL; - } - - if (UnityCheckArraysForNull((UNITY_INTERNAL_PTR)expected, (UNITY_INTERNAL_PTR)actual, lineNumber, msg) == 1) - return; - - while (elements--) - { - ///////////////////////////////////// - bytes = length; - while (bytes--) - { - if (*ptr_exp != *ptr_act) - { - UnityTestResultsFailBegin(lineNumber); - UnityPrint(UnityStrMemory); - if (num_elements > 1) - { - UnityPrint(UnityStrElement); - UnityPrintNumberByStyle((num_elements - elements - 1), UNITY_DISPLAY_STYLE_UINT); - } - UnityPrint(UnityStrByte); - UnityPrintNumberByStyle((length - bytes - 1), UNITY_DISPLAY_STYLE_UINT); - UnityPrint(UnityStrExpected); - UnityPrintNumberByStyle(*ptr_exp, UNITY_DISPLAY_STYLE_HEX8); - UnityPrint(UnityStrWas); - UnityPrintNumberByStyle(*ptr_act, UNITY_DISPLAY_STYLE_HEX8); - UnityAddMsgIfSpecified(msg); - UNITY_FAIL_AND_BAIL; - } - ptr_exp = (UNITY_INTERNAL_PTR)((_UP)ptr_exp + 1); - ptr_act = (UNITY_INTERNAL_PTR)((_UP)ptr_act + 1); - } - ///////////////////////////////////// - - } -} - -//----------------------------------------------- -// Control Functions -//----------------------------------------------- - -void UnityFail(const char* msg, const UNITY_LINE_TYPE line) -{ - UNITY_SKIP_EXECUTION; - - UnityTestResultsBegin(Unity.TestFile, line); - UnityPrintFail(); - if (msg != NULL) - { - UNITY_OUTPUT_CHAR(':'); - -#ifndef UNITY_EXCLUDE_DETAILS - if (Unity.CurrentDetail1) - { - UnityPrint(UnityStrDetail1Name); - UnityPrint(Unity.CurrentDetail1); - if (Unity.CurrentDetail2) - { - UnityPrint(UnityStrDetail2Name); - UnityPrint(Unity.CurrentDetail2); - } - UnityPrint(UnityStrSpacer); - } -#endif - if (msg[0] != ' ') - { - UNITY_OUTPUT_CHAR(' '); - } - UnityPrint(msg); - } - - UNITY_FAIL_AND_BAIL; -} - -//----------------------------------------------- -void UnityIgnore(const char* msg, const UNITY_LINE_TYPE line) -{ - UNITY_SKIP_EXECUTION; - - UnityTestResultsBegin(Unity.TestFile, line); - UnityPrint(UnityStrIgnore); - if (msg != NULL) - { - UNITY_OUTPUT_CHAR(':'); - UNITY_OUTPUT_CHAR(' '); - UnityPrint(msg); - } - UNITY_IGNORE_AND_BAIL; -} - -//----------------------------------------------- -#if defined(UNITY_WEAK_ATTRIBUTE) - void setUp(void); - void tearDown(void); - UNITY_WEAK_ATTRIBUTE void setUp(void) { } - UNITY_WEAK_ATTRIBUTE void tearDown(void) { } -#elif defined(UNITY_WEAK_PRAGMA) -# pragma weak setUp - void setUp(void) { } -# pragma weak tearDown - void tearDown(void) { } -#else - void setUp(void); - void tearDown(void); -#endif -//----------------------------------------------- -void UnityDefaultTestRun(UnityTestFunction Func, const char* FuncName, const int FuncLineNum) -{ - Unity.CurrentTestName = FuncName; - Unity.CurrentTestLineNumber = (UNITY_LINE_TYPE)FuncLineNum; - Unity.NumberOfTests++; - UNITY_CLR_DETAILS(); - if (TEST_PROTECT()) - { - setUp(); - Func(); - } - if (TEST_PROTECT() && !(Unity.CurrentTestIgnored)) - { - tearDown(); - } - UnityConcludeTest(); -} - -//----------------------------------------------- -void UnityBegin(const char* filename) -{ - Unity.TestFile = filename; - Unity.CurrentTestName = NULL; - Unity.CurrentTestLineNumber = 0; - Unity.NumberOfTests = 0; - Unity.TestFailures = 0; - Unity.TestIgnores = 0; - Unity.CurrentTestFailed = 0; - Unity.CurrentTestIgnored = 0; - - UNITY_CLR_DETAILS(); - UNITY_OUTPUT_START(); -} - -//----------------------------------------------- -int UnityEnd(void) -{ - UNITY_PRINT_EOL(); - UnityPrint(UnityStrBreaker); - UNITY_PRINT_EOL(); - UnityPrintNumber((_U_SINT)(Unity.NumberOfTests)); - UnityPrint(UnityStrResultsTests); - UnityPrintNumber((_U_SINT)(Unity.TestFailures)); - UnityPrint(UnityStrResultsFailures); - UnityPrintNumber((_U_SINT)(Unity.TestIgnores)); - UnityPrint(UnityStrResultsIgnored); - UNITY_PRINT_EOL(); - if (Unity.TestFailures == 0U) - { - UnityPrintOk(); - } - else - { - UnityPrintFail(); - } - UNITY_PRINT_EOL(); - UNITY_OUTPUT_COMPLETE(); - return (int)(Unity.TestFailures); -} - -//----------------------------------------------- +/* ========================================================================= + Unity Project - A Test Framework for C + Copyright (c) 2007-14 Mike Karlesky, Mark VanderVoord, Greg Williams + [Released under MIT License. Please refer to license.txt for details] +============================================================================ */ + +#include "unity.h" +#include + +#define UNITY_FAIL_AND_BAIL { Unity.CurrentTestFailed = 1; longjmp(Unity.AbortFrame, 1); } +#define UNITY_IGNORE_AND_BAIL { Unity.CurrentTestIgnored = 1; longjmp(Unity.AbortFrame, 1); } +/// return prematurely if we are already in failure or ignore state +#define UNITY_SKIP_EXECUTION { if ((Unity.CurrentTestFailed != 0) || (Unity.CurrentTestIgnored != 0)) {return;} } + +struct _Unity Unity; + +const char UnityStrOk[] = "OK"; +const char UnityStrPass[] = "PASS"; +const char UnityStrFail[] = "FAIL"; +const char UnityStrIgnore[] = "IGNORE"; +const char UnityStrNull[] = "NULL"; +const char UnityStrSpacer[] = ". "; +const char UnityStrExpected[] = " Expected "; +const char UnityStrWas[] = " Was "; +const char UnityStrTo[] = " To "; +const char UnityStrElement[] = " Element "; +const char UnityStrByte[] = " Byte "; +const char UnityStrMemory[] = " Memory Mismatch."; +const char UnityStrDelta[] = " Values Not Within Delta "; +const char UnityStrPointless[] = " You Asked Me To Compare Nothing, Which Was Pointless."; +const char UnityStrNullPointerForExpected[] = " Expected pointer to be NULL"; +const char UnityStrNullPointerForActual[] = " Actual pointer was NULL"; +const char UnityStrNot[] = "Not "; +const char UnityStrInf[] = "Infinity"; +const char UnityStrNegInf[] = "Negative Infinity"; +const char UnityStrNaN[] = "NaN"; +const char UnityStrDet[] = "Determinate"; +const char UnityStrErrFloat[] = "Unity Floating Point Disabled"; +const char UnityStrErrDouble[] = "Unity Double Precision Disabled"; +const char UnityStrErr64[] = "Unity 64-bit Support Disabled"; +const char UnityStrBreaker[] = "-----------------------"; +const char UnityStrResultsTests[] = " Tests "; +const char UnityStrResultsFailures[] = " Failures "; +const char UnityStrResultsIgnored[] = " Ignored "; +const char UnityStrDetail1Name[] = UNITY_DETAIL1_NAME " "; +const char UnityStrDetail2Name[] = " " UNITY_DETAIL2_NAME " "; + +#ifdef UNITY_FLOAT_NEEDS_ZERO +// Dividing by these constants produces +/- infinity. +// The rationale is given in UnityAssertFloatIsInf's body. +static const _UF f_zero = 0.0f; +#endif + +// compiler-generic print formatting masks +const _U_UINT UnitySizeMask[] = +{ + 255u, // 0xFF + 65535u, // 0xFFFF + 65535u, + 4294967295u, // 0xFFFFFFFF + 4294967295u, + 4294967295u, + 4294967295u +#ifdef UNITY_SUPPORT_64 + ,0xFFFFFFFFFFFFFFFF +#endif +}; + +void UnityPrintFail(void); +void UnityPrintOk(void); + +//----------------------------------------------- +// Pretty Printers & Test Result Output Handlers +//----------------------------------------------- + +void UnityPrint(const char* string) +{ + const char* pch = string; + + if (pch != NULL) + { + while (*pch) + { + // printable characters plus CR & LF are printed + if ((*pch <= 126) && (*pch >= 32)) + { + UNITY_OUTPUT_CHAR(*pch); + } + //write escaped carriage returns + else if (*pch == 13) + { + UNITY_OUTPUT_CHAR('\\'); + UNITY_OUTPUT_CHAR('r'); + } + //write escaped line feeds + else if (*pch == 10) + { + UNITY_OUTPUT_CHAR('\\'); + UNITY_OUTPUT_CHAR('n'); + } + // unprintable characters are shown as codes + else + { + UNITY_OUTPUT_CHAR('\\'); + UnityPrintNumberHex((_U_UINT)*pch, 2); + } + pch++; + } + } +} + +void UnityPrintLen(const char* string, const _UU32 length); +void UnityPrintLen(const char* string, const _UU32 length) +{ + const char* pch = string; + + if (pch != NULL) + { + while (*pch && (_UU32)(pch - string) < length) + { + // printable characters plus CR & LF are printed + if ((*pch <= 126) && (*pch >= 32)) + { + UNITY_OUTPUT_CHAR(*pch); + } + //write escaped carriage returns + else if (*pch == 13) + { + UNITY_OUTPUT_CHAR('\\'); + UNITY_OUTPUT_CHAR('r'); + } + //write escaped line feeds + else if (*pch == 10) + { + UNITY_OUTPUT_CHAR('\\'); + UNITY_OUTPUT_CHAR('n'); + } + // unprintable characters are shown as codes + else + { + UNITY_OUTPUT_CHAR('\\'); + UnityPrintNumberHex((_U_UINT)*pch, 2); + } + pch++; + } + } +} + +//----------------------------------------------- +void UnityPrintNumberByStyle(const _U_SINT number, const UNITY_DISPLAY_STYLE_T style) +{ + if ((style & UNITY_DISPLAY_RANGE_INT) == UNITY_DISPLAY_RANGE_INT) + { + UnityPrintNumber(number); + } + else if ((style & UNITY_DISPLAY_RANGE_UINT) == UNITY_DISPLAY_RANGE_UINT) + { + UnityPrintNumberUnsigned( (_U_UINT)number & UnitySizeMask[((_U_UINT)style & (_U_UINT)0x0F) - 1] ); + } + else + { + UnityPrintNumberHex((_U_UINT)number, (char)((style & 0x000F) << 1)); + } +} + +//----------------------------------------------- +/// basically do an itoa using as little ram as possible +void UnityPrintNumber(const _U_SINT number_to_print) +{ + _U_UINT divisor = 1; + _U_UINT next_divisor; + _U_UINT number; + + if (number_to_print < 0) + { + //A negative number, including MIN negative + UNITY_OUTPUT_CHAR('-'); + number = (_U_UINT)(-number_to_print); + } + else + { + //Non-negative number + number = (_U_UINT)number_to_print; + } + + // figure out initial divisor + while (number / divisor > 9) + { + next_divisor = divisor * 10; + if (next_divisor > divisor) + divisor = next_divisor; + else + break; + } + + // now mod and print, then divide divisor + do + { + UNITY_OUTPUT_CHAR((char)('0' + (number / divisor % 10))); + divisor /= 10; + } + while (divisor > 0); +} + +//----------------------------------------------- +/// basically do an itoa using as little ram as possible +void UnityPrintNumberUnsigned(const _U_UINT number) +{ + _U_UINT divisor = 1; + _U_UINT next_divisor; + + // figure out initial divisor + while (number / divisor > 9) + { + next_divisor = divisor * 10; + if (next_divisor > divisor) + divisor = next_divisor; + else + break; + } + + // now mod and print, then divide divisor + do + { + UNITY_OUTPUT_CHAR((char)('0' + (number / divisor % 10))); + divisor /= 10; + } + while (divisor > 0); +} + +//----------------------------------------------- +void UnityPrintNumberHex(const _U_UINT number, const char nibbles_to_print) +{ + _U_UINT nibble; + char nibbles = nibbles_to_print; + UNITY_OUTPUT_CHAR('0'); + UNITY_OUTPUT_CHAR('x'); + + while (nibbles > 0) + { + nibble = (number >> (--nibbles << 2)) & 0x0000000F; + if (nibble <= 9) + { + UNITY_OUTPUT_CHAR((char)('0' + nibble)); + } + else + { + UNITY_OUTPUT_CHAR((char)('A' - 10 + nibble)); + } + } +} + +//----------------------------------------------- +void UnityPrintMask(const _U_UINT mask, const _U_UINT number) +{ + _U_UINT current_bit = (_U_UINT)1 << (UNITY_INT_WIDTH - 1); + _US32 i; + + for (i = 0; i < UNITY_INT_WIDTH; i++) + { + if (current_bit & mask) + { + if (current_bit & number) + { + UNITY_OUTPUT_CHAR('1'); + } + else + { + UNITY_OUTPUT_CHAR('0'); + } + } + else + { + UNITY_OUTPUT_CHAR('X'); + } + current_bit = current_bit >> 1; + } +} + +//----------------------------------------------- +#ifdef UNITY_FLOAT_VERBOSE +#include +void UnityPrintFloat(_UF number) +{ + char TempBuffer[32]; + sprintf(TempBuffer, "%.6f", number); + UnityPrint(TempBuffer); +} +#endif + +//----------------------------------------------- + +void UnityPrintFail(void); +void UnityPrintFail(void) +{ + UnityPrint(UnityStrFail); +} + +void UnityPrintOk(void); +void UnityPrintOk(void) +{ + UnityPrint(UnityStrOk); +} + +//----------------------------------------------- +static void UnityTestResultsBegin(const char* file, const UNITY_LINE_TYPE line); +static void UnityTestResultsBegin(const char* file, const UNITY_LINE_TYPE line) +{ +#ifndef UNITY_FIXTURES + UnityPrint(file); + UNITY_OUTPUT_CHAR(':'); + UnityPrintNumber((_U_SINT)line); + UNITY_OUTPUT_CHAR(':'); + UnityPrint(Unity.CurrentTestName); + UNITY_OUTPUT_CHAR(':'); +#else + UNITY_UNUSED(file); + UNITY_UNUSED(line); +#endif +} + +//----------------------------------------------- +static void UnityTestResultsFailBegin(const UNITY_LINE_TYPE line); +static void UnityTestResultsFailBegin(const UNITY_LINE_TYPE line) +{ +#ifndef UNITY_FIXTURES + UnityTestResultsBegin(Unity.TestFile, line); +#else + UNITY_UNUSED(line); +#endif + UnityPrint(UnityStrFail); + UNITY_OUTPUT_CHAR(':'); +} + +//----------------------------------------------- +void UnityConcludeTest(void) +{ + if (Unity.CurrentTestIgnored) + { + Unity.TestIgnores++; + } + else if (!Unity.CurrentTestFailed) + { + UnityTestResultsBegin(Unity.TestFile, Unity.CurrentTestLineNumber); + UnityPrint(UnityStrPass); + } + else + { + Unity.TestFailures++; + } + + Unity.CurrentTestFailed = 0; + Unity.CurrentTestIgnored = 0; + UNITY_PRINT_EOL(); +} + +//----------------------------------------------- +static void UnityAddMsgIfSpecified(const char* msg); +static void UnityAddMsgIfSpecified(const char* msg) +{ + if (msg) + { + UnityPrint(UnityStrSpacer); +#ifndef UNITY_EXCLUDE_DETAILS + if (Unity.CurrentDetail1) + { + UnityPrint(UnityStrDetail1Name); + UnityPrint(Unity.CurrentDetail1); + if (Unity.CurrentDetail2) + { + UnityPrint(UnityStrDetail2Name); + UnityPrint(Unity.CurrentDetail2); + } + UnityPrint(UnityStrSpacer); + } +#endif + UnityPrint(msg); + } +} + +//----------------------------------------------- +static void UnityPrintExpectedAndActualStrings(const char* expected, const char* actual); +static void UnityPrintExpectedAndActualStrings(const char* expected, const char* actual) +{ + UnityPrint(UnityStrExpected); + if (expected != NULL) + { + UNITY_OUTPUT_CHAR('\''); + UnityPrint(expected); + UNITY_OUTPUT_CHAR('\''); + } + else + { + UnityPrint(UnityStrNull); + } + UnityPrint(UnityStrWas); + if (actual != NULL) + { + UNITY_OUTPUT_CHAR('\''); + UnityPrint(actual); + UNITY_OUTPUT_CHAR('\''); + } + else + { + UnityPrint(UnityStrNull); + } +} + +//----------------------------------------------- +static void UnityPrintExpectedAndActualStringsLen(const char* expected, const char* actual, const _UU32 length) +{ + UnityPrint(UnityStrExpected); + if (expected != NULL) + { + UNITY_OUTPUT_CHAR('\''); + UnityPrintLen(expected, length); + UNITY_OUTPUT_CHAR('\''); + } + else + { + UnityPrint(UnityStrNull); + } + UnityPrint(UnityStrWas); + if (actual != NULL) + { + UNITY_OUTPUT_CHAR('\''); + UnityPrintLen(actual, length); + UNITY_OUTPUT_CHAR('\''); + } + else + { + UnityPrint(UnityStrNull); + } +} + + + +//----------------------------------------------- +// Assertion & Control Helpers +//----------------------------------------------- + +static int UnityCheckArraysForNull(UNITY_INTERNAL_PTR expected, UNITY_INTERNAL_PTR actual, const UNITY_LINE_TYPE lineNumber, const char* msg) +{ + //return true if they are both NULL + if ((expected == NULL) && (actual == NULL)) + return 1; + + //throw error if just expected is NULL + if (expected == NULL) + { + UnityTestResultsFailBegin(lineNumber); + UnityPrint(UnityStrNullPointerForExpected); + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } + + //throw error if just actual is NULL + if (actual == NULL) + { + UnityTestResultsFailBegin(lineNumber); + UnityPrint(UnityStrNullPointerForActual); + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } + + //return false if neither is NULL + return 0; +} + +//----------------------------------------------- +// Assertion Functions +//----------------------------------------------- + +void UnityAssertBits(const _U_SINT mask, + const _U_SINT expected, + const _U_SINT actual, + const char* msg, + const UNITY_LINE_TYPE lineNumber) +{ + UNITY_SKIP_EXECUTION; + + if ((mask & expected) != (mask & actual)) + { + UnityTestResultsFailBegin(lineNumber); + UnityPrint(UnityStrExpected); + UnityPrintMask((_U_UINT)mask, (_U_UINT)expected); + UnityPrint(UnityStrWas); + UnityPrintMask((_U_UINT)mask, (_U_UINT)actual); + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } +} + +//----------------------------------------------- +void UnityAssertEqualNumber(const _U_SINT expected, + const _U_SINT actual, + const char* msg, + const UNITY_LINE_TYPE lineNumber, + const UNITY_DISPLAY_STYLE_T style) +{ + UNITY_SKIP_EXECUTION; + + if (expected != actual) + { + UnityTestResultsFailBegin(lineNumber); + UnityPrint(UnityStrExpected); + UnityPrintNumberByStyle(expected, style); + UnityPrint(UnityStrWas); + UnityPrintNumberByStyle(actual, style); + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } +} + +//----------------------------------------------- +void UnityAssertEqualIntArray(UNITY_INTERNAL_PTR expected, + UNITY_INTERNAL_PTR actual, + const _UU32 num_elements, + const char* msg, + const UNITY_LINE_TYPE lineNumber, + const UNITY_DISPLAY_STYLE_T style) +{ + _UU32 elements = num_elements; + UNITY_INTERNAL_PTR ptr_exp = (UNITY_INTERNAL_PTR)expected; + UNITY_INTERNAL_PTR ptr_act = (UNITY_INTERNAL_PTR)actual; + + UNITY_SKIP_EXECUTION; + + if (elements == 0) + { + UnityTestResultsFailBegin(lineNumber); + UnityPrint(UnityStrPointless); + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } + + if (UnityCheckArraysForNull((UNITY_INTERNAL_PTR)expected, (UNITY_INTERNAL_PTR)actual, lineNumber, msg) == 1) + return; + + // If style is UNITY_DISPLAY_STYLE_INT, we'll fall into the default case rather than the INT16 or INT32 (etc) case + // as UNITY_DISPLAY_STYLE_INT includes a flag for UNITY_DISPLAY_RANGE_AUTO, which the width-specific + // variants do not. Therefore remove this flag. + switch(style & (UNITY_DISPLAY_STYLE_T)(~UNITY_DISPLAY_RANGE_AUTO)) + { + case UNITY_DISPLAY_STYLE_HEX8: + case UNITY_DISPLAY_STYLE_INT8: + case UNITY_DISPLAY_STYLE_UINT8: + while (elements--) + { + if (*(UNITY_PTR_ATTRIBUTE const _US8*)ptr_exp != *(UNITY_PTR_ATTRIBUTE const _US8*)ptr_act) + { + UnityTestResultsFailBegin(lineNumber); + UnityPrint(UnityStrElement); + UnityPrintNumberByStyle((num_elements - elements - 1), UNITY_DISPLAY_STYLE_UINT); + UnityPrint(UnityStrExpected); + UnityPrintNumberByStyle(*(UNITY_PTR_ATTRIBUTE const _US8*)ptr_exp, style); + UnityPrint(UnityStrWas); + UnityPrintNumberByStyle(*(UNITY_PTR_ATTRIBUTE const _US8*)ptr_act, style); + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } + ptr_exp = (UNITY_INTERNAL_PTR)((_UP)ptr_exp + 1); + ptr_act = (UNITY_INTERNAL_PTR)((_UP)ptr_act + 1); + } + break; + case UNITY_DISPLAY_STYLE_HEX16: + case UNITY_DISPLAY_STYLE_INT16: + case UNITY_DISPLAY_STYLE_UINT16: + while (elements--) + { + if (*(UNITY_PTR_ATTRIBUTE const _US16*)ptr_exp != *(UNITY_PTR_ATTRIBUTE const _US16*)ptr_act) + { + UnityTestResultsFailBegin(lineNumber); + UnityPrint(UnityStrElement); + UnityPrintNumberByStyle((num_elements - elements - 1), UNITY_DISPLAY_STYLE_UINT); + UnityPrint(UnityStrExpected); + UnityPrintNumberByStyle(*(UNITY_PTR_ATTRIBUTE const _US16*)ptr_exp, style); + UnityPrint(UnityStrWas); + UnityPrintNumberByStyle(*(UNITY_PTR_ATTRIBUTE const _US16*)ptr_act, style); + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } + ptr_exp = (UNITY_INTERNAL_PTR)((_UP)ptr_exp + 2); + ptr_act = (UNITY_INTERNAL_PTR)((_UP)ptr_act + 2); + } + break; +#ifdef UNITY_SUPPORT_64 + case UNITY_DISPLAY_STYLE_HEX64: + case UNITY_DISPLAY_STYLE_INT64: + case UNITY_DISPLAY_STYLE_UINT64: + while (elements--) + { + if (*(UNITY_PTR_ATTRIBUTE const _US64*)ptr_exp != *(UNITY_PTR_ATTRIBUTE const _US64*)ptr_act) + { + UnityTestResultsFailBegin(lineNumber); + UnityPrint(UnityStrElement); + UnityPrintNumberByStyle((num_elements - elements - 1), UNITY_DISPLAY_STYLE_UINT); + UnityPrint(UnityStrExpected); + UnityPrintNumberByStyle(*(UNITY_PTR_ATTRIBUTE const _US64*)ptr_exp, style); + UnityPrint(UnityStrWas); + UnityPrintNumberByStyle(*(UNITY_PTR_ATTRIBUTE const _US64*)ptr_act, style); + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } + ptr_exp = (UNITY_INTERNAL_PTR)((_UP)ptr_exp + 8); + ptr_act = (UNITY_INTERNAL_PTR)((_UP)ptr_act + 8); + } + break; +#endif + default: + while (elements--) + { + if (*(UNITY_PTR_ATTRIBUTE const _US32*)ptr_exp != *(UNITY_PTR_ATTRIBUTE const _US32*)ptr_act) + { + UnityTestResultsFailBegin(lineNumber); + UnityPrint(UnityStrElement); + UnityPrintNumberByStyle((num_elements - elements - 1), UNITY_DISPLAY_STYLE_UINT); + UnityPrint(UnityStrExpected); + UnityPrintNumberByStyle(*(UNITY_PTR_ATTRIBUTE const _US32*)ptr_exp, style); + UnityPrint(UnityStrWas); + UnityPrintNumberByStyle(*(UNITY_PTR_ATTRIBUTE const _US32*)ptr_act, style); + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } + ptr_exp = (UNITY_INTERNAL_PTR)((_UP)ptr_exp + 4); + ptr_act = (UNITY_INTERNAL_PTR)((_UP)ptr_act + 4); + } + break; + } +} + +//----------------------------------------------- +#ifndef UNITY_EXCLUDE_FLOAT +void 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) +{ + _UU32 elements = num_elements; + UNITY_PTR_ATTRIBUTE const _UF* ptr_expected = expected; + UNITY_PTR_ATTRIBUTE const _UF* ptr_actual = actual; + _UF diff, tol; + + UNITY_SKIP_EXECUTION; + + if (elements == 0) + { + UnityTestResultsFailBegin(lineNumber); + UnityPrint(UnityStrPointless); + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } + + if (UnityCheckArraysForNull((UNITY_INTERNAL_PTR)expected, (UNITY_INTERNAL_PTR)actual, lineNumber, msg) == 1) + return; + + while (elements--) + { + diff = *ptr_expected - *ptr_actual; + if (diff < 0.0f) + diff = 0.0f - diff; + tol = UNITY_FLOAT_PRECISION * *ptr_expected; + if (tol < 0.0f) + tol = 0.0f - tol; + + //This first part of this condition will catch any NaN or Infinite values + if ((diff * 0.0f != 0.0f) || (diff > tol)) + { + UnityTestResultsFailBegin(lineNumber); + UnityPrint(UnityStrElement); + UnityPrintNumberByStyle((num_elements - elements - 1), UNITY_DISPLAY_STYLE_UINT); +#ifdef UNITY_FLOAT_VERBOSE + UnityPrint(UnityStrExpected); + UnityPrintFloat(*ptr_expected); + UnityPrint(UnityStrWas); + UnityPrintFloat(*ptr_actual); +#else + UnityPrint(UnityStrDelta); +#endif + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } + ptr_expected++; + ptr_actual++; + } +} + +//----------------------------------------------- +void UnityAssertFloatsWithin(const _UF delta, + const _UF expected, + const _UF actual, + const char* msg, + const UNITY_LINE_TYPE lineNumber) +{ + _UF diff = actual - expected; + _UF pos_delta = delta; + + UNITY_SKIP_EXECUTION; + + if (diff < 0.0f) + { + diff = 0.0f - diff; + } + if (pos_delta < 0.0f) + { + pos_delta = 0.0f - pos_delta; + } + + //This first part of this condition will catch any NaN or Infinite values + if ((diff * 0.0f != 0.0f) || (pos_delta < diff)) + { + UnityTestResultsFailBegin(lineNumber); +#ifdef UNITY_FLOAT_VERBOSE + UnityPrint(UnityStrExpected); + UnityPrintFloat(expected); + UnityPrint(UnityStrWas); + UnityPrintFloat(actual); +#else + UnityPrint(UnityStrDelta); +#endif + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } +} + +//----------------------------------------------- +void UnityAssertFloatSpecial(const _UF actual, + const char* msg, + const UNITY_LINE_TYPE lineNumber, + const UNITY_FLOAT_TRAIT_T style) +{ + const char* trait_names[] = { UnityStrInf, UnityStrNegInf, UnityStrNaN, UnityStrDet }; + _U_SINT should_be_trait = ((_U_SINT)style & 1); + _U_SINT is_trait = !should_be_trait; + _U_SINT trait_index = style >> 1; + + UNITY_SKIP_EXECUTION; + + switch(style) + { + //To determine Inf / Neg Inf, we compare to an Inf / Neg Inf value we create on the fly + //We are using a variable to hold the zero value because some compilers complain about dividing by zero otherwise + case UNITY_FLOAT_IS_INF: + case UNITY_FLOAT_IS_NOT_INF: + is_trait = isinf(actual) & ispos(actual); + break; + case UNITY_FLOAT_IS_NEG_INF: + case UNITY_FLOAT_IS_NOT_NEG_INF: + is_trait = isinf(actual) & isneg(actual); + break; + + //NaN is the only floating point value that does NOT equal itself. Therefore if Actual == Actual, then it is NOT NaN. + case UNITY_FLOAT_IS_NAN: + case UNITY_FLOAT_IS_NOT_NAN: + is_trait = isnan(actual); + break; + + //A determinate number is non infinite and not NaN. (therefore the opposite of the two above) + case UNITY_FLOAT_IS_DET: + case UNITY_FLOAT_IS_NOT_DET: + if (isinf(actual) | isnan(actual)) + is_trait = 0; + else + is_trait = 1; + break; + + default: + break; + } + + if (is_trait != should_be_trait) + { + UnityTestResultsFailBegin(lineNumber); + UnityPrint(UnityStrExpected); + if (!should_be_trait) + UnityPrint(UnityStrNot); + UnityPrint(trait_names[trait_index]); + UnityPrint(UnityStrWas); +#ifdef UNITY_FLOAT_VERBOSE + UnityPrintFloat(actual); +#else + if (should_be_trait) + UnityPrint(UnityStrNot); + UnityPrint(trait_names[trait_index]); +#endif + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } +} + +#endif //not UNITY_EXCLUDE_FLOAT + +//----------------------------------------------- +#ifndef UNITY_EXCLUDE_DOUBLE +void 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) +{ + _UU32 elements = num_elements; + UNITY_PTR_ATTRIBUTE const _UD* ptr_expected = expected; + UNITY_PTR_ATTRIBUTE const _UD* ptr_actual = actual; + _UD diff, tol; + + UNITY_SKIP_EXECUTION; + + if (elements == 0) + { + UnityTestResultsFailBegin(lineNumber); + UnityPrint(UnityStrPointless); + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } + + if (UnityCheckArraysForNull((UNITY_INTERNAL_PTR)expected, (UNITY_INTERNAL_PTR)actual, lineNumber, msg) == 1) + return; + + while (elements--) + { + diff = *ptr_expected - *ptr_actual; + if (diff < 0.0) + diff = 0.0 - diff; + tol = UNITY_DOUBLE_PRECISION * *ptr_expected; + if (tol < 0.0) + tol = 0.0 - tol; + + //This first part of this condition will catch any NaN or Infinite values + if ((diff * 0.0 != 0.0) || (diff > tol)) + { + UnityTestResultsFailBegin(lineNumber); + UnityPrint(UnityStrElement); + UnityPrintNumberByStyle((num_elements - elements - 1), UNITY_DISPLAY_STYLE_UINT); +#ifdef UNITY_DOUBLE_VERBOSE + UnityPrint(UnityStrExpected); + UnityPrintFloat((float)(*ptr_expected)); + UnityPrint(UnityStrWas); + UnityPrintFloat((float)(*ptr_actual)); +#else + UnityPrint(UnityStrDelta); +#endif + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } + ptr_expected++; + ptr_actual++; + } +} + +//----------------------------------------------- +void UnityAssertDoublesWithin(const _UD delta, + const _UD expected, + const _UD actual, + const char* msg, + const UNITY_LINE_TYPE lineNumber) +{ + _UD diff = actual - expected; + _UD pos_delta = delta; + + UNITY_SKIP_EXECUTION; + + if (diff < 0.0) + { + diff = 0.0 - diff; + } + if (pos_delta < 0.0) + { + pos_delta = 0.0 - pos_delta; + } + + //This first part of this condition will catch any NaN or Infinite values + if ((diff * 0.0 != 0.0) || (pos_delta < diff)) + { + UnityTestResultsFailBegin(lineNumber); +#ifdef UNITY_DOUBLE_VERBOSE + UnityPrint(UnityStrExpected); + UnityPrintFloat((float)expected); + UnityPrint(UnityStrWas); + UnityPrintFloat((float)actual); +#else + UnityPrint(UnityStrDelta); +#endif + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } +} + +//----------------------------------------------- + +void UnityAssertDoubleSpecial(const _UD actual, + const char* msg, + const UNITY_LINE_TYPE lineNumber, + const UNITY_FLOAT_TRAIT_T style) +{ + const char* trait_names[] = { UnityStrInf, UnityStrNegInf, UnityStrNaN, UnityStrDet }; + _U_SINT should_be_trait = ((_U_SINT)style & 1); + _U_SINT is_trait = !should_be_trait; + _U_SINT trait_index = style >> 1; + + UNITY_SKIP_EXECUTION; + + switch(style) + { + //To determine Inf / Neg Inf, we compare to an Inf / Neg Inf value we create on the fly + //We are using a variable to hold the zero value because some compilers complain about dividing by zero otherwise + case UNITY_FLOAT_IS_INF: + case UNITY_FLOAT_IS_NOT_INF: + is_trait = isinf(actual) & ispos(actual); + break; + case UNITY_FLOAT_IS_NEG_INF: + case UNITY_FLOAT_IS_NOT_NEG_INF: + is_trait = isinf(actual) & isneg(actual); + break; + + //NaN is the only floating point value that does NOT equal itself. Therefore if Actual == Actual, then it is NOT NaN. + case UNITY_FLOAT_IS_NAN: + case UNITY_FLOAT_IS_NOT_NAN: + is_trait = isnan(actual); + break; + + //A determinate number is non infinite and not NaN. (therefore the opposite of the two above) + case UNITY_FLOAT_IS_DET: + case UNITY_FLOAT_IS_NOT_DET: + if (isinf(actual) | isnan(actual)) + is_trait = 0; + else + is_trait = 1; + break; + + default: + break; + } + + if (is_trait != should_be_trait) + { + UnityTestResultsFailBegin(lineNumber); + UnityPrint(UnityStrExpected); + if (!should_be_trait) + UnityPrint(UnityStrNot); + UnityPrint(trait_names[trait_index]); + UnityPrint(UnityStrWas); +#ifdef UNITY_DOUBLE_VERBOSE + UnityPrintFloat(actual); +#else + if (should_be_trait) + UnityPrint(UnityStrNot); + UnityPrint(trait_names[trait_index]); +#endif + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } +} + + +#endif // not UNITY_EXCLUDE_DOUBLE + +//----------------------------------------------- +void 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) +{ + UNITY_SKIP_EXECUTION; + + if ((style & UNITY_DISPLAY_RANGE_INT) == UNITY_DISPLAY_RANGE_INT) + { + if (actual > expected) + Unity.CurrentTestFailed = ((actual - expected) > delta); + else + Unity.CurrentTestFailed = ((expected - actual) > delta); + } + else + { + if ((_U_UINT)actual > (_U_UINT)expected) + Unity.CurrentTestFailed = ((_U_UINT)(actual - expected) > (_U_UINT)delta); + else + Unity.CurrentTestFailed = ((_U_UINT)(expected - actual) > (_U_UINT)delta); + } + + if (Unity.CurrentTestFailed) + { + UnityTestResultsFailBegin(lineNumber); + UnityPrint(UnityStrDelta); + UnityPrintNumberByStyle(delta, style); + UnityPrint(UnityStrExpected); + UnityPrintNumberByStyle(expected, style); + UnityPrint(UnityStrWas); + UnityPrintNumberByStyle(actual, style); + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } +} + +//----------------------------------------------- +void UnityAssertEqualString(const char* expected, + const char* actual, + const char* msg, + const UNITY_LINE_TYPE lineNumber) +{ + _UU32 i; + + UNITY_SKIP_EXECUTION; + + // if both pointers not null compare the strings + if (expected && actual) + { + for (i = 0; expected[i] || actual[i]; i++) + { + if (expected[i] != actual[i]) + { + Unity.CurrentTestFailed = 1; + break; + } + } + } + else + { // handle case of one pointers being null (if both null, test should pass) + if (expected != actual) + { + Unity.CurrentTestFailed = 1; + } + } + + if (Unity.CurrentTestFailed) + { + UnityTestResultsFailBegin(lineNumber); + UnityPrintExpectedAndActualStrings(expected, actual); + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } +} + +//----------------------------------------------- +void UnityAssertEqualStringLen(const char* expected, + const char* actual, + const _UU32 length, + const char* msg, + const UNITY_LINE_TYPE lineNumber) +{ + _UU32 i; + + UNITY_SKIP_EXECUTION; + + // if both pointers not null compare the strings + if (expected && actual) + { + for (i = 0; (expected[i] || actual[i]) && i < length; i++) + { + if (expected[i] != actual[i]) + { + Unity.CurrentTestFailed = 1; + break; + } + } + } + else + { // handle case of one pointers being null (if both null, test should pass) + if (expected != actual) + { + Unity.CurrentTestFailed = 1; + } + } + + if (Unity.CurrentTestFailed) + { + UnityTestResultsFailBegin(lineNumber); + UnityPrintExpectedAndActualStringsLen(expected, actual, length); + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } +} + + +//----------------------------------------------- +void UnityAssertEqualStringArray( const char** expected, + const char** actual, + const _UU32 num_elements, + const char* msg, + const UNITY_LINE_TYPE lineNumber) +{ + _UU32 i, j = 0; + + UNITY_SKIP_EXECUTION; + + // if no elements, it's an error + if (num_elements == 0) + { + UnityTestResultsFailBegin(lineNumber); + UnityPrint(UnityStrPointless); + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } + + if (UnityCheckArraysForNull((UNITY_INTERNAL_PTR)expected, (UNITY_INTERNAL_PTR)actual, lineNumber, msg) == 1) + return; + + do + { + // if both pointers not null compare the strings + if (expected[j] && actual[j]) + { + for (i = 0; expected[j][i] || actual[j][i]; i++) + { + if (expected[j][i] != actual[j][i]) + { + Unity.CurrentTestFailed = 1; + break; + } + } + } + else + { // handle case of one pointers being null (if both null, test should pass) + if (expected[j] != actual[j]) + { + Unity.CurrentTestFailed = 1; + } + } + + if (Unity.CurrentTestFailed) + { + UnityTestResultsFailBegin(lineNumber); + if (num_elements > 1) + { + UnityPrint(UnityStrElement); + UnityPrintNumberByStyle((j), UNITY_DISPLAY_STYLE_UINT); + } + UnityPrintExpectedAndActualStrings((const char*)(expected[j]), (const char*)(actual[j])); + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } + } while (++j < num_elements); +} + +//----------------------------------------------- +void UnityAssertEqualMemory( UNITY_INTERNAL_PTR expected, + UNITY_INTERNAL_PTR actual, + const _UU32 length, + const _UU32 num_elements, + const char* msg, + const UNITY_LINE_TYPE lineNumber) +{ + UNITY_PTR_ATTRIBUTE const unsigned char* ptr_exp = (UNITY_PTR_ATTRIBUTE const unsigned char*)expected; + UNITY_PTR_ATTRIBUTE const unsigned char* ptr_act = (UNITY_PTR_ATTRIBUTE const unsigned char*)actual; + _UU32 elements = num_elements; + _UU32 bytes; + + UNITY_SKIP_EXECUTION; + + if ((elements == 0) || (length == 0)) + { + UnityTestResultsFailBegin(lineNumber); + UnityPrint(UnityStrPointless); + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } + + if (UnityCheckArraysForNull((UNITY_INTERNAL_PTR)expected, (UNITY_INTERNAL_PTR)actual, lineNumber, msg) == 1) + return; + + while (elements--) + { + ///////////////////////////////////// + bytes = length; + while (bytes--) + { + if (*ptr_exp != *ptr_act) + { + UnityTestResultsFailBegin(lineNumber); + UnityPrint(UnityStrMemory); + if (num_elements > 1) + { + UnityPrint(UnityStrElement); + UnityPrintNumberByStyle((num_elements - elements - 1), UNITY_DISPLAY_STYLE_UINT); + } + UnityPrint(UnityStrByte); + UnityPrintNumberByStyle((length - bytes - 1), UNITY_DISPLAY_STYLE_UINT); + UnityPrint(UnityStrExpected); + UnityPrintNumberByStyle(*ptr_exp, UNITY_DISPLAY_STYLE_HEX8); + UnityPrint(UnityStrWas); + UnityPrintNumberByStyle(*ptr_act, UNITY_DISPLAY_STYLE_HEX8); + UnityAddMsgIfSpecified(msg); + UNITY_FAIL_AND_BAIL; + } + ptr_exp = (UNITY_INTERNAL_PTR)((_UP)ptr_exp + 1); + ptr_act = (UNITY_INTERNAL_PTR)((_UP)ptr_act + 1); + } + ///////////////////////////////////// + + } +} + +//----------------------------------------------- +// Control Functions +//----------------------------------------------- + +void UnityFail(const char* msg, const UNITY_LINE_TYPE line) +{ + UNITY_SKIP_EXECUTION; + + UnityTestResultsBegin(Unity.TestFile, line); + UnityPrintFail(); + if (msg != NULL) + { + UNITY_OUTPUT_CHAR(':'); + +#ifndef UNITY_EXCLUDE_DETAILS + if (Unity.CurrentDetail1) + { + UnityPrint(UnityStrDetail1Name); + UnityPrint(Unity.CurrentDetail1); + if (Unity.CurrentDetail2) + { + UnityPrint(UnityStrDetail2Name); + UnityPrint(Unity.CurrentDetail2); + } + UnityPrint(UnityStrSpacer); + } +#endif + if (msg[0] != ' ') + { + UNITY_OUTPUT_CHAR(' '); + } + UnityPrint(msg); + } + + UNITY_FAIL_AND_BAIL; +} + +//----------------------------------------------- +void UnityIgnore(const char* msg, const UNITY_LINE_TYPE line) +{ + UNITY_SKIP_EXECUTION; + + UnityTestResultsBegin(Unity.TestFile, line); + UnityPrint(UnityStrIgnore); + if (msg != NULL) + { + UNITY_OUTPUT_CHAR(':'); + UNITY_OUTPUT_CHAR(' '); + UnityPrint(msg); + } + UNITY_IGNORE_AND_BAIL; +} + +//----------------------------------------------- +#if defined(UNITY_WEAK_ATTRIBUTE) + void setUp(void); + void tearDown(void); + UNITY_WEAK_ATTRIBUTE void setUp(void) { } + UNITY_WEAK_ATTRIBUTE void tearDown(void) { } +#elif defined(UNITY_WEAK_PRAGMA) +# pragma weak setUp + void setUp(void) { } +# pragma weak tearDown + void tearDown(void) { } +#else + void setUp(void); + void tearDown(void); +#endif +//----------------------------------------------- +void UnityDefaultTestRun(UnityTestFunction Func, const char* FuncName, const int FuncLineNum) +{ + Unity.CurrentTestName = FuncName; + Unity.CurrentTestLineNumber = (UNITY_LINE_TYPE)FuncLineNum; + Unity.NumberOfTests++; + UNITY_CLR_DETAILS(); + if (TEST_PROTECT()) + { + setUp(); + Func(); + } + if (TEST_PROTECT() && !(Unity.CurrentTestIgnored)) + { + tearDown(); + } + UnityConcludeTest(); +} + +//----------------------------------------------- +void UnityBegin(const char* filename) +{ + Unity.TestFile = filename; + Unity.CurrentTestName = NULL; + Unity.CurrentTestLineNumber = 0; + Unity.NumberOfTests = 0; + Unity.TestFailures = 0; + Unity.TestIgnores = 0; + Unity.CurrentTestFailed = 0; + Unity.CurrentTestIgnored = 0; + + UNITY_CLR_DETAILS(); + UNITY_OUTPUT_START(); +} + +//----------------------------------------------- +int UnityEnd(void) +{ + UNITY_PRINT_EOL(); + UnityPrint(UnityStrBreaker); + UNITY_PRINT_EOL(); + UnityPrintNumber((_U_SINT)(Unity.NumberOfTests)); + UnityPrint(UnityStrResultsTests); + UnityPrintNumber((_U_SINT)(Unity.TestFailures)); + UnityPrint(UnityStrResultsFailures); + UnityPrintNumber((_U_SINT)(Unity.TestIgnores)); + UnityPrint(UnityStrResultsIgnored); + UNITY_PRINT_EOL(); + if (Unity.TestFailures == 0U) + { + UnityPrintOk(); + } + else + { + UnityPrintFail(); + } + UNITY_PRINT_EOL(); + UNITY_OUTPUT_COMPLETE(); + return (int)(Unity.TestFailures); +} + +//-----------------------------------------------