Merge pull request #250 from jsalling/feature/optional-setjmp

Optional UNITY_EXCLUDE_SETJMP_H, different control flow
This commit is contained in:
Mark VanderVoord
2017-01-18 09:00:23 -05:00
committed by GitHub
4 changed files with 42 additions and 25 deletions

View File

@ -13,8 +13,8 @@ void UNITY_OUTPUT_CHAR(int);
#endif #endif
/* Helpful macros for us to use here in Assert functions */ /* Helpful macros for us to use here in Assert functions */
#define UNITY_FAIL_AND_BAIL { Unity.CurrentTestFailed = 1; longjmp(Unity.AbortFrame, 1); } #define UNITY_FAIL_AND_BAIL { Unity.CurrentTestFailed = 1; TEST_ABORT(); }
#define UNITY_IGNORE_AND_BAIL { Unity.CurrentTestIgnored = 1; longjmp(Unity.AbortFrame, 1); } #define UNITY_IGNORE_AND_BAIL { Unity.CurrentTestIgnored = 1; TEST_ABORT(); }
#define RETURN_IF_FAIL_OR_IGNORE if (Unity.CurrentTestFailed || Unity.CurrentTestIgnored) return #define RETURN_IF_FAIL_OR_IGNORE if (Unity.CurrentTestFailed || Unity.CurrentTestIgnored) return
struct UNITY_STORAGE_T Unity; struct UNITY_STORAGE_T Unity;
@ -480,32 +480,32 @@ static void UnityPrintExpectedAndActualStringsLen(const char* expected, const ch
* Assertion & Control Helpers * 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 == actual) return 0; /* Both are NULL or same pointer */
if ((expected == NULL) && (actual == NULL))
return 1;
/* throw error if just expected is NULL */ /* print and return true if just expected is NULL */
if (expected == NULL) if (expected == NULL)
{ {
UnityTestResultsFailBegin(lineNumber); UnityTestResultsFailBegin(lineNumber);
UnityPrint(UnityStrNullPointerForExpected); UnityPrint(UnityStrNullPointerForExpected);
UnityAddMsgIfSpecified(msg); 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) if (actual == NULL)
{ {
UnityTestResultsFailBegin(lineNumber); UnityTestResultsFailBegin(lineNumber);
UnityPrint(UnityStrNullPointerForActual); UnityPrint(UnityStrNullPointerForActual);
UnityAddMsgIfSpecified(msg); UnityAddMsgIfSpecified(msg);
UNITY_FAIL_AND_BAIL; return 1;
} }
/* return false if neither is NULL */ return 0; /* return false if neither is NULL */
return 0;
} }
/*----------------------------------------------- /*-----------------------------------------------
@ -578,8 +578,9 @@ void UnityAssertEqualIntArray(UNITY_INTERNAL_PTR expected,
UnityPrintPointlessAndBail(); UnityPrintPointlessAndBail();
} }
if (UnityCheckArraysForNull((UNITY_INTERNAL_PTR)expected, (UNITY_INTERNAL_PTR)actual, lineNumber, msg) == 1) if (expected == actual) return; /* Both are NULL or same pointer */
return; if (UnityIsOneArrayNull(expected, actual, lineNumber, msg))
UNITY_FAIL_AND_BAIL;
while (elements--) while (elements--)
{ {
@ -685,8 +686,9 @@ void UnityAssertEqualFloatArray(UNITY_PTR_ATTRIBUTE const UNITY_FLOAT* expected,
UnityPrintPointlessAndBail(); UnityPrintPointlessAndBail();
} }
if (UnityCheckArraysForNull((UNITY_INTERNAL_PTR)expected, (UNITY_INTERNAL_PTR)actual, lineNumber, msg) == 1) if (expected == actual) return; /* Both are NULL or same pointer */
return; if (UnityIsOneArrayNull((UNITY_INTERNAL_PTR)expected, (UNITY_INTERNAL_PTR)actual, lineNumber, msg))
UNITY_FAIL_AND_BAIL;
while (elements--) while (elements--)
{ {
@ -810,8 +812,9 @@ void UnityAssertEqualDoubleArray(UNITY_PTR_ATTRIBUTE const UNITY_DOUBLE* expecte
UnityPrintPointlessAndBail(); UnityPrintPointlessAndBail();
} }
if (UnityCheckArraysForNull((UNITY_INTERNAL_PTR)expected, (UNITY_INTERNAL_PTR)actual, lineNumber, msg) == 1) if (expected == actual) return; /* Both are NULL or same pointer */
return; if (UnityIsOneArrayNull((UNITY_INTERNAL_PTR)expected, (UNITY_INTERNAL_PTR)actual, lineNumber, msg))
UNITY_FAIL_AND_BAIL;
while (elements--) while (elements--)
{ {
@ -1047,8 +1050,9 @@ void UnityAssertEqualStringArray( const char** expected,
UnityPrintPointlessAndBail(); UnityPrintPointlessAndBail();
} }
if (UnityCheckArraysForNull((UNITY_INTERNAL_PTR)expected, (UNITY_INTERNAL_PTR)actual, lineNumber, msg) == 1) if (expected == actual) return; /* Both are NULL or same pointer */
return; if (UnityIsOneArrayNull((UNITY_INTERNAL_PTR)expected, (UNITY_INTERNAL_PTR)actual, lineNumber, msg))
UNITY_FAIL_AND_BAIL;
do do
{ {
@ -1107,8 +1111,9 @@ void UnityAssertEqualMemory( UNITY_INTERNAL_PTR expected,
UnityPrintPointlessAndBail(); UnityPrintPointlessAndBail();
} }
if (UnityCheckArraysForNull((UNITY_INTERNAL_PTR)expected, (UNITY_INTERNAL_PTR)actual, lineNumber, msg) == 1) if (expected == actual) return; /* Both are NULL or same pointer */
return; if (UnityIsOneArrayNull(expected, actual, lineNumber, msg))
UNITY_FAIL_AND_BAIL;
while (elements--) while (elements--)
{ {

View File

@ -72,7 +72,7 @@ void tearDown(void);
/* It is not necessary for you to call PASS. A PASS condition is assumed if nothing fails. /* It is not necessary for you to call PASS. A PASS condition is assumed if nothing fails.
* This method allows you to abort a test immediately with a PASS state, ignoring the remainder of the test. */ * This method allows you to abort a test immediately with a PASS state, ignoring the remainder of the test. */
#define TEST_PASS() longjmp(Unity.AbortFrame, 1) #define TEST_PASS() TEST_ABORT()
/*------------------------------------------------------- /*-------------------------------------------------------
* Test Asserts (simple) * Test Asserts (simple)

View File

@ -11,7 +11,9 @@
#include "unity_config.h" #include "unity_config.h"
#endif #endif
#ifndef UNITY_EXCLUDE_SETJMP_H
#include <setjmp.h> #include <setjmp.h>
#endif
#ifndef UNITY_EXCLUDE_MATH_H #ifndef UNITY_EXCLUDE_MATH_H
#include <math.h> #include <math.h>
@ -374,7 +376,9 @@ struct UNITY_STORAGE_T
UNITY_COUNTER_TYPE TestIgnores; UNITY_COUNTER_TYPE TestIgnores;
UNITY_COUNTER_TYPE CurrentTestFailed; UNITY_COUNTER_TYPE CurrentTestFailed;
UNITY_COUNTER_TYPE CurrentTestIgnored; UNITY_COUNTER_TYPE CurrentTestIgnored;
#ifndef UNITY_EXCLUDE_SETJMP_H
jmp_buf AbortFrame; jmp_buf AbortFrame;
#endif
}; };
extern struct UNITY_STORAGE_T Unity; extern struct UNITY_STORAGE_T Unity;
@ -537,9 +541,13 @@ extern const char UnityStrErr64[];
* Test Running Macros * Test Running Macros
*-------------------------------------------------------*/ *-------------------------------------------------------*/
#ifndef UNITY_EXCLUDE_SETJMP_H
#define TEST_PROTECT() (setjmp(Unity.AbortFrame) == 0) #define TEST_PROTECT() (setjmp(Unity.AbortFrame) == 0)
#define TEST_ABORT() longjmp(Unity.AbortFrame, 1)
#define TEST_ABORT() {longjmp(Unity.AbortFrame, 1);} #else
#define TEST_PROTECT() 1
#define TEST_ABORT() return
#endif
/* This tricky series of macros gives us an optional line argument to treat it as RUN_TEST(func, num=__LINE__) */ /* This tricky series of macros gives us an optional line argument to treat it as RUN_TEST(func, num=__LINE__) */
#ifndef RUN_TEST #ifndef RUN_TEST

View File

@ -99,7 +99,9 @@ void testUnitySizeInitializationReminder(void)
UNITY_COUNTER_TYPE TestIgnores; UNITY_COUNTER_TYPE TestIgnores;
UNITY_COUNTER_TYPE CurrentTestFailed; UNITY_COUNTER_TYPE CurrentTestFailed;
UNITY_COUNTER_TYPE CurrentTestIgnored; UNITY_COUNTER_TYPE CurrentTestIgnored;
#ifndef UNITY_EXCLUDE_SETJMP_H
jmp_buf AbortFrame; jmp_buf AbortFrame;
#endif
} _Expected_Unity; } _Expected_Unity;
#else #else
struct { struct {
@ -113,7 +115,9 @@ void testUnitySizeInitializationReminder(void)
UNITY_COUNTER_TYPE TestIgnores; UNITY_COUNTER_TYPE TestIgnores;
UNITY_COUNTER_TYPE CurrentTestFailed; UNITY_COUNTER_TYPE CurrentTestFailed;
UNITY_COUNTER_TYPE CurrentTestIgnored; UNITY_COUNTER_TYPE CurrentTestIgnored;
#ifndef UNITY_EXCLUDE_SETJMP_H
jmp_buf AbortFrame; jmp_buf AbortFrame;
#endif
} _Expected_Unity; } _Expected_Unity;
#endif #endif