vendor/unity/src/unity.c in ceedling-0.25.0 vs vendor/unity/src/unity.c in ceedling-0.27.0
- old
+ new
@@ -10,17 +10,15 @@
/* If omitted from header, declare overrideable prototypes here so they're ready for use */
#ifdef UNITY_OMIT_OUTPUT_CHAR_HEADER_DECLARATION
void UNITY_OUTPUT_CHAR(int);
#endif
-/* Helpful macros for us to use here */
-#define UNITY_FAIL_AND_BAIL { Unity.CurrentTestFailed = 1; longjmp(Unity.AbortFrame, 1); }
-#define UNITY_IGNORE_AND_BAIL { Unity.CurrentTestIgnored = 1; longjmp(Unity.AbortFrame, 1); }
+/* Helpful macros for us to use here in Assert functions */
+#define UNITY_FAIL_AND_BAIL { Unity.CurrentTestFailed = 1; TEST_ABORT(); }
+#define UNITY_IGNORE_AND_BAIL { Unity.CurrentTestIgnored = 1; TEST_ABORT(); }
+#define RETURN_IF_FAIL_OR_IGNORE if (Unity.CurrentTestFailed || Unity.CurrentTestIgnored) return
-/* 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_STORAGE_T Unity;
static const char UnityStrOk[] = "OK";
static const char UnityStrPass[] = "PASS";
static const char UnityStrFail[] = "FAIL";
@@ -52,25 +50,10 @@
static const char UnityStrResultsFailures[] = " Failures ";
static const char UnityStrResultsIgnored[] = " Ignored ";
static const char UnityStrDetail1Name[] = UNITY_DETAIL1_NAME " ";
static const char UnityStrDetail2Name[] = " " UNITY_DETAIL2_NAME " ";
-/* compiler-generic print formatting masks */
-static const UNITY_UINT UnitySizeMask[] =
-{
- 255u, /* 0xFF */
- 65535u, /* 0xFFFF */
- 65535u,
- 4294967295u, /* 0xFFFFFFFF */
- 4294967295u,
- 4294967295u,
- 4294967295u
-#ifdef UNITY_SUPPORT_64
- ,0xFFFFFFFFFFFFFFFF
-#endif
-};
-
/*-----------------------------------------------
* Pretty Printers & Test Result Output Handlers
*-----------------------------------------------*/
void UnityPrint(const char* string)
@@ -108,11 +91,10 @@
pch++;
}
}
}
-void UnityPrintLen(const char* string, const UNITY_UINT32 length);
void UnityPrintLen(const char* string, const UNITY_UINT32 length)
{
const char* pch = string;
if (pch != NULL)
@@ -155,17 +137,17 @@
{
UnityPrintNumber(number);
}
else if ((style & UNITY_DISPLAY_RANGE_UINT) == UNITY_DISPLAY_RANGE_UINT)
{
- UnityPrintNumberUnsigned( (UNITY_UINT)number & UnitySizeMask[((UNITY_UINT)style & (UNITY_UINT)0x0F) - 1] );
+ UnityPrintNumberUnsigned((UNITY_UINT)number);
}
else
{
UNITY_OUTPUT_CHAR('0');
UNITY_OUTPUT_CHAR('x');
- UnityPrintNumberHex((UNITY_UINT)number, (char)((style & 0x000F) << 1));
+ UnityPrintNumberHex((UNITY_UINT)number, (char)((style & 0xF) * 2));
}
}
/*-----------------------------------------------*/
void UnityPrintNumber(const UNITY_INT number_to_print)
@@ -196,23 +178,25 @@
/* now mod and print, then divide divisor */
do
{
UNITY_OUTPUT_CHAR((char)('0' + (number / divisor % 10)));
divisor /= 10;
- }
- while (divisor > 0);
+ } while (divisor > 0);
}
/*-----------------------------------------------*/
void UnityPrintNumberHex(const UNITY_UINT number, const char nibbles_to_print)
{
- UNITY_UINT nibble;
+ int nibble;
char nibbles = nibbles_to_print;
+ if ((unsigned)nibbles > (2 * sizeof(number)))
+ nibbles = 2 * sizeof(number);
while (nibbles > 0)
{
- nibble = (number >> (--nibbles << 2)) & 0x0000000F;
+ nibbles--;
+ nibble = (int)(number >> (nibbles * 4)) & 0x0F;
if (nibble <= 9)
{
UNITY_OUTPUT_CHAR((char)('0' + nibble));
}
else
@@ -248,69 +232,119 @@
current_bit = current_bit >> 1;
}
}
/*-----------------------------------------------*/
-#ifdef UNITY_FLOAT_VERBOSE
-#include <stdio.h>
-
-#ifndef UNITY_VERBOSE_NUMBER_MAX_LENGTH
-# ifdef UNITY_DOUBLE_VERBOSE
-# define UNITY_VERBOSE_NUMBER_MAX_LENGTH 317
-# else
-# define UNITY_VERBOSE_NUMBER_MAX_LENGTH 47
-# endif
-#endif
-
-void UnityPrintFloat(UNITY_DOUBLE number)
+#ifndef UNITY_EXCLUDE_FLOAT_PRINT
+static void UnityPrintDecimalAndNumberWithLeadingZeros(UNITY_INT32 fraction_part, UNITY_INT32 divisor)
{
- char TempBuffer[UNITY_VERBOSE_NUMBER_MAX_LENGTH + 1];
- snprintf(TempBuffer, sizeof(TempBuffer), "%.6f", number);
- UnityPrint(TempBuffer);
+ UNITY_OUTPUT_CHAR('.');
+ while (divisor > 0)
+ {
+ UNITY_OUTPUT_CHAR('0' + fraction_part / divisor);
+ fraction_part %= divisor;
+ divisor /= 10;
+ if (fraction_part == 0) break; /* Truncate trailing 0's */
+ }
}
+#ifndef UNITY_ROUND_TIES_AWAY_FROM_ZERO
+/* If rounds up && remainder 0.5 && result odd && below cutoff for double precision issues */
+ #define ROUND_TIES_TO_EVEN(orig, num_int, num) \
+ if (num_int > (num) && (num) - (num_int-1) <= 0.5 && (num_int & 1) == 1 && orig < 1e22) \
+ num_int -= 1 /* => a tie to round down to even */
+#else
+ #define ROUND_TIES_TO_EVEN(orig, num_int, num) /* Remove macro */
#endif
-/*-----------------------------------------------*/
+/* Printing floating point numbers is hard. Some goals of this implementation: works for embedded
+ * systems, floats or doubles, and has a reasonable format. The key paper in this area,
+ * 'How to Print Floating-Point Numbers Accurately' by Steele & White, shows an approximation by
+ * scaling called Dragon 2. This code uses a similar idea. The other core algorithm uses casts and
+ * floating subtraction to give exact remainders after the decimal, to be scaled into an integer.
+ * Extra trailing 0's are excluded. The output defaults to rounding to nearest, ties to even. You
+ * can enable rounding ties away from zero. Note: UNITY_DOUBLE param can typedef to float or double
-void UnityPrintFail(void);
-void UnityPrintFail(void)
+ * The old version required compiling in snprintf. For reference, with a similar format as now:
+ * char buf[19];
+ * if (number > 4294967296.0 || -number > 4294967296.0) snprintf(buf, sizeof buf, "%.8e", number);
+ * else snprintf(buf, sizeof buf, "%.6f", number);
+ * UnityPrint(buf);
+ */
+void UnityPrintFloat(const UNITY_DOUBLE input_number)
{
- UnityPrint(UnityStrFail);
-}
+ UNITY_DOUBLE number;
-void UnityPrintOk(void);
-void UnityPrintOk(void)
-{
- UnityPrint(UnityStrOk);
+ if (input_number < 0)
+ {
+ UNITY_OUTPUT_CHAR('-');
+ number = -input_number;
+ } else
+ {
+ number = input_number;
+ }
+
+ if (isnan(number)) UnityPrint(UnityStrNaN);
+ else if (isinf(number)) UnityPrintLen(UnityStrInf, 3);
+ else if (number <= 0.0000005 && number > 0) UnityPrint("0.000000..."); /* Small number */
+ else if (number < 4294967295.9999995) /* Rounded result fits in 32 bits, "%.6f" format */
+ {
+ const UNITY_INT32 divisor = 1000000/10;
+ UNITY_UINT32 integer_part = (UNITY_UINT32)number;
+ UNITY_INT32 fraction_part = (UNITY_INT32)((number - (UNITY_DOUBLE)integer_part)*1000000.0 + 0.5);
+ /* Double precision calculation gives best performance for six rounded decimal places */
+ ROUND_TIES_TO_EVEN(number, fraction_part, (number - (UNITY_DOUBLE)integer_part)*1000000.0);
+
+ if (fraction_part == 1000000) /* Carry across the decimal point */
+ {
+ fraction_part = 0;
+ integer_part += 1;
+ }
+
+ UnityPrintNumberUnsigned(integer_part);
+ UnityPrintDecimalAndNumberWithLeadingZeros(fraction_part, divisor);
+ }
+ else /* Number is larger, use exponential format of 9 digits, "%.8e" */
+ {
+ const UNITY_INT32 divisor = 1000000000/10;
+ UNITY_INT32 integer_part;
+ UNITY_DOUBLE_TYPE divide = 10.0;
+ int exponent = 9;
+
+ while (number / divide >= 1000000000.0 - 0.5)
+ {
+ divide *= 10;
+ exponent++;
+ }
+ integer_part = (UNITY_INT32)(number / divide + 0.5);
+ /* Double precision calculation required for float, to produce 9 rounded digits */
+ ROUND_TIES_TO_EVEN(number, integer_part, number / divide);
+
+ UNITY_OUTPUT_CHAR('0' + integer_part / divisor);
+ UnityPrintDecimalAndNumberWithLeadingZeros(integer_part % divisor, divisor / 10);
+ UNITY_OUTPUT_CHAR('e');
+ UNITY_OUTPUT_CHAR('+');
+ if (exponent < 10) UNITY_OUTPUT_CHAR('0');
+ UnityPrintNumber(exponent);
+ }
}
+#endif /* ! UNITY_EXCLUDE_FLOAT_PRINT */
/*-----------------------------------------------*/
-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((UNITY_INT)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(':');
}
/*-----------------------------------------------*/
@@ -335,11 +369,10 @@
UNITY_PRINT_EOL();
UNITY_FLUSH_CALL();
}
/*-----------------------------------------------*/
-static void UnityAddMsgIfSpecified(const char* msg);
static void UnityAddMsgIfSpecified(const char* msg)
{
if (msg)
{
UnityPrint(UnityStrSpacer);
@@ -359,11 +392,10 @@
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)
{
@@ -371,84 +403,84 @@
UnityPrint(expected);
UNITY_OUTPUT_CHAR('\'');
}
else
{
- UnityPrint(UnityStrNull);
+ UnityPrint(UnityStrNull);
}
UnityPrint(UnityStrWas);
if (actual != NULL)
{
UNITY_OUTPUT_CHAR('\'');
UnityPrint(actual);
UNITY_OUTPUT_CHAR('\'');
}
else
{
- UnityPrint(UnityStrNull);
+ UnityPrint(UnityStrNull);
}
}
/*-----------------------------------------------*/
-static void UnityPrintExpectedAndActualStringsLen(const char* expected, const char* actual, const UNITY_UINT32 length)
+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(UnityStrNull);
}
UnityPrint(UnityStrWas);
if (actual != NULL)
{
UNITY_OUTPUT_CHAR('\'');
UnityPrintLen(actual, length);
UNITY_OUTPUT_CHAR('\'');
}
else
{
- UnityPrint(UnityStrNull);
+ UnityPrint(UnityStrNull);
}
}
-
-
/*-----------------------------------------------
* Assertion & Control Helpers
*-----------------------------------------------*/
-static int UnityCheckArraysForNull(UNITY_INTERNAL_PTR expected, UNITY_INTERNAL_PTR actual, const UNITY_LINE_TYPE lineNumber, const char* msg)
+static int UnityIsOneArrayNull(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;
+ if (expected == actual) return 0; /* Both are NULL or same pointer */
- /* throw error if just expected is NULL */
+ /* print and return true if just expected is NULL */
if (expected == NULL)
{
UnityTestResultsFailBegin(lineNumber);
UnityPrint(UnityStrNullPointerForExpected);
UnityAddMsgIfSpecified(msg);
- UNITY_FAIL_AND_BAIL;
+ return 1;
}
- /* throw error if just actual is NULL */
+ /* print and return true if just actual is NULL */
if (actual == NULL)
{
UnityTestResultsFailBegin(lineNumber);
UnityPrint(UnityStrNullPointerForActual);
UnityAddMsgIfSpecified(msg);
- UNITY_FAIL_AND_BAIL;
+ return 1;
}
- /* return false if neither is NULL */
- return 0;
+ return 0; /* return false if neither is NULL */
}
/*-----------------------------------------------
* Assertion Functions
*-----------------------------------------------*/
@@ -457,11 +489,11 @@
const UNITY_INT expected,
const UNITY_INT actual,
const char* msg,
const UNITY_LINE_TYPE lineNumber)
{
- UNITY_SKIP_EXECUTION;
+ RETURN_IF_FAIL_OR_IGNORE;
if ((mask & expected) != (mask & actual))
{
UnityTestResultsFailBegin(lineNumber);
UnityPrint(UnityStrExpected);
@@ -478,11 +510,11 @@
const UNITY_INT actual,
const char* msg,
const UNITY_LINE_TYPE lineNumber,
const UNITY_DISPLAY_STYLE_T style)
{
- UNITY_SKIP_EXECUTION;
+ RETURN_IF_FAIL_OR_IGNORE;
if (expected != actual)
{
UnityTestResultsFailBegin(lineNumber);
UnityPrint(UnityStrExpected);
@@ -505,180 +537,153 @@
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_DISPLAY_STYLE_T style,
+ const UNITY_FLAGS_T flags)
{
UNITY_UINT32 elements = num_elements;
- UNITY_INTERNAL_PTR ptr_exp = (UNITY_INTERNAL_PTR)expected;
- UNITY_INTERNAL_PTR ptr_act = (UNITY_INTERNAL_PTR)actual;
+ unsigned int length = style & 0xF;
- UNITY_SKIP_EXECUTION;
+ RETURN_IF_FAIL_OR_IGNORE;
- if (elements == 0)
+ if (num_elements == 0)
{
UnityPrintPointlessAndBail();
}
- if (UnityCheckArraysForNull((UNITY_INTERNAL_PTR)expected, (UNITY_INTERNAL_PTR)actual, lineNumber, msg) == 1)
- return;
+ if (expected == actual) return; /* Both are NULL or same pointer */
+ if (UnityIsOneArrayNull(expected, actual, lineNumber, msg))
+ UNITY_FAIL_AND_BAIL;
- /* 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))
+ while (elements--)
{
- case UNITY_DISPLAY_STYLE_HEX8:
- case UNITY_DISPLAY_STYLE_INT8:
- case UNITY_DISPLAY_STYLE_UINT8:
- while (elements--)
- {
- if (*(UNITY_PTR_ATTRIBUTE const UNITY_INT8*)ptr_exp != *(UNITY_PTR_ATTRIBUTE const UNITY_INT8*)ptr_act)
- {
- UnityTestResultsFailBegin(lineNumber);
- UnityPrint(UnityStrElement);
- UnityPrintNumberUnsigned(num_elements - elements - 1);
- UnityPrint(UnityStrExpected);
- UnityPrintNumberByStyle(*(UNITY_PTR_ATTRIBUTE const UNITY_INT8*)ptr_exp, style);
- UnityPrint(UnityStrWas);
- UnityPrintNumberByStyle(*(UNITY_PTR_ATTRIBUTE const UNITY_INT8*)ptr_act, style);
- UnityAddMsgIfSpecified(msg);
- UNITY_FAIL_AND_BAIL;
- }
- ptr_exp = (UNITY_INTERNAL_PTR)((UNITY_PTR)ptr_exp + 1);
- ptr_act = (UNITY_INTERNAL_PTR)((UNITY_PTR)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 UNITY_INT16*)ptr_exp != *(UNITY_PTR_ATTRIBUTE const UNITY_INT16*)ptr_act)
- {
- UnityTestResultsFailBegin(lineNumber);
- UnityPrint(UnityStrElement);
- UnityPrintNumberUnsigned(num_elements - elements - 1);
- UnityPrint(UnityStrExpected);
- UnityPrintNumberByStyle(*(UNITY_PTR_ATTRIBUTE const UNITY_INT16*)ptr_exp, style);
- UnityPrint(UnityStrWas);
- UnityPrintNumberByStyle(*(UNITY_PTR_ATTRIBUTE const UNITY_INT16*)ptr_act, style);
- UnityAddMsgIfSpecified(msg);
- UNITY_FAIL_AND_BAIL;
- }
- ptr_exp = (UNITY_INTERNAL_PTR)((UNITY_PTR)ptr_exp + 2);
- ptr_act = (UNITY_INTERNAL_PTR)((UNITY_PTR)ptr_act + 2);
- }
- break;
+ 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;
+ break;
+ case 2:
+ expect_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT16*)expected;
+ actual_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT16*)actual;
+ 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 UNITY_INT64*)ptr_exp != *(UNITY_PTR_ATTRIBUTE const UNITY_INT64*)ptr_act)
- {
- UnityTestResultsFailBegin(lineNumber);
- UnityPrint(UnityStrElement);
- UnityPrintNumberUnsigned(num_elements - elements - 1);
- UnityPrint(UnityStrExpected);
- UnityPrintNumberByStyle(*(UNITY_PTR_ATTRIBUTE const UNITY_INT64*)ptr_exp, style);
- UnityPrint(UnityStrWas);
- UnityPrintNumberByStyle(*(UNITY_PTR_ATTRIBUTE const UNITY_INT64*)ptr_act, style);
- UnityAddMsgIfSpecified(msg);
- UNITY_FAIL_AND_BAIL;
- }
- ptr_exp = (UNITY_INTERNAL_PTR)((UNITY_PTR)ptr_exp + 8);
- ptr_act = (UNITY_INTERNAL_PTR)((UNITY_PTR)ptr_act + 8);
- }
- break;
+ case 8:
+ expect_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT64*)expected;
+ actual_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT64*)actual;
+ break;
#endif
- default:
- while (elements--)
- {
- if (*(UNITY_PTR_ATTRIBUTE const UNITY_INT32*)ptr_exp != *(UNITY_PTR_ATTRIBUTE const UNITY_INT32*)ptr_act)
- {
- UnityTestResultsFailBegin(lineNumber);
- UnityPrint(UnityStrElement);
- UnityPrintNumberUnsigned(num_elements - elements - 1);
- UnityPrint(UnityStrExpected);
- UnityPrintNumberByStyle(*(UNITY_PTR_ATTRIBUTE const UNITY_INT32*)ptr_exp, style);
- UnityPrint(UnityStrWas);
- UnityPrintNumberByStyle(*(UNITY_PTR_ATTRIBUTE const UNITY_INT32*)ptr_act, style);
- UnityAddMsgIfSpecified(msg);
- UNITY_FAIL_AND_BAIL;
- }
- ptr_exp = (UNITY_INTERNAL_PTR)((UNITY_PTR)ptr_exp + 4);
- ptr_act = (UNITY_INTERNAL_PTR)((UNITY_PTR)ptr_act + 4);
+ default: /* length 4 bytes */
+ expect_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT32*)expected;
+ actual_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT32*)actual;
+ length = 4;
+ break;
+ }
+
+ if (expect_val != actual_val)
+ {
+ if (style & UNITY_DISPLAY_RANGE_UINT && length < sizeof(expect_val))
+ { /* For UINT, remove sign extension (padding 1's) from signed type casts above */
+ UNITY_INT mask = 1;
+ mask = (mask << 8 * length) - 1;
+ expect_val &= mask;
+ actual_val &= mask;
}
- break;
+ UnityTestResultsFailBegin(lineNumber);
+ UnityPrint(UnityStrElement);
+ UnityPrintNumberUnsigned(num_elements - elements - 1);
+ UnityPrint(UnityStrExpected);
+ UnityPrintNumberByStyle(expect_val, style);
+ UnityPrint(UnityStrWas);
+ UnityPrintNumberByStyle(actual_val, style);
+ UnityAddMsgIfSpecified(msg);
+ UNITY_FAIL_AND_BAIL;
+ }
+ if (flags == UNITY_ARRAY_TO_ARRAY)
+ {
+ expected = (UNITY_INTERNAL_PTR)(length + (const char*)expected);
+ }
+ actual = (UNITY_INTERNAL_PTR)(length + (const char*)actual);
}
}
/*-----------------------------------------------*/
+#ifndef UNITY_EXCLUDE_FLOAT
/* Wrap this define in a function with variable types as float or double */
#define UNITY_FLOAT_OR_DOUBLE_WITHIN(delta, expected, actual, diff) \
- if (isinf(expected) && isinf(actual) && (isneg(expected) == isneg(actual))) return 1; \
+ if (isinf(expected) && isinf(actual) && ((expected < 0) == (actual < 0))) return 1; \
if (UNITY_NAN_CHECK) return 1; \
diff = actual - expected; \
- if (diff < 0.0f) diff = 0.0f - diff; \
- if (delta < 0.0f) delta = 0.0f - delta; \
+ if (diff < 0) diff = -diff; \
+ if (delta < 0) delta = -delta; \
return !(isnan(diff) || isinf(diff) || (diff > delta))
/* This first part of this condition will catch any NaN or Infinite values */
#ifndef UNITY_NAN_NOT_EQUAL_NAN
#define UNITY_NAN_CHECK isnan(expected) && isnan(actual)
#else
#define UNITY_NAN_CHECK 0
#endif
-#ifndef UNITY_EXCLUDE_FLOAT
+#ifndef UNITY_EXCLUDE_FLOAT_PRINT
+ #define UNITY_PRINT_EXPECTED_AND_ACTUAL_FLOAT(expected, actual) \
+ { \
+ UnityPrint(UnityStrExpected); \
+ UnityPrintFloat(expected); \
+ UnityPrint(UnityStrWas); \
+ UnityPrintFloat(actual); }
+#else
+ #define UNITY_PRINT_EXPECTED_AND_ACTUAL_FLOAT(expected, actual) \
+ UnityPrint(UnityStrDelta)
+#endif /* UNITY_EXCLUDE_FLOAT_PRINT */
+
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 UnityAssertEqualFloatArray(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_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_SKIP_EXECUTION;
+ RETURN_IF_FAIL_OR_IGNORE;
if (elements == 0)
{
UnityPrintPointlessAndBail();
}
- if (UnityCheckArraysForNull((UNITY_INTERNAL_PTR)expected, (UNITY_INTERNAL_PTR)actual, lineNumber, msg) == 1)
- return;
+ if (expected == actual) return; /* Both are NULL or same pointer */
+ if (UnityIsOneArrayNull((UNITY_INTERNAL_PTR)expected, (UNITY_INTERNAL_PTR)actual, lineNumber, msg))
+ UNITY_FAIL_AND_BAIL;
while (elements--)
{
if (!UnityFloatsWithin(*ptr_expected * UNITY_FLOAT_PRECISION, *ptr_expected, *ptr_actual))
{
UnityTestResultsFailBegin(lineNumber);
UnityPrint(UnityStrElement);
UnityPrintNumberUnsigned(num_elements - elements - 1);
-#ifdef UNITY_FLOAT_VERBOSE
- UnityPrint(UnityStrExpected);
- UnityPrintFloat(*ptr_expected);
- UnityPrint(UnityStrWas);
- UnityPrintFloat(*ptr_actual);
-#else
- UnityPrint(UnityStrDelta);
-#endif
+ UNITY_PRINT_EXPECTED_AND_ACTUAL_FLOAT((UNITY_DOUBLE)*ptr_expected, (UNITY_DOUBLE)*ptr_actual);
UnityAddMsgIfSpecified(msg);
UNITY_FAIL_AND_BAIL;
}
- ptr_expected++;
+ if (flags == UNITY_ARRAY_TO_ARRAY)
+ {
+ ptr_expected++;
+ }
ptr_actual++;
}
}
/*-----------------------------------------------*/
@@ -686,24 +691,17 @@
const UNITY_FLOAT expected,
const UNITY_FLOAT actual,
const char* msg,
const UNITY_LINE_TYPE lineNumber)
{
- UNITY_SKIP_EXECUTION;
+ RETURN_IF_FAIL_OR_IGNORE;
if (!UnityFloatsWithin(delta, expected, actual))
{
UnityTestResultsFailBegin(lineNumber);
-#ifdef UNITY_FLOAT_VERBOSE
- UnityPrint(UnityStrExpected);
- UnityPrintFloat(expected);
- UnityPrint(UnityStrWas);
- UnityPrintFloat(actual);
-#else
- UnityPrint(UnityStrDelta);
-#endif
+ UNITY_PRINT_EXPECTED_AND_ACTUAL_FLOAT((UNITY_DOUBLE)expected, (UNITY_DOUBLE)actual);
UnityAddMsgIfSpecified(msg);
UNITY_FAIL_AND_BAIL;
}
}
@@ -711,40 +709,36 @@
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);
+ 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);
- UNITY_SKIP_EXECUTION;
+ RETURN_IF_FAIL_OR_IGNORE;
- switch(style)
+ switch (style)
{
case UNITY_FLOAT_IS_INF:
case UNITY_FLOAT_IS_NOT_INF:
- is_trait = isinf(actual) & ispos(actual);
+ is_trait = isinf(actual) && (actual > 0);
break;
case UNITY_FLOAT_IS_NEG_INF:
case UNITY_FLOAT_IS_NOT_NEG_INF:
- is_trait = isinf(actual) & isneg(actual);
+ is_trait = isinf(actual) && (actual < 0);
break;
case UNITY_FLOAT_IS_NAN:
case UNITY_FLOAT_IS_NOT_NAN:
is_trait = isnan(actual) ? 1 : 0;
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_DET: /* A determinate number is non infinite and not NaN. */
case UNITY_FLOAT_IS_NOT_DET:
- if (isinf(actual) || isnan(actual))
- is_trait = 0;
- else
- is_trait = 1;
+ is_trait = !isinf(actual) && !isnan(actual);
break;
default:
trait_index = 0;
trait_names[0] = UnityStrInvalidFloatTrait;
@@ -757,12 +751,12 @@
UnityPrint(UnityStrExpected);
if (!should_be_trait)
UnityPrint(UnityStrNot);
UnityPrint(trait_names[trait_index]);
UnityPrint(UnityStrWas);
-#ifdef UNITY_FLOAT_VERBOSE
- UnityPrintFloat(actual);
+#ifndef UNITY_EXCLUDE_FLOAT_PRINT
+ UnityPrintFloat((UNITY_DOUBLE)actual);
#else
if (should_be_trait)
UnityPrint(UnityStrNot);
UnityPrint(trait_names[trait_index]);
#endif
@@ -783,45 +777,43 @@
void UnityAssertEqualDoubleArray(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_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_SKIP_EXECUTION;
+ RETURN_IF_FAIL_OR_IGNORE;
if (elements == 0)
{
UnityPrintPointlessAndBail();
}
- if (UnityCheckArraysForNull((UNITY_INTERNAL_PTR)expected, (UNITY_INTERNAL_PTR)actual, lineNumber, msg) == 1)
- return;
+ if (expected == actual) return; /* Both are NULL or same pointer */
+ if (UnityIsOneArrayNull((UNITY_INTERNAL_PTR)expected, (UNITY_INTERNAL_PTR)actual, lineNumber, msg))
+ UNITY_FAIL_AND_BAIL;
while (elements--)
{
if (!UnityDoublesWithin(*ptr_expected * UNITY_DOUBLE_PRECISION, *ptr_expected, *ptr_actual))
{
UnityTestResultsFailBegin(lineNumber);
UnityPrint(UnityStrElement);
UnityPrintNumberUnsigned(num_elements - elements - 1);
-#ifdef UNITY_DOUBLE_VERBOSE
- UnityPrint(UnityStrExpected);
- UnityPrintFloat((float)(*ptr_expected));
- UnityPrint(UnityStrWas);
- UnityPrintFloat((float)(*ptr_actual));
-#else
- UnityPrint(UnityStrDelta);
-#endif
+ UNITY_PRINT_EXPECTED_AND_ACTUAL_FLOAT(*ptr_expected, *ptr_actual);
UnityAddMsgIfSpecified(msg);
UNITY_FAIL_AND_BAIL;
}
- ptr_expected++;
+ if (flags == UNITY_ARRAY_TO_ARRAY)
+ {
+ ptr_expected++;
+ }
ptr_actual++;
}
}
/*-----------------------------------------------*/
@@ -829,23 +821,16 @@
const UNITY_DOUBLE expected,
const UNITY_DOUBLE actual,
const char* msg,
const UNITY_LINE_TYPE lineNumber)
{
- UNITY_SKIP_EXECUTION;
+ RETURN_IF_FAIL_OR_IGNORE;
if (!UnityDoublesWithin(delta, expected, actual))
{
UnityTestResultsFailBegin(lineNumber);
-#ifdef UNITY_DOUBLE_VERBOSE
- UnityPrint(UnityStrExpected);
- UnityPrintFloat((float)expected);
- UnityPrint(UnityStrWas);
- UnityPrintFloat((float)actual);
-#else
- UnityPrint(UnityStrDelta);
-#endif
+ UNITY_PRINT_EXPECTED_AND_ACTUAL_FLOAT(expected, actual);
UnityAddMsgIfSpecified(msg);
UNITY_FAIL_AND_BAIL;
}
}
@@ -854,40 +839,36 @@
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);
+ 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);
- UNITY_SKIP_EXECUTION;
+ RETURN_IF_FAIL_OR_IGNORE;
- switch(style)
+ switch (style)
{
case UNITY_FLOAT_IS_INF:
case UNITY_FLOAT_IS_NOT_INF:
- is_trait = isinf(actual) & ispos(actual);
+ is_trait = isinf(actual) && (actual > 0);
break;
case UNITY_FLOAT_IS_NEG_INF:
case UNITY_FLOAT_IS_NOT_NEG_INF:
- is_trait = isinf(actual) & isneg(actual);
+ is_trait = isinf(actual) && (actual < 0);
break;
case UNITY_FLOAT_IS_NAN:
case UNITY_FLOAT_IS_NOT_NAN:
is_trait = isnan(actual) ? 1 : 0;
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_DET: /* A determinate number is non infinite and not NaN. */
case UNITY_FLOAT_IS_NOT_DET:
- if (isinf(actual) || isnan(actual))
- is_trait = 0;
- else
- is_trait = 1;
+ is_trait = !isinf(actual) && !isnan(actual);
break;
default:
trait_index = 0;
trait_names[0] = UnityStrInvalidFloatTrait;
@@ -900,11 +881,11 @@
UnityPrint(UnityStrExpected);
if (!should_be_trait)
UnityPrint(UnityStrNot);
UnityPrint(trait_names[trait_index]);
UnityPrint(UnityStrWas);
-#ifdef UNITY_DOUBLE_VERBOSE
+#ifndef UNITY_EXCLUDE_FLOAT_PRINT
UnityPrintFloat(actual);
#else
if (should_be_trait)
UnityPrint(UnityStrNot);
UnityPrint(trait_names[trait_index]);
@@ -912,36 +893,35 @@
UnityAddMsgIfSpecified(msg);
UNITY_FAIL_AND_BAIL;
}
}
-
#endif /* not UNITY_EXCLUDE_DOUBLE */
/*-----------------------------------------------*/
-void UnityAssertNumbersWithin( 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)
+void UnityAssertNumbersWithin(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)
{
- UNITY_SKIP_EXECUTION;
+ RETURN_IF_FAIL_OR_IGNORE;
if ((style & UNITY_DISPLAY_RANGE_INT) == UNITY_DISPLAY_RANGE_INT)
{
if (actual > expected)
- Unity.CurrentTestFailed = ((UNITY_UINT)(actual - expected) > delta);
+ Unity.CurrentTestFailed = (UNITY_UINT)((UNITY_UINT)(actual - expected) > delta);
else
- Unity.CurrentTestFailed = ((UNITY_UINT)(expected - actual) > delta);
+ Unity.CurrentTestFailed = (UNITY_UINT)((UNITY_UINT)(expected - actual) > delta);
}
else
{
if ((UNITY_UINT)actual > (UNITY_UINT)expected)
- Unity.CurrentTestFailed = ((UNITY_UINT)(actual - expected) > delta);
+ Unity.CurrentTestFailed = (UNITY_UINT)((UNITY_UINT)(actual - expected) > delta);
else
- Unity.CurrentTestFailed = ((UNITY_UINT)(expected - actual) > delta);
+ Unity.CurrentTestFailed = (UNITY_UINT)((UNITY_UINT)(expected - actual) > delta);
}
if (Unity.CurrentTestFailed)
{
UnityTestResultsFailBegin(lineNumber);
@@ -962,11 +942,11 @@
const char* msg,
const UNITY_LINE_TYPE lineNumber)
{
UNITY_UINT32 i;
- UNITY_SKIP_EXECUTION;
+ RETURN_IF_FAIL_OR_IGNORE;
/* if both pointers not null compare the strings */
if (expected && actual)
{
for (i = 0; expected[i] || actual[i]; i++)
@@ -986,27 +966,27 @@
}
}
if (Unity.CurrentTestFailed)
{
- UnityTestResultsFailBegin(lineNumber);
- UnityPrintExpectedAndActualStrings(expected, actual);
- UnityAddMsgIfSpecified(msg);
- UNITY_FAIL_AND_BAIL;
+ 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)
+ const char* actual,
+ const UNITY_UINT32 length,
+ const char* msg,
+ const UNITY_LINE_TYPE lineNumber)
{
UNITY_UINT32 i;
- UNITY_SKIP_EXECUTION;
+ RETURN_IF_FAIL_OR_IGNORE;
/* if both pointers not null compare the strings */
if (expected && actual)
{
for (i = 0; (i < length) && (expected[i] || actual[i]); i++)
@@ -1026,55 +1006,76 @@
}
}
if (Unity.CurrentTestFailed)
{
- UnityTestResultsFailBegin(lineNumber);
- UnityPrintExpectedAndActualStringsLen(expected, actual, length);
- UnityAddMsgIfSpecified(msg);
- UNITY_FAIL_AND_BAIL;
+ UnityTestResultsFailBegin(lineNumber);
+ UnityPrintExpectedAndActualStringsLen(expected, actual, length);
+ UnityAddMsgIfSpecified(msg);
+ UNITY_FAIL_AND_BAIL;
}
}
-
/*-----------------------------------------------*/
-void UnityAssertEqualStringArray( const char** expected,
- const char** actual,
- const UNITY_UINT32 num_elements,
- const char* msg,
- const UNITY_LINE_TYPE lineNumber)
+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, j = 0;
+ UNITY_UINT32 i = 0;
+ UNITY_UINT32 j = 0;
+ const char* exp = NULL;
+ const char* act = NULL;
- UNITY_SKIP_EXECUTION;
+ RETURN_IF_FAIL_OR_IGNORE;
/* if no elements, it's an error */
if (num_elements == 0)
{
UnityPrintPointlessAndBail();
}
- if (UnityCheckArraysForNull((UNITY_INTERNAL_PTR)expected, (UNITY_INTERNAL_PTR)actual, lineNumber, msg) == 1)
- return;
+ if ((const void*)expected == (const void*)actual)
+ {
+ return; /* Both are NULL or same pointer */
+ }
+ if (UnityIsOneArrayNull((UNITY_INTERNAL_PTR)expected, (UNITY_INTERNAL_PTR)actual, lineNumber, msg))
+ {
+ UNITY_FAIL_AND_BAIL;
+ }
+
+ if (flags != UNITY_ARRAY_TO_ARRAY)
+ {
+ exp = (const char*)expected;
+ }
+
do
{
+ act = actual[j];
+ if (flags == UNITY_ARRAY_TO_ARRAY)
+ {
+ exp = ((const char* const*)expected)[j];
+ }
+
/* if both pointers not null compare the strings */
- if (expected[j] && actual[j])
+ if (exp && act)
{
- for (i = 0; expected[j][i] || actual[j][i]; i++)
+ for (i = 0; exp[i] || act[i]; i++)
{
- if (expected[j][i] != actual[j][i])
+ if (exp[i] != act[i])
{
Unity.CurrentTestFailed = 1;
break;
}
}
}
else
{ /* handle case of one pointers being null (if both null, test should pass) */
- if (expected[j] != actual[j])
+ if (exp != act)
{
Unity.CurrentTestFailed = 1;
}
}
@@ -1084,39 +1085,41 @@
if (num_elements > 1)
{
UnityPrint(UnityStrElement);
UnityPrintNumberUnsigned(j);
}
- UnityPrintExpectedAndActualStrings((const char*)(expected[j]), (const char*)(actual[j]));
+ UnityPrintExpectedAndActualStrings(exp, 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)
+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;
- UNITY_SKIP_EXECUTION;
+ RETURN_IF_FAIL_OR_IGNORE;
if ((elements == 0) || (length == 0))
{
UnityPrintPointlessAndBail();
}
- if (UnityCheckArraysForNull((UNITY_INTERNAL_PTR)expected, (UNITY_INTERNAL_PTR)actual, lineNumber, msg) == 1)
- return;
+ if (expected == actual) return; /* Both are NULL or same pointer */
+ if (UnityIsOneArrayNull(expected, actual, lineNumber, msg))
+ UNITY_FAIL_AND_BAIL;
while (elements--)
{
bytes = length;
while (bytes--)
@@ -1137,26 +1140,87 @@
UnityPrint(UnityStrWas);
UnityPrintNumberByStyle(*ptr_act, UNITY_DISPLAY_STYLE_HEX8);
UnityAddMsgIfSpecified(msg);
UNITY_FAIL_AND_BAIL;
}
- ptr_exp = (UNITY_INTERNAL_PTR)((UNITY_PTR)ptr_exp + 1);
- ptr_act = (UNITY_INTERNAL_PTR)((UNITY_PTR)ptr_act + 1);
+ 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: /* 4 bytes */
+ 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
+
/*-----------------------------------------------
* Control Functions
*-----------------------------------------------*/
void UnityFail(const char* msg, const UNITY_LINE_TYPE line)
{
- UNITY_SKIP_EXECUTION;
+ RETURN_IF_FAIL_OR_IGNORE;
UnityTestResultsBegin(Unity.TestFile, line);
- UnityPrintFail();
+ UnityPrint(UnityStrFail);
if (msg != NULL)
{
UNITY_OUTPUT_CHAR(':');
#ifndef UNITY_EXCLUDE_DETAILS
@@ -1183,33 +1247,34 @@
}
/*-----------------------------------------------*/
void UnityIgnore(const char* msg, const UNITY_LINE_TYPE line)
{
- UNITY_SKIP_EXECUTION;
+ RETURN_IF_FAIL_OR_IGNORE;
UnityTestResultsBegin(Unity.TestFile, line);
UnityPrint(UnityStrIgnore);
if (msg != NULL)
{
- UNITY_OUTPUT_CHAR(':');
- UNITY_OUTPUT_CHAR(' ');
- UnityPrint(msg);
+ UNITY_OUTPUT_CHAR(':');
+ UNITY_OUTPUT_CHAR(' ');
+ UnityPrint(msg);
}
UNITY_IGNORE_AND_BAIL;
}
/*-----------------------------------------------*/
#if defined(UNITY_WEAK_ATTRIBUTE)
- UNITY_WEAK_ATTRIBUTE void setUp(void) { }
- UNITY_WEAK_ATTRIBUTE 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) { }
+ #pragma weak setUp
+ void setUp(void) { }
+ #pragma weak tearDown
+ void tearDown(void) { }
#endif
+
/*-----------------------------------------------*/
void UnityDefaultTestRun(UnityTestFunction Func, const char* FuncName, const int FuncLineNum)
{
Unity.CurrentTestName = FuncName;
Unity.CurrentTestLineNumber = (UNITY_LINE_TYPE)FuncLineNum;
@@ -1218,11 +1283,11 @@
if (TEST_PROTECT())
{
setUp();
Func();
}
- if (TEST_PROTECT() && !(Unity.CurrentTestIgnored))
+ if (TEST_PROTECT())
{
tearDown();
}
UnityConcludeTest();
}
@@ -1256,15 +1321,15 @@
UnityPrintNumber((UNITY_INT)(Unity.TestIgnores));
UnityPrint(UnityStrResultsIgnored);
UNITY_PRINT_EOL();
if (Unity.TestFailures == 0U)
{
- UnityPrintOk();
+ UnityPrint(UnityStrOk);
}
else
{
- UnityPrintFail();
+ UnityPrint(UnityStrFail);
#ifdef UNITY_DIFFERENTIATE_FINAL_FAIL
UNITY_OUTPUT_CHAR('E'); UNITY_OUTPUT_CHAR('D');
#endif
}
UNITY_PRINT_EOL();
@@ -1278,22 +1343,22 @@
*-----------------------------------------------*/
#ifdef UNITY_USE_COMMAND_LINE_ARGS
char* UnityOptionIncludeNamed = NULL;
char* UnityOptionExcludeNamed = NULL;
-int UnityVerbosity = 1;
+int UnityVerbosity = 1;
int UnityParseOptions(int argc, char** argv)
{
UnityOptionIncludeNamed = NULL;
UnityOptionExcludeNamed = NULL;
for (int i = 1; i < argc; i++)
{
if (argv[i][0] == '-')
{
- switch(argv[i][1])
+ switch (argv[i][1])
{
case 'l': /* list tests */
return -1;
case 'n': /* include tests with name including this string */
case 'f': /* an alias for -n */
@@ -1338,13 +1403,13 @@
return 0;
}
int IsStringInBiggerString(const char* longstring, const char* shortstring)
{
- char* lptr = (char*)longstring;
- char* sptr = (char*)shortstring;
- char* lnext = lptr;
+ const char* lptr = longstring;
+ const char* sptr = shortstring;
+ const char* lnext = lptr;
if (*sptr == '*')
return 1;
while (*lptr)
@@ -1372,11 +1437,11 @@
return 1;
}
/* Otherwise we start in the long pointer 1 character further and try again */
lptr = lnext;
- sptr = (char*)shortstring;
+ sptr = shortstring;
}
return 0;
}
int UnityStringArgumentMatches(const char* str)
@@ -1394,10 +1459,11 @@
ptr1++;
/* look for the start of the next partial */
ptr2 = ptr1;
ptrf = 0;
- do {
+ 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] == ',')))