| | |
| | |
| | |
| | |
| | |
| | |
| | #include <config.h> |
| | #include "unity.h" |
| |
|
| | #ifndef UNITY_PROGMEM |
| | #define UNITY_PROGMEM |
| | #endif |
| |
|
| | |
| | #ifdef UNITY_OMIT_OUTPUT_CHAR_HEADER_DECLARATION |
| | void UNITY_OUTPUT_CHAR(int); |
| | #endif |
| |
|
| | |
| | #define UNITY_FAIL_AND_BAIL do { Unity.CurrentTestFailed = 1; UNITY_OUTPUT_FLUSH(); TEST_ABORT(); } while (0) |
| | #define UNITY_IGNORE_AND_BAIL do { Unity.CurrentTestIgnored = 1; UNITY_OUTPUT_FLUSH(); TEST_ABORT(); } while (0) |
| | #define RETURN_IF_FAIL_OR_IGNORE do { if (Unity.CurrentTestFailed || Unity.CurrentTestIgnored) { TEST_ABORT(); } } while (0) |
| |
|
| | struct UNITY_STORAGE_T Unity; |
| |
|
| | #ifdef UNITY_OUTPUT_COLOR |
| | const char UNITY_PROGMEM UnityStrOk[] = "\033[42mOK\033[0m"; |
| | const char UNITY_PROGMEM UnityStrPass[] = "\033[42mPASS\033[0m"; |
| | const char UNITY_PROGMEM UnityStrFail[] = "\033[41mFAIL\033[0m"; |
| | const char UNITY_PROGMEM UnityStrIgnore[] = "\033[43mIGNORE\033[0m"; |
| | #else |
| | const char UNITY_PROGMEM UnityStrOk[] = "OK"; |
| | const char UNITY_PROGMEM UnityStrPass[] = "PASS"; |
| | const char UNITY_PROGMEM UnityStrFail[] = "FAIL"; |
| | const char UNITY_PROGMEM UnityStrIgnore[] = "IGNORE"; |
| | #endif |
| | static const char UNITY_PROGMEM UnityStrNull[] = "NULL"; |
| | static const char UNITY_PROGMEM UnityStrSpacer[] = ". "; |
| | static const char UNITY_PROGMEM UnityStrExpected[] = " Expected "; |
| | static const char UNITY_PROGMEM UnityStrWas[] = " Was "; |
| | static const char UNITY_PROGMEM UnityStrGt[] = " to be greater than "; |
| | static const char UNITY_PROGMEM UnityStrLt[] = " to be less than "; |
| | static const char UNITY_PROGMEM UnityStrOrEqual[] = "or equal to "; |
| | static const char UNITY_PROGMEM UnityStrNotEqual[] = " to be not equal to "; |
| | static const char UNITY_PROGMEM UnityStrElement[] = " Element "; |
| | static const char UNITY_PROGMEM UnityStrByte[] = " Byte "; |
| | static const char UNITY_PROGMEM UnityStrMemory[] = " Memory Mismatch."; |
| | static const char UNITY_PROGMEM UnityStrDelta[] = " Values Not Within Delta "; |
| | static const char UNITY_PROGMEM UnityStrPointless[] = " You Asked Me To Compare Nothing, Which Was Pointless."; |
| | static const char UNITY_PROGMEM UnityStrNullPointerForExpected[] = " Expected pointer to be NULL"; |
| | static const char UNITY_PROGMEM UnityStrNullPointerForActual[] = " Actual pointer was NULL"; |
| | #ifndef UNITY_EXCLUDE_FLOAT |
| | static const char UNITY_PROGMEM UnityStrNot[] = "Not "; |
| | static const char UNITY_PROGMEM UnityStrInf[] = "Infinity"; |
| | static const char UNITY_PROGMEM UnityStrNegInf[] = "Negative Infinity"; |
| | static const char UNITY_PROGMEM UnityStrNaN[] = "NaN"; |
| | static const char UNITY_PROGMEM UnityStrDet[] = "Determinate"; |
| | static const char UNITY_PROGMEM UnityStrInvalidFloatTrait[] = "Invalid Float Trait"; |
| | #endif |
| | const char UNITY_PROGMEM UnityStrErrShorthand[] = "Unity Shorthand Support Disabled"; |
| | const char UNITY_PROGMEM UnityStrErrFloat[] = "Unity Floating Point Disabled"; |
| | const char UNITY_PROGMEM UnityStrErrDouble[] = "Unity Double Precision Disabled"; |
| | const char UNITY_PROGMEM UnityStrErr64[] = "Unity 64-bit Support Disabled"; |
| | const char UNITY_PROGMEM UnityStrErrDetailStack[] = "Unity Detail Stack Support Disabled"; |
| | static const char UNITY_PROGMEM UnityStrBreaker[] = "-----------------------"; |
| | static const char UNITY_PROGMEM UnityStrResultsTests[] = " Tests "; |
| | static const char UNITY_PROGMEM UnityStrResultsFailures[] = " Failures "; |
| | static const char UNITY_PROGMEM UnityStrResultsIgnored[] = " Ignored "; |
| | #ifndef UNITY_EXCLUDE_DETAILS |
| | #ifdef UNITY_DETAIL_STACK_SIZE |
| | static const char* UNITY_PROGMEM UnityStrDetailLabels[] = UNITY_DETAIL_LABEL_NAMES; |
| | static const UNITY_COUNTER_TYPE UNITY_PROGMEM UnityStrDetailLabelsCount = sizeof(UnityStrDetailLabels) / sizeof(const char*); |
| | static const char UNITY_PROGMEM UnityStrErrDetailStackEmpty[] = " Detail Stack Empty"; |
| | static const char UNITY_PROGMEM UnityStrErrDetailStackFull[] = " Detail Stack Full"; |
| | static const char UNITY_PROGMEM UnityStrErrDetailStackLabel[] = " Detail Label Outside Of UNITY_DETAIL_LABEL_NAMES: "; |
| | static const char UNITY_PROGMEM UnityStrErrDetailStackPop[] = " Detail Pop With Unexpected Arguments"; |
| | #else |
| | static const char UNITY_PROGMEM UnityStrDetail1Name[] = UNITY_DETAIL1_NAME " "; |
| | static const char UNITY_PROGMEM UnityStrDetail2Name[] = " " UNITY_DETAIL2_NAME " "; |
| | #endif |
| | #endif |
| | |
| | |
| | |
| |
|
| | |
| | |
| | static void UnityPrintChar(const char* pch) |
| | { |
| | |
| | if ((*pch <= 126) && (*pch >= 32)) |
| | { |
| | UNITY_OUTPUT_CHAR(*pch); |
| | } |
| | |
| | else if (*pch == 13) |
| | { |
| | UNITY_OUTPUT_CHAR('\\'); |
| | UNITY_OUTPUT_CHAR('r'); |
| | } |
| | |
| | else if (*pch == 10) |
| | { |
| | UNITY_OUTPUT_CHAR('\\'); |
| | UNITY_OUTPUT_CHAR('n'); |
| | } |
| | |
| | else |
| | { |
| | UNITY_OUTPUT_CHAR('\\'); |
| | UNITY_OUTPUT_CHAR('x'); |
| | UnityPrintNumberHex((UNITY_UINT)*pch, 2); |
| | } |
| | } |
| |
|
| | |
| | |
| | #ifdef UNITY_OUTPUT_COLOR |
| | static UNITY_UINT UnityPrintAnsiEscapeString(const char* string) |
| | { |
| | const char* pch = string; |
| | UNITY_UINT count = 0; |
| |
|
| | while (*pch && (*pch != 'm')) |
| | { |
| | UNITY_OUTPUT_CHAR(*pch); |
| | pch++; |
| | count++; |
| | } |
| | UNITY_OUTPUT_CHAR('m'); |
| | count++; |
| |
|
| | return count; |
| | } |
| | #endif |
| |
|
| | |
| | void UnityPrint(const char* string) |
| | { |
| | const char* pch = string; |
| |
|
| | if (pch != NULL) |
| | { |
| | while (*pch) |
| | { |
| | #ifdef UNITY_OUTPUT_COLOR |
| | |
| | if ((*pch == 27) && (*(pch + 1) == '[')) |
| | { |
| | pch += UnityPrintAnsiEscapeString(pch); |
| | continue; |
| | } |
| | #endif |
| | UnityPrintChar(pch); |
| | pch++; |
| | } |
| | } |
| | } |
| | |
| | void UnityPrintLen(const char* string, const UNITY_UINT32 length) |
| | { |
| | const char* pch = string; |
| |
|
| | if (pch != NULL) |
| | { |
| | while (*pch && ((UNITY_UINT32)(pch - string) < length)) |
| | { |
| | |
| | if ((*pch <= 126) && (*pch >= 32)) |
| | { |
| | UNITY_OUTPUT_CHAR(*pch); |
| | } |
| | |
| | else if (*pch == 13) |
| | { |
| | UNITY_OUTPUT_CHAR('\\'); |
| | UNITY_OUTPUT_CHAR('r'); |
| | } |
| | |
| | else if (*pch == 10) |
| | { |
| | UNITY_OUTPUT_CHAR('\\'); |
| | UNITY_OUTPUT_CHAR('n'); |
| | } |
| | |
| | else |
| | { |
| | UNITY_OUTPUT_CHAR('\\'); |
| | UNITY_OUTPUT_CHAR('x'); |
| | UnityPrintNumberHex((UNITY_UINT)*pch, 2); |
| | } |
| | pch++; |
| | } |
| | } |
| | } |
| |
|
| | |
| | void UnityPrintIntNumberByStyle(const UNITY_INT number, const UNITY_DISPLAY_STYLE_T style) |
| | { |
| | if ((style & UNITY_DISPLAY_RANGE_INT) == UNITY_DISPLAY_RANGE_INT) |
| | { |
| | if (style == UNITY_DISPLAY_STYLE_CHAR) |
| | { |
| | |
| | UNITY_OUTPUT_CHAR('\''); |
| | if ((number <= 126) && (number >= 32)) |
| | { |
| | UNITY_OUTPUT_CHAR((int)number); |
| | } |
| | |
| | else if (number == 13) |
| | { |
| | UNITY_OUTPUT_CHAR('\\'); |
| | UNITY_OUTPUT_CHAR('r'); |
| | } |
| | |
| | else if (number == 10) |
| | { |
| | UNITY_OUTPUT_CHAR('\\'); |
| | UNITY_OUTPUT_CHAR('n'); |
| | } |
| | |
| | else |
| | { |
| | UNITY_OUTPUT_CHAR('\\'); |
| | UNITY_OUTPUT_CHAR('x'); |
| | UnityPrintNumberHex((UNITY_UINT)number, 2); |
| | } |
| | UNITY_OUTPUT_CHAR('\''); |
| | } |
| | else |
| | { |
| | UnityPrintNumber(number); |
| | } |
| | } |
| | } |
| |
|
| | void UnityPrintUintNumberByStyle(const UNITY_UINT number, const UNITY_DISPLAY_STYLE_T style) |
| | { |
| | if ((style & UNITY_DISPLAY_RANGE_UINT) == UNITY_DISPLAY_RANGE_UINT) |
| | { |
| | UnityPrintNumberUnsigned(number); |
| | } |
| | else |
| | { |
| | UNITY_OUTPUT_CHAR('0'); |
| | UNITY_OUTPUT_CHAR('x'); |
| | UnityPrintNumberHex((UNITY_UINT)number, (char)((style & 0xF) * 2)); |
| | } |
| | } |
| |
|
| | |
| | void UnityPrintNumber(const UNITY_INT number_to_print) |
| | { |
| | UNITY_UINT number = (UNITY_UINT)number_to_print; |
| |
|
| | if (number_to_print < 0) |
| | { |
| | |
| | UNITY_OUTPUT_CHAR('-'); |
| | number = (~number) + 1; |
| | } |
| | UnityPrintNumberUnsigned(number); |
| | } |
| |
|
| | |
| | |
| | void UnityPrintNumberUnsigned(const UNITY_UINT number) |
| | { |
| | UNITY_UINT divisor = 1; |
| |
|
| | |
| | while (number / divisor > 9) |
| | { |
| | divisor *= 10; |
| | } |
| |
|
| | |
| | do |
| | { |
| | UNITY_OUTPUT_CHAR((char)('0' + (number / divisor % 10))); |
| | divisor /= 10; |
| | } while (divisor > 0); |
| | } |
| |
|
| | |
| | void UnityPrintNumberHex(const UNITY_UINT number, const char nibbles_to_print) |
| | { |
| | int nibble; |
| | char nibbles = nibbles_to_print; |
| |
|
| | if ((unsigned)nibbles > UNITY_MAX_NIBBLES) |
| | { |
| | nibbles = UNITY_MAX_NIBBLES; |
| | } |
| |
|
| | while (nibbles > 0) |
| | { |
| | nibbles--; |
| | nibble = (int)(number >> (nibbles * 4)) & 0x0F; |
| | if (nibble <= 9) |
| | { |
| | UNITY_OUTPUT_CHAR((char)('0' + nibble)); |
| | } |
| | else |
| | { |
| | UNITY_OUTPUT_CHAR((char)('A' - 10 + nibble)); |
| | } |
| | } |
| | } |
| |
|
| | |
| | void UnityPrintMask(const UNITY_UINT mask, const UNITY_UINT number) |
| | { |
| | UNITY_UINT current_bit = (UNITY_UINT)1 << (UNITY_INT_WIDTH - 1); |
| | UNITY_INT32 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; |
| | } |
| | } |
| |
|
| | |
| | #ifndef UNITY_EXCLUDE_FLOAT_PRINT |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | void UnityPrintFloat(const UNITY_DOUBLE input_number) |
| | { |
| | #ifdef UNITY_INCLUDE_DOUBLE |
| | static const int sig_digits = 9; |
| | static const UNITY_INT32 min_scaled = 100000000; |
| | static const UNITY_INT32 max_scaled = 1000000000; |
| | #else |
| | static const int sig_digits = 7; |
| | static const UNITY_INT32 min_scaled = 1000000; |
| | static const UNITY_INT32 max_scaled = 10000000; |
| | #endif |
| |
|
| | UNITY_DOUBLE number = input_number; |
| |
|
| | |
| | if (number < 0.0f) |
| | { |
| | UNITY_OUTPUT_CHAR('-'); |
| | number = -number; |
| | } |
| |
|
| | |
| | if (number == 0.0f) |
| | { |
| | UnityPrint("0"); |
| | } |
| | else if (UNITY_IS_NAN(number)) |
| | { |
| | UnityPrint("nan"); |
| | } |
| | else if (UNITY_IS_INF(number)) |
| | { |
| | UnityPrint("inf"); |
| | } |
| | else |
| | { |
| | UNITY_INT32 n_int = 0; |
| | UNITY_INT32 n; |
| | int exponent = 0; |
| | int decimals; |
| | int digits; |
| | char buf[16] = {0}; |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | if (number < 1.0f) |
| | { |
| | UNITY_DOUBLE factor = 1.0f; |
| |
|
| | while (number < (UNITY_DOUBLE)max_scaled / 1e10f) { number *= 1e10f; exponent -= 10; } |
| | while (number * factor < (UNITY_DOUBLE)min_scaled) { factor *= 10.0f; exponent--; } |
| |
|
| | number *= factor; |
| | } |
| | else if (number > (UNITY_DOUBLE)max_scaled) |
| | { |
| | UNITY_DOUBLE divisor = 1.0f; |
| |
|
| | while (number > (UNITY_DOUBLE)min_scaled * 1e10f) { number /= 1e10f; exponent += 10; } |
| | while (number / divisor > (UNITY_DOUBLE)max_scaled) { divisor *= 10.0f; exponent++; } |
| |
|
| | number /= divisor; |
| | } |
| | else |
| | { |
| | |
| | |
| | |
| | |
| | |
| | UNITY_DOUBLE factor = 1.0f; |
| | n_int = (UNITY_INT32)number; |
| | number -= (UNITY_DOUBLE)n_int; |
| |
|
| | while (n_int < min_scaled) { n_int *= 10; factor *= 10.0f; exponent--; } |
| |
|
| | number *= factor; |
| | } |
| |
|
| | |
| | n = ((UNITY_INT32)(number + number) + 1) / 2; |
| |
|
| | #ifndef UNITY_ROUND_TIES_AWAY_FROM_ZERO |
| | |
| | if ((n & 1) && (((UNITY_DOUBLE)n - number) == 0.5f)) |
| | n--; |
| | #endif |
| |
|
| | n += n_int; |
| |
|
| | if (n >= max_scaled) |
| | { |
| | n = min_scaled; |
| | exponent++; |
| | } |
| |
|
| | |
| | decimals = ((exponent <= 0) && (exponent >= -(sig_digits + 3))) ? (-exponent) : (sig_digits - 1); |
| | exponent += decimals; |
| |
|
| | |
| | while ((decimals > 0) && ((n % 10) == 0)) |
| | { |
| | n /= 10; |
| | decimals--; |
| | } |
| |
|
| | |
| | digits = 0; |
| | while ((n != 0) || (digits <= decimals)) |
| | { |
| | buf[digits++] = (char)('0' + n % 10); |
| | n /= 10; |
| | } |
| |
|
| | |
| | while (digits > 0) |
| | { |
| | if (digits == decimals) |
| | { |
| | UNITY_OUTPUT_CHAR('.'); |
| | } |
| | UNITY_OUTPUT_CHAR(buf[--digits]); |
| | } |
| |
|
| | |
| | if (exponent != 0) |
| | { |
| | UNITY_OUTPUT_CHAR('e'); |
| |
|
| | if (exponent < 0) |
| | { |
| | UNITY_OUTPUT_CHAR('-'); |
| | exponent = -exponent; |
| | } |
| | else |
| | { |
| | UNITY_OUTPUT_CHAR('+'); |
| | } |
| |
|
| | digits = 0; |
| | while ((exponent != 0) || (digits < 2)) |
| | { |
| | buf[digits++] = (char)('0' + exponent % 10); |
| | exponent /= 10; |
| | } |
| | while (digits > 0) |
| | { |
| | UNITY_OUTPUT_CHAR(buf[--digits]); |
| | } |
| | } |
| | } |
| | } |
| | #endif |
| |
|
| | |
| | static void UnityTestResultsBegin(const char* file, const UNITY_LINE_TYPE line) |
| | { |
| | #ifdef UNITY_OUTPUT_FOR_ECLIPSE |
| | UNITY_OUTPUT_CHAR('('); |
| | UnityPrint(file); |
| | UNITY_OUTPUT_CHAR(':'); |
| | UnityPrintNumber((UNITY_INT)line); |
| | UNITY_OUTPUT_CHAR(')'); |
| | UNITY_OUTPUT_CHAR(' '); |
| | UnityPrint(Unity.CurrentTestName); |
| | UNITY_OUTPUT_CHAR(':'); |
| | #else |
| | #ifdef UNITY_OUTPUT_FOR_IAR_WORKBENCH |
| | UnityPrint("<SRCREF line="); |
| | UnityPrintNumber((UNITY_INT)line); |
| | UnityPrint(" file=\""); |
| | UnityPrint(file); |
| | UNITY_OUTPUT_CHAR('"'); |
| | UNITY_OUTPUT_CHAR('>'); |
| | UnityPrint(Unity.CurrentTestName); |
| | UnityPrint("</SRCREF> "); |
| | #else |
| | #ifdef UNITY_OUTPUT_FOR_QT_CREATOR |
| | UnityPrint("file://"); |
| | UnityPrint(file); |
| | UNITY_OUTPUT_CHAR(':'); |
| | UnityPrintNumber((UNITY_INT)line); |
| | UNITY_OUTPUT_CHAR(' '); |
| | UnityPrint(Unity.CurrentTestName); |
| | UNITY_OUTPUT_CHAR(':'); |
| | #else |
| | UnityPrint(file); |
| | UNITY_OUTPUT_CHAR(':'); |
| | UnityPrintNumber((UNITY_INT)line); |
| | UNITY_OUTPUT_CHAR(':'); |
| | UnityPrint(Unity.CurrentTestName); |
| | UNITY_OUTPUT_CHAR(':'); |
| | #endif |
| | #endif |
| | #endif |
| | } |
| |
|
| | |
| | static void UnityTestResultsFailBegin(const UNITY_LINE_TYPE line) |
| | { |
| | UnityTestResultsBegin(Unity.TestFile, line); |
| | 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_EXEC_TIME(); |
| | UNITY_PRINT_EOL(); |
| | UNITY_FLUSH_CALL(); |
| | } |
| |
|
| | |
| | static void UnityAddMsgIfSpecified(const char* msg) |
| | { |
| | #ifdef UNITY_PRINT_TEST_CONTEXT |
| | UnityPrint(UnityStrSpacer); |
| | UNITY_PRINT_TEST_CONTEXT(); |
| | #endif |
| | #ifndef UNITY_EXCLUDE_DETAILS |
| | #ifdef UNITY_DETAIL_STACK_SIZE |
| | { |
| | UNITY_COUNTER_TYPE c; |
| | for (c = 0; (c < Unity.CurrentDetailStackSize) && (c < UNITY_DETAIL_STACK_SIZE); c++) { |
| | const char* label; |
| | if ((Unity.CurrentDetailStackLabels[c] == UNITY_DETAIL_NONE) || (Unity.CurrentDetailStackLabels[c] > UnityStrDetailLabelsCount)) { |
| | break; |
| | } |
| | label = UnityStrDetailLabels[Unity.CurrentDetailStackLabels[c]]; |
| | UnityPrint(UnityStrSpacer); |
| | if ((label[0] == '#') && (label[1] != 0)) { |
| | UnityPrint(label + 2); |
| | UNITY_OUTPUT_CHAR(' '); |
| | if ((label[1] & UNITY_DISPLAY_RANGE_INT) == UNITY_DISPLAY_RANGE_INT) { |
| | UnityPrintIntNumberByStyle((UNITY_INT)Unity.CurrentDetailStackValues[c], label[1]); |
| | } else { |
| | UnityPrintUintNumberByStyle((UNITY_UINT)Unity.CurrentDetailStackValues[c], label[1]); |
| | } |
| | } else if (Unity.CurrentDetailStackValues[c] != 0){ |
| | UnityPrint(label); |
| | UNITY_OUTPUT_CHAR(' '); |
| | UnityPrint((const char*)Unity.CurrentDetailStackValues[c]); |
| | } |
| | } |
| | } |
| | #else |
| | if (Unity.CurrentDetail1) |
| | { |
| | UnityPrint(UnityStrSpacer); |
| | UnityPrint(UnityStrDetail1Name); |
| | UnityPrint(Unity.CurrentDetail1); |
| | if (Unity.CurrentDetail2) |
| | { |
| | UnityPrint(UnityStrDetail2Name); |
| | UnityPrint(Unity.CurrentDetail2); |
| | } |
| | } |
| | #endif |
| | #endif |
| | if (msg) |
| | { |
| | UnityPrint(UnityStrSpacer); |
| | UnityPrint(msg); |
| | } |
| | } |
| |
|
| | |
| | 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 UNITY_UINT32 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); |
| | } |
| | } |
| |
|
| | |
| | |
| | |
| |
|
| | |
| | static int UnityIsOneArrayNull(UNITY_INTERNAL_PTR expected, |
| | UNITY_INTERNAL_PTR actual, |
| | const UNITY_LINE_TYPE lineNumber, |
| | const char* msg) |
| | { |
| | |
| | if (expected == actual) { return 0; } |
| |
|
| | |
| | if (expected == NULL) |
| | { |
| | UnityTestResultsFailBegin(lineNumber); |
| | UnityPrint(UnityStrNullPointerForExpected); |
| | UnityAddMsgIfSpecified(msg); |
| | return 1; |
| | } |
| |
|
| | |
| | if (actual == NULL) |
| | { |
| | UnityTestResultsFailBegin(lineNumber); |
| | UnityPrint(UnityStrNullPointerForActual); |
| | UnityAddMsgIfSpecified(msg); |
| | return 1; |
| | } |
| |
|
| | return 0; |
| | } |
| |
|
| | |
| | |
| | |
| |
|
| | |
| | void UnityAssertBits(const UNITY_INT mask, |
| | const UNITY_INT expected, |
| | const UNITY_INT actual, |
| | const char* msg, |
| | const UNITY_LINE_TYPE lineNumber) |
| | { |
| | RETURN_IF_FAIL_OR_IGNORE; |
| |
|
| | if ((mask & expected) != (mask & actual)) |
| | { |
| | UnityTestResultsFailBegin(lineNumber); |
| | UnityPrint(UnityStrExpected); |
| | UnityPrintMask((UNITY_UINT)mask, (UNITY_UINT)expected); |
| | UnityPrint(UnityStrWas); |
| | UnityPrintMask((UNITY_UINT)mask, (UNITY_UINT)actual); |
| | UnityAddMsgIfSpecified(msg); |
| | UNITY_FAIL_AND_BAIL; |
| | } |
| | } |
| |
|
| | |
| | void UnityAssertEqualIntNumber(const UNITY_INT expected, |
| | const UNITY_INT actual, |
| | const char* msg, |
| | const UNITY_LINE_TYPE lineNumber, |
| | const UNITY_DISPLAY_STYLE_T style) |
| | { |
| | RETURN_IF_FAIL_OR_IGNORE; |
| |
|
| | if (expected != actual) |
| | { |
| | UnityTestResultsFailBegin(lineNumber); |
| | UnityPrint(UnityStrExpected); |
| | UnityPrintIntNumberByStyle(expected, style); |
| | UnityPrint(UnityStrWas); |
| | UnityPrintIntNumberByStyle(actual, style); |
| | UnityAddMsgIfSpecified(msg); |
| | UNITY_FAIL_AND_BAIL; |
| | } |
| | } |
| |
|
| | void UnityAssertEqualUintNumber(const UNITY_UINT expected, |
| | const UNITY_UINT actual, |
| | const char* msg, |
| | const UNITY_LINE_TYPE lineNumber, |
| | const UNITY_DISPLAY_STYLE_T style) |
| | { |
| | RETURN_IF_FAIL_OR_IGNORE; |
| |
|
| | if (expected != actual) |
| | { |
| | UnityTestResultsFailBegin(lineNumber); |
| | UnityPrint(UnityStrExpected); |
| | UnityPrintUintNumberByStyle(expected, style); |
| | UnityPrint(UnityStrWas); |
| | UnityPrintUintNumberByStyle(actual, style); |
| | UnityAddMsgIfSpecified(msg); |
| | UNITY_FAIL_AND_BAIL; |
| | } |
| | } |
| | |
| | void UnityAssertIntGreaterOrLessOrEqualNumber(const UNITY_INT threshold, |
| | const UNITY_INT actual, |
| | const UNITY_COMPARISON_T compare, |
| | const char *msg, |
| | const UNITY_LINE_TYPE lineNumber, |
| | const UNITY_DISPLAY_STYLE_T style) |
| | { |
| | int failed = 0; |
| | RETURN_IF_FAIL_OR_IGNORE; |
| |
|
| | if ((threshold == actual) && !(compare & UNITY_EQUAL_TO)) { failed = 1; } |
| |
|
| | if ((actual > threshold) && (compare & UNITY_SMALLER_THAN)) { failed = 1; } |
| | if ((actual < threshold) && (compare & UNITY_GREATER_THAN)) { failed = 1; } |
| |
|
| | if (failed) |
| | { |
| | UnityTestResultsFailBegin(lineNumber); |
| | UnityPrint(UnityStrExpected); |
| | UnityPrintIntNumberByStyle(actual, style); |
| | if (compare & UNITY_GREATER_THAN) { UnityPrint(UnityStrGt); } |
| | if (compare & UNITY_SMALLER_THAN) { UnityPrint(UnityStrLt); } |
| | if (compare & UNITY_EQUAL_TO) { UnityPrint(UnityStrOrEqual); } |
| | if (compare == UNITY_NOT_EQUAL) { UnityPrint(UnityStrNotEqual); } |
| | UnityPrintIntNumberByStyle(threshold, style); |
| | UnityAddMsgIfSpecified(msg); |
| | UNITY_FAIL_AND_BAIL; |
| | } |
| | } |
| |
|
| | void UnityAssertUintGreaterOrLessOrEqualNumber(const UNITY_UINT threshold, |
| | const UNITY_UINT actual, |
| | const UNITY_COMPARISON_T compare, |
| | const char *msg, |
| | const UNITY_LINE_TYPE lineNumber, |
| | const UNITY_DISPLAY_STYLE_T style) |
| | { |
| | int failed = 0; |
| | RETURN_IF_FAIL_OR_IGNORE; |
| |
|
| | if ((threshold == actual) && !(compare & UNITY_EQUAL_TO)) { failed = 1; } |
| |
|
| | |
| | if ((actual > threshold) && (compare & UNITY_SMALLER_THAN)) { failed = 1; } |
| | if ((actual < threshold) && (compare & UNITY_GREATER_THAN)) { failed = 1; } |
| |
|
| | if (failed) |
| | { |
| | UnityTestResultsFailBegin(lineNumber); |
| | UnityPrint(UnityStrExpected); |
| | UnityPrintUintNumberByStyle(actual, style); |
| | if (compare & UNITY_GREATER_THAN) { UnityPrint(UnityStrGt); } |
| | if (compare & UNITY_SMALLER_THAN) { UnityPrint(UnityStrLt); } |
| | if (compare & UNITY_EQUAL_TO) { UnityPrint(UnityStrOrEqual); } |
| | if (compare == UNITY_NOT_EQUAL) { UnityPrint(UnityStrNotEqual); } |
| | UnityPrintUintNumberByStyle(threshold, style); |
| | UnityAddMsgIfSpecified(msg); |
| | UNITY_FAIL_AND_BAIL; |
| | } |
| | } |
| |
|
| | #define UnityPrintPointlessAndBail() \ |
| | do { \ |
| | UnityTestResultsFailBegin(lineNumber); \ |
| | UnityPrint(UnityStrPointless); \ |
| | UnityAddMsgIfSpecified(msg); \ |
| | UNITY_FAIL_AND_BAIL; \ |
| | } while (0) |
| |
|
| | |
| | void UnityAssertEqualIntArray(UNITY_INTERNAL_PTR expected, |
| | UNITY_INTERNAL_PTR actual, |
| | const UNITY_UINT32 num_elements, |
| | const char* msg, |
| | const UNITY_LINE_TYPE lineNumber, |
| | const UNITY_DISPLAY_STYLE_T style, |
| | const UNITY_FLAGS_T flags) |
| | { |
| | UNITY_UINT32 elements = num_elements; |
| | unsigned int length = style & 0xF; |
| | unsigned int increment = 0; |
| |
|
| | RETURN_IF_FAIL_OR_IGNORE; |
| |
|
| | if (num_elements == 0) |
| | { |
| | #ifdef UNITY_COMPARE_PTRS_ON_ZERO_ARRAY |
| | UNITY_TEST_ASSERT_EQUAL_PTR(expected, actual, lineNumber, msg); |
| | #else |
| | UnityPrintPointlessAndBail(); |
| | #endif |
| | } |
| |
|
| | if (expected == actual) |
| | { |
| | return; |
| | } |
| |
|
| | if (UnityIsOneArrayNull(expected, actual, lineNumber, msg)) |
| | { |
| | UNITY_FAIL_AND_BAIL; |
| | } |
| |
|
| | while ((elements > 0) && (elements--)) |
| | { |
| | UNITY_INT expect_val; |
| | UNITY_INT actual_val; |
| |
|
| | switch (length) |
| | { |
| | case 1: |
| | expect_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT8*)expected; |
| | actual_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT8*)actual; |
| | if (style & (UNITY_DISPLAY_RANGE_UINT | UNITY_DISPLAY_RANGE_HEX)) |
| | { |
| | expect_val &= 0x000000FF; |
| | actual_val &= 0x000000FF; |
| | } |
| | increment = sizeof(UNITY_INT8); |
| | break; |
| |
|
| | case 2: |
| | expect_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT16*)expected; |
| | actual_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT16*)actual; |
| | if (style & (UNITY_DISPLAY_RANGE_UINT | UNITY_DISPLAY_RANGE_HEX)) |
| | { |
| | expect_val &= 0x0000FFFF; |
| | actual_val &= 0x0000FFFF; |
| | } |
| | increment = sizeof(UNITY_INT16); |
| | break; |
| |
|
| | #ifdef UNITY_SUPPORT_64 |
| | case 8: |
| | expect_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT64*)expected; |
| | actual_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT64*)actual; |
| | increment = sizeof(UNITY_INT64); |
| | break; |
| | #endif |
| |
|
| | default: |
| | case 4: |
| | expect_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT32*)expected; |
| | actual_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT32*)actual; |
| | #ifdef UNITY_SUPPORT_64 |
| | if (style & (UNITY_DISPLAY_RANGE_UINT | UNITY_DISPLAY_RANGE_HEX)) |
| | { |
| | expect_val &= 0x00000000FFFFFFFF; |
| | actual_val &= 0x00000000FFFFFFFF; |
| | } |
| | #endif |
| | increment = sizeof(UNITY_INT32); |
| | length = 4; |
| | break; |
| | } |
| |
|
| | if (expect_val != actual_val) |
| | { |
| | if ((style & UNITY_DISPLAY_RANGE_UINT) && (length < (UNITY_INT_WIDTH / 8))) |
| | { |
| | UNITY_INT mask = 1; |
| | mask = (mask << 8 * length) - 1; |
| | expect_val &= mask; |
| | actual_val &= mask; |
| | } |
| | UnityTestResultsFailBegin(lineNumber); |
| | UnityPrint(UnityStrElement); |
| | UnityPrintNumberUnsigned(num_elements - elements - 1); |
| | UnityPrint(UnityStrExpected); |
| | UnityPrintIntNumberByStyle(expect_val, style); |
| | UnityPrint(UnityStrWas); |
| | UnityPrintIntNumberByStyle(actual_val, style); |
| | UnityAddMsgIfSpecified(msg); |
| | UNITY_FAIL_AND_BAIL; |
| | } |
| | |
| | if (flags == UNITY_ARRAY_TO_ARRAY) |
| | { |
| | expected = (UNITY_INTERNAL_PTR)((const char*)expected + increment); |
| | } |
| | actual = (UNITY_INTERNAL_PTR)((const char*)actual + increment); |
| | } |
| | } |
| |
|
| | |
| | #ifndef UNITY_EXCLUDE_FLOAT |
| | |
| | #define UNITY_FLOAT_OR_DOUBLE_WITHIN(delta, expected, actual, diff) \ |
| | if (UNITY_IS_INF(expected) && UNITY_IS_INF(actual) && (((expected) < 0) == ((actual) < 0))) return 1; \ |
| | if (UNITY_NAN_CHECK) return 1; \ |
| | (diff) = (actual) - (expected); \ |
| | if ((diff) < 0) (diff) = -(diff); \ |
| | if ((delta) < 0) (delta) = -(delta); \ |
| | return !(UNITY_IS_NAN(diff) || UNITY_IS_INF(diff) || ((diff) > (delta))) |
| | |
| | #ifndef UNITY_NAN_NOT_EQUAL_NAN |
| | #define UNITY_NAN_CHECK UNITY_IS_NAN(expected) && UNITY_IS_NAN(actual) |
| | #else |
| | #define UNITY_NAN_CHECK 0 |
| | #endif |
| |
|
| | #ifndef UNITY_EXCLUDE_FLOAT_PRINT |
| | #define UNITY_PRINT_EXPECTED_AND_ACTUAL_FLOAT(expected, actual) \ |
| | do { \ |
| | UnityPrint(UnityStrExpected); \ |
| | UnityPrintFloat(expected); \ |
| | UnityPrint(UnityStrWas); \ |
| | UnityPrintFloat(actual); \ |
| | } while (0) |
| | #else |
| | #define UNITY_PRINT_EXPECTED_AND_ACTUAL_FLOAT(expected, actual) \ |
| | UnityPrint(UnityStrDelta) |
| | #endif |
| |
|
| | |
| | static int UnityFloatsWithin(UNITY_FLOAT delta, UNITY_FLOAT expected, UNITY_FLOAT actual) |
| | { |
| | UNITY_FLOAT diff; |
| | UNITY_FLOAT_OR_DOUBLE_WITHIN(delta, expected, actual, diff); |
| | } |
| |
|
| | |
| | void UnityAssertWithinFloatArray(const UNITY_FLOAT delta, |
| | UNITY_PTR_ATTRIBUTE const UNITY_FLOAT* expected, |
| | UNITY_PTR_ATTRIBUTE const UNITY_FLOAT* actual, |
| | const UNITY_UINT32 num_elements, |
| | const char* msg, |
| | const UNITY_LINE_TYPE lineNumber, |
| | const UNITY_FLAGS_T flags) |
| | { |
| | UNITY_UINT32 elements = num_elements; |
| | UNITY_PTR_ATTRIBUTE const UNITY_FLOAT* ptr_expected = expected; |
| | UNITY_PTR_ATTRIBUTE const UNITY_FLOAT* ptr_actual = actual; |
| | UNITY_FLOAT in_delta = delta; |
| | UNITY_FLOAT current_element_delta = delta; |
| |
|
| | RETURN_IF_FAIL_OR_IGNORE; |
| |
|
| | if (elements == 0) |
| | { |
| | #ifdef UNITY_COMPARE_PTRS_ON_ZERO_ARRAY |
| | UNITY_TEST_ASSERT_EQUAL_PTR(expected, actual, lineNumber, msg); |
| | #else |
| | UnityPrintPointlessAndBail(); |
| | #endif |
| | } |
| |
|
| | if (UNITY_IS_INF(in_delta)) |
| | { |
| | return; |
| | } |
| |
|
| | if (UNITY_IS_NAN(in_delta)) |
| | { |
| | |
| | UnityPrintPointlessAndBail(); |
| | } |
| |
|
| | if (expected == actual) |
| | { |
| | return; |
| | } |
| |
|
| | if (UnityIsOneArrayNull((UNITY_INTERNAL_PTR)expected, (UNITY_INTERNAL_PTR)actual, lineNumber, msg)) |
| | { |
| | UNITY_FAIL_AND_BAIL; |
| | } |
| |
|
| | |
| | if (in_delta < 0) |
| | { |
| | in_delta = -in_delta; |
| | } |
| |
|
| | while (elements--) |
| | { |
| | current_element_delta = *ptr_expected * UNITY_FLOAT_PRECISION; |
| |
|
| | if (current_element_delta < 0) |
| | { |
| | |
| | current_element_delta = -current_element_delta; |
| | } |
| |
|
| | if (!UnityFloatsWithin(in_delta + current_element_delta, *ptr_expected, *ptr_actual)) |
| | { |
| | UnityTestResultsFailBegin(lineNumber); |
| | UnityPrint(UnityStrElement); |
| | UnityPrintNumberUnsigned(num_elements - elements - 1); |
| | UNITY_PRINT_EXPECTED_AND_ACTUAL_FLOAT((UNITY_DOUBLE)*ptr_expected, (UNITY_DOUBLE)*ptr_actual); |
| | UnityAddMsgIfSpecified(msg); |
| | UNITY_FAIL_AND_BAIL; |
| | } |
| | if (flags == UNITY_ARRAY_TO_ARRAY) |
| | { |
| | ptr_expected++; |
| | } |
| | ptr_actual++; |
| | } |
| | } |
| |
|
| | |
| | void UnityAssertFloatsWithin(const UNITY_FLOAT delta, |
| | const UNITY_FLOAT expected, |
| | const UNITY_FLOAT actual, |
| | const char* msg, |
| | const UNITY_LINE_TYPE lineNumber) |
| | { |
| | RETURN_IF_FAIL_OR_IGNORE; |
| |
|
| |
|
| | if (!UnityFloatsWithin(delta, expected, actual)) |
| | { |
| | UnityTestResultsFailBegin(lineNumber); |
| | UNITY_PRINT_EXPECTED_AND_ACTUAL_FLOAT((UNITY_DOUBLE)expected, (UNITY_DOUBLE)actual); |
| | UnityAddMsgIfSpecified(msg); |
| | UNITY_FAIL_AND_BAIL; |
| | } |
| | } |
| |
|
| | |
| | void UnityAssertFloatsNotWithin(const UNITY_FLOAT delta, |
| | const UNITY_FLOAT expected, |
| | const UNITY_FLOAT actual, |
| | const char* msg, |
| | const UNITY_LINE_TYPE lineNumber) |
| | { |
| | RETURN_IF_FAIL_OR_IGNORE; |
| |
|
| | if (UnityFloatsWithin(delta, expected, actual)) |
| | { |
| | UnityTestResultsFailBegin(lineNumber); |
| | UnityPrint(UnityStrExpected); |
| | UnityPrintFloat((UNITY_DOUBLE)expected); |
| | UnityPrint(UnityStrNotEqual); |
| | UnityPrintFloat((UNITY_DOUBLE)actual); |
| | UnityAddMsgIfSpecified(msg); |
| | UNITY_FAIL_AND_BAIL; |
| | } |
| | } |
| |
|
| | |
| | void UnityAssertGreaterOrLessFloat(const UNITY_FLOAT threshold, |
| | const UNITY_FLOAT actual, |
| | const UNITY_COMPARISON_T compare, |
| | const char* msg, |
| | const UNITY_LINE_TYPE lineNumber) |
| | { |
| | int failed; |
| |
|
| | RETURN_IF_FAIL_OR_IGNORE; |
| |
|
| | failed = 0; |
| |
|
| | |
| | if (!(actual < threshold) && (compare & UNITY_SMALLER_THAN)) { failed = 1; } |
| | if (!(actual > threshold) && (compare & UNITY_GREATER_THAN)) { failed = 1; } |
| |
|
| | if ((compare & UNITY_EQUAL_TO) && UnityFloatsWithin(threshold * UNITY_FLOAT_PRECISION, threshold, actual)) { failed = 0; } |
| |
|
| | if (failed) |
| | { |
| | UnityTestResultsFailBegin(lineNumber); |
| | UnityPrint(UnityStrExpected); |
| | UnityPrintFloat(actual); |
| | if (compare & UNITY_GREATER_THAN) { UnityPrint(UnityStrGt); } |
| | if (compare & UNITY_SMALLER_THAN) { UnityPrint(UnityStrLt); } |
| | if (compare & UNITY_EQUAL_TO) { UnityPrint(UnityStrOrEqual); } |
| | UnityPrintFloat(threshold); |
| | UnityAddMsgIfSpecified(msg); |
| | UNITY_FAIL_AND_BAIL; |
| | } |
| | } |
| |
|
| | |
| | void UnityAssertFloatSpecial(const UNITY_FLOAT actual, |
| | const char* msg, |
| | const UNITY_LINE_TYPE lineNumber, |
| | const UNITY_FLOAT_TRAIT_T style) |
| | { |
| | const char* trait_names[] = {UnityStrInf, UnityStrNegInf, UnityStrNaN, UnityStrDet}; |
| | UNITY_INT should_be_trait = ((UNITY_INT)style & 1); |
| | UNITY_INT is_trait = !should_be_trait; |
| | UNITY_INT trait_index = (UNITY_INT)(style >> 1); |
| |
|
| | RETURN_IF_FAIL_OR_IGNORE; |
| |
|
| | switch (style) |
| | { |
| | case UNITY_FLOAT_IS_INF: |
| | case UNITY_FLOAT_IS_NOT_INF: |
| | is_trait = UNITY_IS_INF(actual) && (actual > 0); |
| | break; |
| | case UNITY_FLOAT_IS_NEG_INF: |
| | case UNITY_FLOAT_IS_NOT_NEG_INF: |
| | is_trait = UNITY_IS_INF(actual) && (actual < 0); |
| | break; |
| |
|
| | case UNITY_FLOAT_IS_NAN: |
| | case UNITY_FLOAT_IS_NOT_NAN: |
| | is_trait = UNITY_IS_NAN(actual) ? 1 : 0; |
| | break; |
| |
|
| | case UNITY_FLOAT_IS_DET: |
| | case UNITY_FLOAT_IS_NOT_DET: |
| | is_trait = !UNITY_IS_INF(actual) && !UNITY_IS_NAN(actual); |
| | break; |
| |
|
| | case UNITY_FLOAT_INVALID_TRAIT: |
| | default: |
| | trait_index = 0; |
| | trait_names[0] = UnityStrInvalidFloatTrait; |
| | break; |
| | } |
| |
|
| | if (is_trait != should_be_trait) |
| | { |
| | UnityTestResultsFailBegin(lineNumber); |
| | UnityPrint(UnityStrExpected); |
| | if (!should_be_trait) |
| | { |
| | UnityPrint(UnityStrNot); |
| | } |
| | UnityPrint(trait_names[trait_index]); |
| | UnityPrint(UnityStrWas); |
| | #ifndef UNITY_EXCLUDE_FLOAT_PRINT |
| | UnityPrintFloat((UNITY_DOUBLE)actual); |
| | #else |
| | if (should_be_trait) |
| | { |
| | UnityPrint(UnityStrNot); |
| | } |
| | UnityPrint(trait_names[trait_index]); |
| | #endif |
| | UnityAddMsgIfSpecified(msg); |
| | UNITY_FAIL_AND_BAIL; |
| | } |
| | } |
| |
|
| | #endif |
| |
|
| | |
| | #ifndef UNITY_EXCLUDE_DOUBLE |
| | static int UnityDoublesWithin(UNITY_DOUBLE delta, UNITY_DOUBLE expected, UNITY_DOUBLE actual) |
| | { |
| | UNITY_DOUBLE diff; |
| | UNITY_FLOAT_OR_DOUBLE_WITHIN(delta, expected, actual, diff); |
| | } |
| |
|
| | |
| | void UnityAssertWithinDoubleArray(const UNITY_DOUBLE delta, |
| | UNITY_PTR_ATTRIBUTE const UNITY_DOUBLE* expected, |
| | UNITY_PTR_ATTRIBUTE const UNITY_DOUBLE* actual, |
| | const UNITY_UINT32 num_elements, |
| | const char* msg, |
| | const UNITY_LINE_TYPE lineNumber, |
| | const UNITY_FLAGS_T flags) |
| | { |
| | UNITY_UINT32 elements = num_elements; |
| | UNITY_PTR_ATTRIBUTE const UNITY_DOUBLE* ptr_expected = expected; |
| | UNITY_PTR_ATTRIBUTE const UNITY_DOUBLE* ptr_actual = actual; |
| | UNITY_DOUBLE in_delta = delta; |
| | UNITY_DOUBLE current_element_delta = delta; |
| |
|
| | RETURN_IF_FAIL_OR_IGNORE; |
| |
|
| | if (elements == 0) |
| | { |
| | #ifdef UNITY_COMPARE_PTRS_ON_ZERO_ARRAY |
| | UNITY_TEST_ASSERT_EQUAL_PTR(expected, actual, lineNumber, msg); |
| | #else |
| | UnityPrintPointlessAndBail(); |
| | #endif |
| | } |
| |
|
| | if (UNITY_IS_INF(in_delta)) |
| | { |
| | return; |
| | } |
| |
|
| | if (UNITY_IS_NAN(in_delta)) |
| | { |
| | |
| | UnityPrintPointlessAndBail(); |
| | } |
| |
|
| | if (expected == actual) |
| | { |
| | return; |
| | } |
| |
|
| | if (UnityIsOneArrayNull((UNITY_INTERNAL_PTR)expected, (UNITY_INTERNAL_PTR)actual, lineNumber, msg)) |
| | { |
| | UNITY_FAIL_AND_BAIL; |
| | } |
| |
|
| | |
| | if (in_delta < 0) |
| | { |
| | in_delta = -in_delta; |
| | } |
| |
|
| | while (elements--) |
| | { |
| | current_element_delta = *ptr_expected * UNITY_DOUBLE_PRECISION; |
| |
|
| | if (current_element_delta < 0) |
| | { |
| | |
| | current_element_delta = -current_element_delta; |
| | } |
| |
|
| | if (!UnityDoublesWithin(in_delta + current_element_delta, *ptr_expected, *ptr_actual)) |
| | { |
| | UnityTestResultsFailBegin(lineNumber); |
| | UnityPrint(UnityStrElement); |
| | UnityPrintNumberUnsigned(num_elements - elements - 1); |
| | UNITY_PRINT_EXPECTED_AND_ACTUAL_FLOAT(*ptr_expected, *ptr_actual); |
| | UnityAddMsgIfSpecified(msg); |
| | UNITY_FAIL_AND_BAIL; |
| | } |
| | if (flags == UNITY_ARRAY_TO_ARRAY) |
| | { |
| | ptr_expected++; |
| | } |
| | ptr_actual++; |
| | } |
| | } |
| |
|
| | |
| | void UnityAssertDoublesWithin(const UNITY_DOUBLE delta, |
| | const UNITY_DOUBLE expected, |
| | const UNITY_DOUBLE actual, |
| | const char* msg, |
| | const UNITY_LINE_TYPE lineNumber) |
| | { |
| | RETURN_IF_FAIL_OR_IGNORE; |
| |
|
| | if (!UnityDoublesWithin(delta, expected, actual)) |
| | { |
| | UnityTestResultsFailBegin(lineNumber); |
| | UNITY_PRINT_EXPECTED_AND_ACTUAL_FLOAT(expected, actual); |
| | UnityAddMsgIfSpecified(msg); |
| | UNITY_FAIL_AND_BAIL; |
| | } |
| | } |
| |
|
| | |
| | void UnityAssertDoublesNotWithin(const UNITY_DOUBLE delta, |
| | const UNITY_DOUBLE expected, |
| | const UNITY_DOUBLE actual, |
| | const char* msg, |
| | const UNITY_LINE_TYPE lineNumber) |
| | { |
| | RETURN_IF_FAIL_OR_IGNORE; |
| |
|
| | if (UnityDoublesWithin(delta, expected, actual)) |
| | { |
| | UnityTestResultsFailBegin(lineNumber); |
| | UnityPrint(UnityStrExpected); |
| | UnityPrintFloat((UNITY_DOUBLE)expected); |
| | UnityPrint(UnityStrNotEqual); |
| | UnityPrintFloat((UNITY_DOUBLE)actual); |
| | UnityAddMsgIfSpecified(msg); |
| | UNITY_FAIL_AND_BAIL; |
| | } |
| | } |
| |
|
| | |
| | void UnityAssertGreaterOrLessDouble(const UNITY_DOUBLE threshold, |
| | const UNITY_DOUBLE actual, |
| | const UNITY_COMPARISON_T compare, |
| | const char* msg, |
| | const UNITY_LINE_TYPE lineNumber) |
| | { |
| | int failed; |
| |
|
| | RETURN_IF_FAIL_OR_IGNORE; |
| |
|
| | failed = 0; |
| |
|
| | |
| | if (!(actual < threshold) && (compare & UNITY_SMALLER_THAN)) { failed = 1; } |
| | if (!(actual > threshold) && (compare & UNITY_GREATER_THAN)) { failed = 1; } |
| |
|
| | if ((compare & UNITY_EQUAL_TO) && UnityDoublesWithin(threshold * UNITY_DOUBLE_PRECISION, threshold, actual)) { failed = 0; } |
| |
|
| | if (failed) |
| | { |
| | UnityTestResultsFailBegin(lineNumber); |
| | UnityPrint(UnityStrExpected); |
| | UnityPrintFloat(actual); |
| | if (compare & UNITY_GREATER_THAN) { UnityPrint(UnityStrGt); } |
| | if (compare & UNITY_SMALLER_THAN) { UnityPrint(UnityStrLt); } |
| | if (compare & UNITY_EQUAL_TO) { UnityPrint(UnityStrOrEqual); } |
| | UnityPrintFloat(threshold); |
| | UnityAddMsgIfSpecified(msg); |
| | UNITY_FAIL_AND_BAIL; |
| | } |
| | } |
| |
|
| | |
| | void UnityAssertDoubleSpecial(const UNITY_DOUBLE actual, |
| | const char* msg, |
| | const UNITY_LINE_TYPE lineNumber, |
| | const UNITY_FLOAT_TRAIT_T style) |
| | { |
| | const char* trait_names[] = {UnityStrInf, UnityStrNegInf, UnityStrNaN, UnityStrDet}; |
| | UNITY_INT should_be_trait = ((UNITY_INT)style & 1); |
| | UNITY_INT is_trait = !should_be_trait; |
| | UNITY_INT trait_index = (UNITY_INT)(style >> 1); |
| |
|
| | RETURN_IF_FAIL_OR_IGNORE; |
| |
|
| | switch (style) |
| | { |
| | case UNITY_FLOAT_IS_INF: |
| | case UNITY_FLOAT_IS_NOT_INF: |
| | is_trait = UNITY_IS_INF(actual) && (actual > 0); |
| | break; |
| | case UNITY_FLOAT_IS_NEG_INF: |
| | case UNITY_FLOAT_IS_NOT_NEG_INF: |
| | is_trait = UNITY_IS_INF(actual) && (actual < 0); |
| | break; |
| |
|
| | case UNITY_FLOAT_IS_NAN: |
| | case UNITY_FLOAT_IS_NOT_NAN: |
| | is_trait = UNITY_IS_NAN(actual) ? 1 : 0; |
| | break; |
| |
|
| | case UNITY_FLOAT_IS_DET: |
| | case UNITY_FLOAT_IS_NOT_DET: |
| | is_trait = !UNITY_IS_INF(actual) && !UNITY_IS_NAN(actual); |
| | break; |
| |
|
| | case UNITY_FLOAT_INVALID_TRAIT: |
| | default: |
| | trait_index = 0; |
| | trait_names[0] = UnityStrInvalidFloatTrait; |
| | break; |
| | } |
| |
|
| | if (is_trait != should_be_trait) |
| | { |
| | UnityTestResultsFailBegin(lineNumber); |
| | UnityPrint(UnityStrExpected); |
| | if (!should_be_trait) |
| | { |
| | UnityPrint(UnityStrNot); |
| | } |
| | UnityPrint(trait_names[trait_index]); |
| | UnityPrint(UnityStrWas); |
| | #ifndef UNITY_EXCLUDE_FLOAT_PRINT |
| | UnityPrintFloat(actual); |
| | #else |
| | if (should_be_trait) |
| | { |
| | UnityPrint(UnityStrNot); |
| | } |
| | UnityPrint(trait_names[trait_index]); |
| | #endif |
| | UnityAddMsgIfSpecified(msg); |
| | UNITY_FAIL_AND_BAIL; |
| | } |
| | } |
| |
|
| | #endif |
| |
|
| | |
| | void UnityAssertIntNumbersWithin(const UNITY_UINT delta, |
| | const UNITY_INT expected, |
| | const UNITY_INT actual, |
| | const char* msg, |
| | const UNITY_LINE_TYPE lineNumber, |
| | const UNITY_DISPLAY_STYLE_T style) |
| | { |
| | RETURN_IF_FAIL_OR_IGNORE; |
| |
|
| | if (actual > expected) |
| | { |
| | Unity.CurrentTestFailed = (((UNITY_UINT)actual - (UNITY_UINT)expected) > delta); |
| | } |
| | else |
| | { |
| | Unity.CurrentTestFailed = (((UNITY_UINT)expected - (UNITY_UINT)actual) > delta); |
| | } |
| |
|
| | if (Unity.CurrentTestFailed) |
| | { |
| | UnityTestResultsFailBegin(lineNumber); |
| | UnityPrint(UnityStrDelta); |
| | UnityPrintIntNumberByStyle((UNITY_INT)delta, style); |
| | UnityPrint(UnityStrExpected); |
| | UnityPrintIntNumberByStyle(expected, style); |
| | UnityPrint(UnityStrWas); |
| | UnityPrintIntNumberByStyle(actual, style); |
| | UnityAddMsgIfSpecified(msg); |
| | UNITY_FAIL_AND_BAIL; |
| | } |
| | } |
| |
|
| | void UnityAssertUintNumbersWithin(const UNITY_UINT delta, |
| | const UNITY_UINT expected, |
| | const UNITY_UINT actual, |
| | const char* msg, |
| | const UNITY_LINE_TYPE lineNumber, |
| | const UNITY_DISPLAY_STYLE_T style) |
| | { |
| | RETURN_IF_FAIL_OR_IGNORE; |
| |
|
| | if (actual > expected) |
| | { |
| | Unity.CurrentTestFailed = ((actual - expected) > delta); |
| | } |
| | else |
| | { |
| | Unity.CurrentTestFailed = ((expected - actual) > delta); |
| | } |
| |
|
| | if (Unity.CurrentTestFailed) |
| | { |
| | UnityTestResultsFailBegin(lineNumber); |
| | UnityPrint(UnityStrDelta); |
| | UnityPrintUintNumberByStyle(delta, style); |
| | UnityPrint(UnityStrExpected); |
| | UnityPrintUintNumberByStyle(expected, style); |
| | UnityPrint(UnityStrWas); |
| | UnityPrintUintNumberByStyle(actual, style); |
| | UnityAddMsgIfSpecified(msg); |
| | UNITY_FAIL_AND_BAIL; |
| | } |
| | } |
| |
|
| | |
| | void UnityAssertNumbersArrayWithin(const UNITY_UINT delta, |
| | UNITY_INTERNAL_PTR expected, |
| | UNITY_INTERNAL_PTR actual, |
| | const UNITY_UINT32 num_elements, |
| | const char* msg, |
| | const UNITY_LINE_TYPE lineNumber, |
| | const UNITY_DISPLAY_STYLE_T style, |
| | const UNITY_FLAGS_T flags) |
| | { |
| | UNITY_UINT32 elements = num_elements; |
| | unsigned int length = style & 0xF; |
| | unsigned int increment = 0; |
| |
|
| | RETURN_IF_FAIL_OR_IGNORE; |
| |
|
| | if (num_elements == 0) |
| | { |
| | #ifdef UNITY_COMPARE_PTRS_ON_ZERO_ARRAY |
| | UNITY_TEST_ASSERT_EQUAL_PTR(expected, actual, lineNumber, msg); |
| | #else |
| | UnityPrintPointlessAndBail(); |
| | #endif |
| | } |
| |
|
| | if (expected == actual) |
| | { |
| | return; |
| | } |
| |
|
| | if (UnityIsOneArrayNull(expected, actual, lineNumber, msg)) |
| | { |
| | UNITY_FAIL_AND_BAIL; |
| | } |
| |
|
| | while ((elements > 0) && (elements--)) |
| | { |
| | UNITY_INT expect_val; |
| | UNITY_INT actual_val; |
| |
|
| | switch (length) |
| | { |
| | case 1: |
| | |
| | if ((style & UNITY_DISPLAY_RANGE_INT) == UNITY_DISPLAY_RANGE_INT) |
| | { |
| | expect_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT8*)expected; |
| | actual_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT8*)actual; |
| | increment = sizeof(UNITY_INT8); |
| | } |
| | else |
| | { |
| | expect_val = (UNITY_INT)*(UNITY_PTR_ATTRIBUTE const UNITY_UINT8*)expected; |
| | actual_val = (UNITY_INT)*(UNITY_PTR_ATTRIBUTE const UNITY_UINT8*)actual; |
| | increment = sizeof(UNITY_UINT8); |
| | } |
| | break; |
| |
|
| | case 2: |
| | |
| | if ((style & UNITY_DISPLAY_RANGE_INT) == UNITY_DISPLAY_RANGE_INT) |
| | { |
| | expect_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT16*)expected; |
| | actual_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT16*)actual; |
| | increment = sizeof(UNITY_INT16); |
| | } |
| | else |
| | { |
| | expect_val = (UNITY_INT)*(UNITY_PTR_ATTRIBUTE const UNITY_UINT16*)expected; |
| | actual_val = (UNITY_INT)*(UNITY_PTR_ATTRIBUTE const UNITY_UINT16*)actual; |
| | increment = sizeof(UNITY_UINT16); |
| | } |
| | break; |
| |
|
| | #ifdef UNITY_SUPPORT_64 |
| | case 8: |
| | |
| | if ((style & UNITY_DISPLAY_RANGE_INT) == UNITY_DISPLAY_RANGE_INT) |
| | { |
| | expect_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT64*)expected; |
| | actual_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT64*)actual; |
| | increment = sizeof(UNITY_INT64); |
| | } |
| | else |
| | { |
| | expect_val = (UNITY_INT)*(UNITY_PTR_ATTRIBUTE const UNITY_UINT64*)expected; |
| | actual_val = (UNITY_INT)*(UNITY_PTR_ATTRIBUTE const UNITY_UINT64*)actual; |
| | increment = sizeof(UNITY_UINT64); |
| | } |
| | break; |
| | #endif |
| |
|
| | default: |
| | case 4: |
| | |
| | if ((style & UNITY_DISPLAY_RANGE_INT) == UNITY_DISPLAY_RANGE_INT) |
| | { |
| | expect_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT32*)expected; |
| | actual_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT32*)actual; |
| | increment = sizeof(UNITY_INT32); |
| | } |
| | else |
| | { |
| | expect_val = (UNITY_INT)*(UNITY_PTR_ATTRIBUTE const UNITY_UINT32*)expected; |
| | actual_val = (UNITY_INT)*(UNITY_PTR_ATTRIBUTE const UNITY_UINT32*)actual; |
| | increment = sizeof(UNITY_UINT32); |
| | } |
| | length = 4; |
| | break; |
| | } |
| |
|
| | if ((style & UNITY_DISPLAY_RANGE_INT) == UNITY_DISPLAY_RANGE_INT) |
| | { |
| | if (actual_val > expect_val) |
| | { |
| | Unity.CurrentTestFailed = (((UNITY_UINT)actual_val - (UNITY_UINT)expect_val) > delta); |
| | } |
| | else |
| | { |
| | Unity.CurrentTestFailed = (((UNITY_UINT)expect_val - (UNITY_UINT)actual_val) > delta); |
| | } |
| | } |
| | else |
| | { |
| | if ((UNITY_UINT)actual_val > (UNITY_UINT)expect_val) |
| | { |
| | Unity.CurrentTestFailed = (((UNITY_UINT)actual_val - (UNITY_UINT)expect_val) > delta); |
| | } |
| | else |
| | { |
| | Unity.CurrentTestFailed = (((UNITY_UINT)expect_val - (UNITY_UINT)actual_val) > delta); |
| | } |
| | } |
| |
|
| | if (Unity.CurrentTestFailed) |
| | { |
| | if ((style & UNITY_DISPLAY_RANGE_UINT) && (length < (UNITY_INT_WIDTH / 8))) |
| | { |
| | UNITY_INT mask = 1; |
| | mask = (mask << 8 * length) - 1; |
| | expect_val &= mask; |
| | actual_val &= mask; |
| | } |
| | UnityTestResultsFailBegin(lineNumber); |
| | UnityPrint(UnityStrDelta); |
| | UnityPrintIntNumberByStyle((UNITY_INT)delta, style); |
| | UnityPrint(UnityStrElement); |
| | UnityPrintNumberUnsigned(num_elements - elements - 1); |
| | UnityPrint(UnityStrExpected); |
| | UnityPrintIntNumberByStyle(expect_val, style); |
| | UnityPrint(UnityStrWas); |
| | UnityPrintIntNumberByStyle(actual_val, style); |
| | UnityAddMsgIfSpecified(msg); |
| | UNITY_FAIL_AND_BAIL; |
| | } |
| | |
| | if (flags == UNITY_ARRAY_TO_ARRAY) |
| | { |
| | expected = (UNITY_INTERNAL_PTR)((const char*)expected + increment); |
| | } |
| | actual = (UNITY_INTERNAL_PTR)((const char*)actual + increment); |
| | } |
| | } |
| |
|
| | |
| | void UnityAssertEqualString(const char* expected, |
| | const char* actual, |
| | const char* msg, |
| | const UNITY_LINE_TYPE lineNumber) |
| | { |
| | UNITY_UINT32 i; |
| |
|
| | RETURN_IF_FAIL_OR_IGNORE; |
| |
|
| | |
| | if (expected && actual) |
| | { |
| | for (i = 0; expected[i] || actual[i]; i++) |
| | { |
| | if (expected[i] != actual[i]) |
| | { |
| | Unity.CurrentTestFailed = 1; |
| | break; |
| | } |
| | } |
| | } |
| | else |
| | { |
| | 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 UNITY_UINT32 length, |
| | const char* msg, |
| | const UNITY_LINE_TYPE lineNumber) |
| | { |
| | UNITY_UINT32 i; |
| |
|
| | RETURN_IF_FAIL_OR_IGNORE; |
| |
|
| | |
| | if (expected && actual) |
| | { |
| | for (i = 0; (i < length) && (expected[i] || actual[i]); i++) |
| | { |
| | if (expected[i] != actual[i]) |
| | { |
| | Unity.CurrentTestFailed = 1; |
| | break; |
| | } |
| | } |
| | } |
| | else |
| | { |
| | if (expected || actual) |
| | { |
| | Unity.CurrentTestFailed = 1; |
| | } |
| | } |
| |
|
| | if (Unity.CurrentTestFailed) |
| | { |
| | UnityTestResultsFailBegin(lineNumber); |
| | UnityPrintExpectedAndActualStringsLen(expected, actual, length); |
| | UnityAddMsgIfSpecified(msg); |
| | UNITY_FAIL_AND_BAIL; |
| | } |
| | } |
| |
|
| | |
| | void UnityAssertEqualStringArray(UNITY_INTERNAL_PTR expected, |
| | const char** actual, |
| | const UNITY_UINT32 num_elements, |
| | const char* msg, |
| | const UNITY_LINE_TYPE lineNumber, |
| | const UNITY_FLAGS_T flags) |
| | { |
| | UNITY_UINT32 i = 0; |
| | UNITY_UINT32 j = 0; |
| | const char* expd = NULL; |
| | const char* act = NULL; |
| |
|
| | RETURN_IF_FAIL_OR_IGNORE; |
| |
|
| | |
| | if (num_elements == 0) |
| | { |
| | #ifdef UNITY_COMPARE_PTRS_ON_ZERO_ARRAY |
| | UNITY_TEST_ASSERT_EQUAL_PTR(expected, actual, lineNumber, msg); |
| | #else |
| | UnityPrintPointlessAndBail(); |
| | #endif |
| | } |
| |
|
| | if ((const void*)expected == (const void*)actual) |
| | { |
| | return; |
| | } |
| |
|
| | if (UnityIsOneArrayNull((UNITY_INTERNAL_PTR)expected, (UNITY_INTERNAL_PTR)actual, lineNumber, msg)) |
| | { |
| | UNITY_FAIL_AND_BAIL; |
| | } |
| |
|
| | if (flags != UNITY_ARRAY_TO_ARRAY) |
| | { |
| | expd = (const char*)expected; |
| | } |
| |
|
| | do |
| | { |
| | act = actual[j]; |
| | if (flags == UNITY_ARRAY_TO_ARRAY) |
| | { |
| | expd = ((const char* const*)expected)[j]; |
| | } |
| |
|
| | |
| | if (expd && act) |
| | { |
| | for (i = 0; expd[i] || act[i]; i++) |
| | { |
| | if (expd[i] != act[i]) |
| | { |
| | Unity.CurrentTestFailed = 1; |
| | break; |
| | } |
| | } |
| | } |
| | else |
| | { |
| | if (expd != act) |
| | { |
| | Unity.CurrentTestFailed = 1; |
| | } |
| | } |
| |
|
| | if (Unity.CurrentTestFailed) |
| | { |
| | UnityTestResultsFailBegin(lineNumber); |
| | if (num_elements > 1) |
| | { |
| | UnityPrint(UnityStrElement); |
| | UnityPrintNumberUnsigned(j); |
| | } |
| | UnityPrintExpectedAndActualStrings(expd, act); |
| | UnityAddMsgIfSpecified(msg); |
| | UNITY_FAIL_AND_BAIL; |
| | } |
| | } while (++j < num_elements); |
| | } |
| |
|
| | |
| | void UnityAssertEqualMemory(UNITY_INTERNAL_PTR expected, |
| | UNITY_INTERNAL_PTR actual, |
| | const UNITY_UINT32 length, |
| | const UNITY_UINT32 num_elements, |
| | const char* msg, |
| | const UNITY_LINE_TYPE lineNumber, |
| | const UNITY_FLAGS_T flags) |
| | { |
| | 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; |
| | UNITY_UINT32 elements = num_elements; |
| | UNITY_UINT32 bytes; |
| |
|
| | RETURN_IF_FAIL_OR_IGNORE; |
| |
|
| | if (elements == 0) |
| | { |
| | #ifdef UNITY_COMPARE_PTRS_ON_ZERO_ARRAY |
| | UNITY_TEST_ASSERT_EQUAL_PTR(expected, actual, lineNumber, msg); |
| | #else |
| | UnityPrintPointlessAndBail(); |
| | #endif |
| | } |
| | if (length == 0) |
| | { |
| | UnityPrintPointlessAndBail(); |
| | } |
| |
|
| | if (expected == actual) |
| | { |
| | return; |
| | } |
| |
|
| | if (UnityIsOneArrayNull(expected, actual, lineNumber, msg)) |
| | { |
| | UNITY_FAIL_AND_BAIL; |
| | } |
| |
|
| | while (elements--) |
| | { |
| | bytes = length; |
| | while (bytes--) |
| | { |
| | if (*ptr_exp != *ptr_act) |
| | { |
| | UnityTestResultsFailBegin(lineNumber); |
| | UnityPrint(UnityStrMemory); |
| | if (num_elements > 1) |
| | { |
| | UnityPrint(UnityStrElement); |
| | UnityPrintNumberUnsigned(num_elements - elements - 1); |
| | } |
| | UnityPrint(UnityStrByte); |
| | UnityPrintNumberUnsigned(length - bytes - 1); |
| | UnityPrint(UnityStrExpected); |
| | UnityPrintIntNumberByStyle(*ptr_exp, UNITY_DISPLAY_STYLE_HEX8); |
| | UnityPrint(UnityStrWas); |
| | UnityPrintIntNumberByStyle(*ptr_act, UNITY_DISPLAY_STYLE_HEX8); |
| | UnityAddMsgIfSpecified(msg); |
| | UNITY_FAIL_AND_BAIL; |
| | } |
| | ptr_exp++; |
| | ptr_act++; |
| | } |
| | if (flags == UNITY_ARRAY_TO_VAL) |
| | { |
| | ptr_exp = (UNITY_PTR_ATTRIBUTE const unsigned char*)expected; |
| | } |
| | } |
| | } |
| |
|
| | |
| |
|
| | static union |
| | { |
| | UNITY_INT8 i8; |
| | UNITY_INT16 i16; |
| | UNITY_INT32 i32; |
| | #ifdef UNITY_SUPPORT_64 |
| | UNITY_INT64 i64; |
| | #endif |
| | #ifndef UNITY_EXCLUDE_FLOAT |
| | float f; |
| | #endif |
| | #ifndef UNITY_EXCLUDE_DOUBLE |
| | double d; |
| | #endif |
| | } UnityQuickCompare; |
| |
|
| | UNITY_INTERNAL_PTR UnityNumToPtr(const UNITY_INT num, const UNITY_UINT8 size) |
| | { |
| | switch(size) |
| | { |
| | case 1: |
| | UnityQuickCompare.i8 = (UNITY_INT8)num; |
| | return (UNITY_INTERNAL_PTR)(&UnityQuickCompare.i8); |
| |
|
| | case 2: |
| | UnityQuickCompare.i16 = (UNITY_INT16)num; |
| | return (UNITY_INTERNAL_PTR)(&UnityQuickCompare.i16); |
| |
|
| | #ifdef UNITY_SUPPORT_64 |
| | case 8: |
| | UnityQuickCompare.i64 = (UNITY_INT64)num; |
| | return (UNITY_INTERNAL_PTR)(&UnityQuickCompare.i64); |
| | #endif |
| |
|
| | default: |
| | UnityQuickCompare.i32 = (UNITY_INT32)num; |
| | return (UNITY_INTERNAL_PTR)(&UnityQuickCompare.i32); |
| | } |
| | } |
| |
|
| | #ifndef UNITY_EXCLUDE_FLOAT |
| | |
| | UNITY_INTERNAL_PTR UnityFloatToPtr(const float num) |
| | { |
| | UnityQuickCompare.f = num; |
| | return (UNITY_INTERNAL_PTR)(&UnityQuickCompare.f); |
| | } |
| | #endif |
| |
|
| | #ifndef UNITY_EXCLUDE_DOUBLE |
| | |
| | UNITY_INTERNAL_PTR UnityDoubleToPtr(const double num) |
| | { |
| | UnityQuickCompare.d = num; |
| | return (UNITY_INTERNAL_PTR)(&UnityQuickCompare.d); |
| | } |
| | #endif |
| |
|
| | #ifdef UNITY_INCLUDE_PRINT_FORMATTED |
| |
|
| | |
| | |
| | |
| |
|
| | enum UnityLengthModifier { |
| | UNITY_LENGTH_MODIFIER_NONE, |
| | UNITY_LENGTH_MODIFIER_LONG_LONG, |
| | UNITY_LENGTH_MODIFIER_LONG, |
| | }; |
| |
|
| | #define UNITY_EXTRACT_ARG(NUMBER_T, NUMBER, LENGTH_MOD, VA, ARG_T) \ |
| | do { \ |
| | switch (LENGTH_MOD) \ |
| | { \ |
| | case UNITY_LENGTH_MODIFIER_LONG_LONG: \ |
| | { \ |
| | NUMBER = (NUMBER_T)va_arg(VA, long long ARG_T); \ |
| | break; \ |
| | } \ |
| | case UNITY_LENGTH_MODIFIER_LONG: \ |
| | { \ |
| | NUMBER = (NUMBER_T)va_arg(VA, long ARG_T); \ |
| | break; \ |
| | } \ |
| | case UNITY_LENGTH_MODIFIER_NONE: \ |
| | default: \ |
| | { \ |
| | NUMBER = (NUMBER_T)va_arg(VA, ARG_T); \ |
| | break; \ |
| | } \ |
| | } \ |
| | } while (0) |
| |
|
| | static enum UnityLengthModifier UnityLengthModifierGet(const char *pch, int *length) |
| | { |
| | enum UnityLengthModifier length_mod; |
| | switch (pch[0]) |
| | { |
| | case 'l': |
| | { |
| | if (pch[1] == 'l') |
| | { |
| | *length = 2; |
| | length_mod = UNITY_LENGTH_MODIFIER_LONG_LONG; |
| | } |
| | else |
| | { |
| | *length = 1; |
| | length_mod = UNITY_LENGTH_MODIFIER_LONG; |
| | } |
| | break; |
| | } |
| | case 'h': |
| | { |
| | |
| | length_mod = UNITY_LENGTH_MODIFIER_NONE; |
| | if (pch[1] == 'h') |
| | { |
| | *length = 2; |
| | } |
| | else |
| | { |
| | *length = 1; |
| | } |
| | break; |
| | } |
| | case 'j': |
| | case 'z': |
| | case 't': |
| | case 'L': |
| | { |
| | |
| | length_mod = UNITY_LENGTH_MODIFIER_NONE; |
| | *length = 1; |
| | break; |
| | } |
| | default: |
| | { |
| | length_mod = UNITY_LENGTH_MODIFIER_NONE; |
| | *length = 0; |
| | } |
| | } |
| | return length_mod; |
| | } |
| |
|
| | |
| | |
| | |
| | static void UnityPrintFVA(const char* format, va_list va) |
| | { |
| | const char* pch = format; |
| | if (pch != NULL) |
| | { |
| | while (*pch) |
| | { |
| | |
| | if (*pch == '%') |
| | { |
| | pch++; |
| |
|
| | if (pch != NULL) |
| | { |
| | int length_mod_size; |
| | enum UnityLengthModifier length_mod = UnityLengthModifierGet(pch, &length_mod_size); |
| | pch += length_mod_size; |
| |
|
| | switch (*pch) |
| | { |
| | case 'd': |
| | case 'i': |
| | { |
| | UNITY_INT number; |
| | UNITY_EXTRACT_ARG(UNITY_INT, number, length_mod, va, int); |
| | UnityPrintNumber((UNITY_INT)number); |
| | break; |
| | } |
| | #ifndef UNITY_EXCLUDE_FLOAT_PRINT |
| | case 'f': |
| | case 'g': |
| | { |
| | const double number = va_arg(va, double); |
| | UnityPrintFloat((UNITY_DOUBLE)number); |
| | break; |
| | } |
| | #endif |
| | case 'u': |
| | { |
| | UNITY_UINT number; |
| | UNITY_EXTRACT_ARG(UNITY_UINT, number, length_mod, va, unsigned int); |
| | UnityPrintNumberUnsigned(number); |
| | break; |
| | } |
| | case 'b': |
| | { |
| | UNITY_UINT number; |
| | UNITY_EXTRACT_ARG(UNITY_UINT, number, length_mod, va, unsigned int); |
| | const UNITY_UINT mask = (UNITY_UINT)0 - (UNITY_UINT)1; |
| | UNITY_OUTPUT_CHAR('0'); |
| | UNITY_OUTPUT_CHAR('b'); |
| | UnityPrintMask(mask, number); |
| | break; |
| | } |
| | case 'x': |
| | case 'X': |
| | { |
| | UNITY_UINT number; |
| | UNITY_EXTRACT_ARG(UNITY_UINT, number, length_mod, va, unsigned int); |
| | UNITY_OUTPUT_CHAR('0'); |
| | UNITY_OUTPUT_CHAR('x'); |
| | UnityPrintNumberHex(number, UNITY_MAX_NIBBLES); |
| | break; |
| | } |
| | case 'p': |
| | { |
| | UNITY_UINT number; |
| | char nibbles_to_print = 8; |
| | if (UNITY_POINTER_WIDTH == 64) |
| | { |
| | length_mod = UNITY_LENGTH_MODIFIER_LONG_LONG; |
| | nibbles_to_print = 16; |
| | } |
| | UNITY_EXTRACT_ARG(UNITY_UINT, number, length_mod, va, unsigned int); |
| | UNITY_OUTPUT_CHAR('0'); |
| | UNITY_OUTPUT_CHAR('x'); |
| | UnityPrintNumberHex((UNITY_UINT)number, nibbles_to_print); |
| | break; |
| | } |
| | case 'c': |
| | { |
| | const int ch = va_arg(va, int); |
| | UnityPrintChar((const char *)&ch); |
| | break; |
| | } |
| | case 's': |
| | { |
| | const char * string = va_arg(va, const char *); |
| | UnityPrint(string); |
| | break; |
| | } |
| | case '%': |
| | { |
| | UnityPrintChar(pch); |
| | break; |
| | } |
| | default: |
| | { |
| | |
| | UNITY_OUTPUT_CHAR('%'); |
| | UnityPrintChar(pch); |
| | break; |
| | } |
| | } |
| | } |
| | } |
| | #ifdef UNITY_OUTPUT_COLOR |
| | |
| | else if ((*pch == 27) && (*(pch + 1) == '[')) |
| | { |
| | pch += UnityPrintAnsiEscapeString(pch); |
| | continue; |
| | } |
| | #endif |
| | else if (*pch == '\n') |
| | { |
| | UNITY_PRINT_EOL(); |
| | } |
| | else |
| | { |
| | UnityPrintChar(pch); |
| | } |
| |
|
| | pch++; |
| | } |
| | } |
| | } |
| |
|
| | void UnityPrintF(const UNITY_LINE_TYPE line, const char* format, ...) |
| | { |
| | UnityTestResultsBegin(Unity.TestFile, line); |
| | UnityPrint("INFO"); |
| | if(format != NULL) |
| | { |
| | UnityPrint(": "); |
| | va_list va; |
| | va_start(va, format); |
| | UnityPrintFVA(format, va); |
| | va_end(va); |
| | } |
| | UNITY_PRINT_EOL(); |
| | } |
| | #endif |
| |
|
| |
|
| | |
| | |
| | |
| |
|
| | |
| | void UnityFail(const char* msg, const UNITY_LINE_TYPE line) |
| | { |
| | RETURN_IF_FAIL_OR_IGNORE; |
| |
|
| | UnityTestResultsBegin(Unity.TestFile, line); |
| | UnityPrint(UnityStrFail); |
| | UnityAddMsgIfSpecified(msg); |
| |
|
| | UNITY_FAIL_AND_BAIL; |
| | } |
| |
|
| | |
| | void UnityIgnore(const char* msg, const UNITY_LINE_TYPE line) |
| | { |
| | RETURN_IF_FAIL_OR_IGNORE; |
| |
|
| | UnityTestResultsBegin(Unity.TestFile, line); |
| | UnityPrint(UnityStrIgnore); |
| | if (msg != NULL) |
| | { |
| | UNITY_OUTPUT_CHAR(':'); |
| | UNITY_OUTPUT_CHAR(' '); |
| | UnityPrint(msg); |
| | } |
| | UNITY_IGNORE_AND_BAIL; |
| | } |
| |
|
| | |
| | void UnityMessage(const char* msg, const UNITY_LINE_TYPE line) |
| | { |
| | UnityTestResultsBegin(Unity.TestFile, line); |
| | UnityPrint("INFO"); |
| | if (msg != NULL) |
| | { |
| | UNITY_OUTPUT_CHAR(':'); |
| | UNITY_OUTPUT_CHAR(' '); |
| | UnityPrint(msg); |
| | } |
| | UNITY_PRINT_EOL(); |
| | } |
| |
|
| | |
| | |
| | #ifndef UNITY_SKIP_DEFAULT_RUNNER |
| | void UnityDefaultTestRun(UnityTestFunction Func, const char* FuncName, const int FuncLineNum) |
| | { |
| | Unity.CurrentTestName = FuncName; |
| | Unity.CurrentTestLineNumber = (UNITY_LINE_TYPE)FuncLineNum; |
| | Unity.NumberOfTests++; |
| | #ifndef UNITY_EXCLUDE_DETAILS |
| | #ifdef UNITY_DETAIL_STACK_SIZE |
| | Unity.CurrentDetailStackSize = 0; |
| | #else |
| | UNITY_CLR_DETAILS(); |
| | #endif |
| | #endif |
| | UNITY_EXEC_TIME_START(); |
| | if (TEST_PROTECT()) |
| | { |
| | setUp(); |
| | Func(); |
| | } |
| | if (TEST_PROTECT()) |
| | { |
| | tearDown(); |
| | } |
| | UNITY_EXEC_TIME_STOP(); |
| | UnityConcludeTest(); |
| | } |
| | #endif |
| |
|
| | |
| | void UnitySetTestFile(const char* filename) |
| | { |
| | Unity.TestFile = filename; |
| | } |
| |
|
| | |
| | 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((UNITY_INT)(Unity.NumberOfTests)); |
| | UnityPrint(UnityStrResultsTests); |
| | UnityPrintNumber((UNITY_INT)(Unity.TestFailures)); |
| | UnityPrint(UnityStrResultsFailures); |
| | UnityPrintNumber((UNITY_INT)(Unity.TestIgnores)); |
| | UnityPrint(UnityStrResultsIgnored); |
| | UNITY_PRINT_EOL(); |
| | if (Unity.TestFailures == 0U) |
| | { |
| | UnityPrint(UnityStrOk); |
| | } |
| | else |
| | { |
| | UnityPrint(UnityStrFail); |
| | #ifdef UNITY_DIFFERENTIATE_FINAL_FAIL |
| | UNITY_OUTPUT_CHAR('E'); UNITY_OUTPUT_CHAR('D'); |
| | #endif |
| | } |
| | UNITY_PRINT_EOL(); |
| | UNITY_FLUSH_CALL(); |
| | UNITY_OUTPUT_COMPLETE(); |
| | return (int)(Unity.TestFailures); |
| | } |
| |
|
| | |
| | |
| | |
| | #ifndef UNITY_EXCLUDE_DETAILS |
| | #ifdef UNITY_DETAIL_STACK_SIZE |
| | void UnityPushDetail(UNITY_DETAIL_LABEL_TYPE label, UNITY_DETAIL_VALUE_TYPE value, const UNITY_LINE_TYPE line) { |
| | if (Unity.CurrentDetailStackSize >= UNITY_DETAIL_STACK_SIZE) { |
| | UnityTestResultsFailBegin(line); |
| | UnityPrint(UnityStrErrDetailStackFull); |
| | UnityAddMsgIfSpecified(NULL); |
| | UNITY_FAIL_AND_BAIL; |
| | } |
| | if (label >= UnityStrDetailLabelsCount) { |
| | UnityTestResultsFailBegin(line); |
| | UnityPrint(UnityStrErrDetailStackLabel); |
| | UnityPrintNumberUnsigned(label); |
| | UnityAddMsgIfSpecified(NULL); |
| | UNITY_FAIL_AND_BAIL; |
| | } |
| | Unity.CurrentDetailStackLabels[Unity.CurrentDetailStackSize] = label; |
| | Unity.CurrentDetailStackValues[Unity.CurrentDetailStackSize++] = value; |
| | } |
| | void UnityPopDetail(UNITY_DETAIL_LABEL_TYPE label, UNITY_DETAIL_VALUE_TYPE value, const UNITY_LINE_TYPE line) { |
| | if (Unity.CurrentDetailStackSize == 0) { |
| | UnityTestResultsFailBegin(line); |
| | UnityPrint(UnityStrErrDetailStackEmpty); |
| | UnityAddMsgIfSpecified(NULL); |
| | UNITY_FAIL_AND_BAIL; |
| | } |
| | if ((Unity.CurrentDetailStackLabels[Unity.CurrentDetailStackSize-1] != label) || (Unity.CurrentDetailStackValues[Unity.CurrentDetailStackSize-1] != value)) { |
| | UnityTestResultsFailBegin(line); |
| | UnityPrint(UnityStrErrDetailStackPop); |
| | UnityAddMsgIfSpecified(NULL); |
| | UNITY_FAIL_AND_BAIL; |
| | } |
| | Unity.CurrentDetailStackSize--; |
| | } |
| | #endif |
| | #endif |
| |
|
| | |
| | |
| | |
| | #ifdef UNITY_USE_COMMAND_LINE_ARGS |
| |
|
| | char* UnityOptionIncludeNamed = NULL; |
| | char* UnityOptionExcludeNamed = NULL; |
| | int UnityVerbosity = 1; |
| | int UnityStrictMatch = 0; |
| |
|
| | |
| | int UnityParseOptions(int argc, char** argv) |
| | { |
| | int i; |
| | UnityOptionIncludeNamed = NULL; |
| | UnityOptionExcludeNamed = NULL; |
| | UnityStrictMatch = 0; |
| |
|
| | for (i = 1; i < argc; i++) |
| | { |
| | if (argv[i][0] == '-') |
| | { |
| | switch (argv[i][1]) |
| | { |
| | case 'l': |
| | return -1; |
| | case 'n': |
| | case 'f': |
| | UnityStrictMatch = (argv[i][1] == 'n'); |
| | if (argv[i][2] == '=') |
| | { |
| | UnityOptionIncludeNamed = &argv[i][3]; |
| | } |
| | else if (++i < argc) |
| | { |
| | UnityOptionIncludeNamed = argv[i]; |
| | } |
| | else |
| | { |
| | UnityPrint("ERROR: No Test String to Include Matches For"); |
| | UNITY_PRINT_EOL(); |
| | return 1; |
| | } |
| | break; |
| | case 'q': |
| | UnityVerbosity = 0; |
| | break; |
| | case 'v': |
| | UnityVerbosity = 2; |
| | break; |
| | case 'x': |
| | if (argv[i][2] == '=') |
| | { |
| | UnityOptionExcludeNamed = &argv[i][3]; |
| | } |
| | else if (++i < argc) |
| | { |
| | UnityOptionExcludeNamed = argv[i]; |
| | } |
| | else |
| | { |
| | UnityPrint("ERROR: No Test String to Exclude Matches For"); |
| | UNITY_PRINT_EOL(); |
| | return 1; |
| | } |
| | break; |
| | default: |
| | UnityPrint("ERROR: Unknown Option "); |
| | UNITY_OUTPUT_CHAR(argv[i][1]); |
| | UNITY_PRINT_EOL(); |
| | |
| | |
| | case 'h': |
| | UnityPrint("Options: "); UNITY_PRINT_EOL(); |
| | UnityPrint("-l List all tests and exit"); UNITY_PRINT_EOL(); |
| | UnityPrint("-f NAME Filter to run only tests whose name includes NAME"); UNITY_PRINT_EOL(); |
| | UnityPrint("-n NAME Run only the test named NAME"); UNITY_PRINT_EOL(); |
| | UnityPrint("-h show this Help menu"); UNITY_PRINT_EOL(); |
| | UnityPrint("-q Quiet/decrease verbosity"); UNITY_PRINT_EOL(); |
| | UnityPrint("-v increase Verbosity"); UNITY_PRINT_EOL(); |
| | UnityPrint("-x NAME eXclude tests whose name includes NAME"); UNITY_PRINT_EOL(); |
| | UNITY_OUTPUT_FLUSH(); |
| | return 1; |
| | } |
| | } |
| | } |
| |
|
| | return 0; |
| | } |
| |
|
| | |
| | static int IsStringInBiggerString(const char* longstring, const char* shortstring) |
| | { |
| | const char* lptr = longstring; |
| | const char* sptr = shortstring; |
| | const char* lnext = lptr; |
| |
|
| | if (*sptr == '*') |
| | { |
| | return UnityStrictMatch ? 0 : 1; |
| | } |
| |
|
| | while (*lptr) |
| | { |
| | lnext = lptr + 1; |
| |
|
| | |
| | while (*lptr && *sptr && (*lptr == *sptr)) |
| | { |
| | lptr++; |
| | sptr++; |
| |
|
| | switch (*sptr) |
| | { |
| | case '*': |
| | return UnityStrictMatch ? 0 : 1; |
| |
|
| | case ',': |
| | case '"': |
| | case '\'': |
| | case 0: |
| | return (!UnityStrictMatch || (*lptr == 0)) ? 1 : 0; |
| |
|
| | case ':': |
| | return 2; |
| |
|
| | default: |
| | break; |
| | } |
| | } |
| |
|
| | |
| | if (UnityStrictMatch) |
| | { |
| | return 0; |
| | } |
| |
|
| | |
| | lptr = lnext; |
| | sptr = shortstring; |
| | } |
| |
|
| | return 0; |
| | } |
| |
|
| | |
| | static int UnityStringArgumentMatches(const char* str) |
| | { |
| | int retval; |
| | const char* ptr1; |
| | const char* ptr2; |
| | const char* ptrf; |
| |
|
| | |
| | ptr1 = str; |
| | while (ptr1[0] != 0) |
| | { |
| | if ((ptr1[0] == '"') || (ptr1[0] == '\'')) |
| | { |
| | ptr1++; |
| | } |
| |
|
| | |
| | ptr2 = ptr1; |
| | ptrf = 0; |
| | do |
| | { |
| | ptr2++; |
| | if ((ptr2[0] == ':') && (ptr2[1] != 0) && (ptr2[0] != '\'') && (ptr2[0] != '"') && (ptr2[0] != ',')) |
| | { |
| | ptrf = &ptr2[1]; |
| | } |
| | } while ((ptr2[0] != 0) && (ptr2[0] != '\'') && (ptr2[0] != '"') && (ptr2[0] != ',')); |
| |
|
| | while ((ptr2[0] != 0) && ((ptr2[0] == ':') || (ptr2[0] == '\'') || (ptr2[0] == '"') || (ptr2[0] == ','))) |
| | { |
| | ptr2++; |
| | } |
| |
|
| | |
| | retval = IsStringInBiggerString(Unity.TestFile, ptr1); |
| | if (retval == 1) |
| | { |
| | return retval; |
| | } |
| |
|
| | |
| | if ((retval == 2) && (ptrf != 0)) |
| | { |
| | if (IsStringInBiggerString(Unity.CurrentTestName, ptrf)) |
| | { |
| | return 1; |
| | } |
| | } |
| |
|
| | |
| | if (IsStringInBiggerString(Unity.CurrentTestName, ptr1) == 1) |
| | { |
| | return 1; |
| | } |
| |
|
| | ptr1 = ptr2; |
| | } |
| |
|
| | |
| | return 0; |
| | } |
| |
|
| | |
| | int UnityTestMatches(void) |
| | { |
| | |
| | int retval; |
| | if (UnityOptionIncludeNamed) |
| | { |
| | retval = UnityStringArgumentMatches(UnityOptionIncludeNamed); |
| | } |
| | else |
| | { |
| | retval = 1; |
| | } |
| |
|
| | |
| | if (UnityOptionExcludeNamed) |
| | { |
| | if (UnityStringArgumentMatches(UnityOptionExcludeNamed)) |
| | { |
| | retval = 0; |
| | } |
| | } |
| |
|
| | return retval; |
| | } |
| |
|
| | #endif |
| | |
| | |
| | __attribute__((weak)) void setUp(void) {} |
| | __attribute__((weak)) void tearDown(void) {} |