mirror of
https://github.com/ThrowTheSwitch/Unity.git
synced 2025-10-15 03:59:14 +08:00
Initial implementation
This commit is contained in:
106
src/unity.c
106
src/unity.c
@@ -61,14 +61,24 @@ const char UNITY_PROGMEM UnityStrErrShorthand[] = "Unity Shorth
|
||||
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
|
||||
/*-----------------------------------------------
|
||||
* Pretty Printers & Test Result Output Handlers
|
||||
*-----------------------------------------------*/
|
||||
@@ -574,6 +584,28 @@ static void UnityAddMsgIfSpecified(const char* msg)
|
||||
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(' ');
|
||||
UnityPrintNumberByStyle(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);
|
||||
@@ -585,6 +617,7 @@ static void UnityAddMsgIfSpecified(const char* msg)
|
||||
UnityPrint(Unity.CurrentDetail2);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
if (msg)
|
||||
{
|
||||
@@ -2127,32 +2160,7 @@ void UnityFail(const char* msg, const UNITY_LINE_TYPE line)
|
||||
|
||||
UnityTestResultsBegin(Unity.TestFile, line);
|
||||
UnityPrint(UnityStrFail);
|
||||
if (msg != NULL)
|
||||
{
|
||||
UNITY_OUTPUT_CHAR(':');
|
||||
|
||||
#ifdef UNITY_PRINT_TEST_CONTEXT
|
||||
UNITY_PRINT_TEST_CONTEXT();
|
||||
#endif
|
||||
#ifndef UNITY_EXCLUDE_DETAILS
|
||||
if (Unity.CurrentDetail1)
|
||||
{
|
||||
UnityPrint(UnityStrDetail1Name);
|
||||
UnityPrint(Unity.CurrentDetail1);
|
||||
if (Unity.CurrentDetail2)
|
||||
{
|
||||
UnityPrint(UnityStrDetail2Name);
|
||||
UnityPrint(Unity.CurrentDetail2);
|
||||
}
|
||||
UnityPrint(UnityStrSpacer);
|
||||
}
|
||||
#endif
|
||||
if (msg[0] != ' ')
|
||||
{
|
||||
UNITY_OUTPUT_CHAR(' ');
|
||||
}
|
||||
UnityPrint(msg);
|
||||
}
|
||||
UnityAddMsgIfSpecified(msg);
|
||||
|
||||
UNITY_FAIL_AND_BAIL;
|
||||
}
|
||||
@@ -2195,7 +2203,13 @@ void UnityDefaultTestRun(UnityTestFunction Func, const char* FuncName, const int
|
||||
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())
|
||||
{
|
||||
@@ -2263,6 +2277,46 @@ int UnityEnd(void)
|
||||
return (int)(Unity.TestFailures);
|
||||
}
|
||||
|
||||
/*-----------------------------------------------
|
||||
* Details Stack
|
||||
*-----------------------------------------------*/
|
||||
#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
|
||||
|
||||
/*-----------------------------------------------
|
||||
* Command Line Argument Support
|
||||
*-----------------------------------------------*/
|
||||
|
@@ -512,13 +512,30 @@ typedef enum
|
||||
UNITY_ARRAY_UNKNOWN
|
||||
} UNITY_FLAGS_T;
|
||||
|
||||
#ifndef UNITY_EXCLUDE_DETAILS
|
||||
#ifdef UNITY_DETAIL_STACK_SIZE
|
||||
#ifndef UNITY_DETAIL_LABEL_TYPE
|
||||
#define UNITY_DETAIL_LABEL_TYPE uint8_t
|
||||
#endif
|
||||
#ifndef UNITY_DETAIL_VALUE_TYPE
|
||||
#define UNITY_DETAIL_VALUE_TYPE UNITY_PTR_TO_INT
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
|
||||
struct UNITY_STORAGE_T
|
||||
{
|
||||
const char* TestFile;
|
||||
const char* CurrentTestName;
|
||||
#ifndef UNITY_EXCLUDE_DETAILS
|
||||
#ifdef UNITY_DETAIL_STACK_SIZE
|
||||
UNITY_DETAIL_LABEL_TYPE CurrentDetailStackLabels[UNITY_DETAIL_STACK_SIZE];
|
||||
UNITY_DETAIL_VALUE_TYPE CurrentDetailStackValues[UNITY_DETAIL_STACK_SIZE];
|
||||
UNITY_COUNTER_TYPE CurrentDetailStackSize;
|
||||
#else
|
||||
const char* CurrentDetail1;
|
||||
const char* CurrentDetail2;
|
||||
#endif
|
||||
#endif
|
||||
UNITY_LINE_TYPE CurrentTestLineNumber;
|
||||
UNITY_COUNTER_TYPE NumberOfTests;
|
||||
@@ -561,10 +578,6 @@ void UnityDefaultTestRun(UnityTestFunction Func, const char* FuncName, const int
|
||||
#define UNITY_SET_DETAIL(d1)
|
||||
#define UNITY_SET_DETAILS(d1,d2)
|
||||
#else
|
||||
#define UNITY_CLR_DETAILS() do { Unity.CurrentDetail1 = 0; Unity.CurrentDetail2 = 0; } while (0)
|
||||
#define UNITY_SET_DETAIL(d1) do { Unity.CurrentDetail1 = (d1); Unity.CurrentDetail2 = 0; } while (0)
|
||||
#define UNITY_SET_DETAILS(d1,d2) do { Unity.CurrentDetail1 = (d1); Unity.CurrentDetail2 = (d2); } while (0)
|
||||
|
||||
#ifndef UNITY_DETAIL1_NAME
|
||||
#define UNITY_DETAIL1_NAME "Function"
|
||||
#endif
|
||||
@@ -572,6 +585,47 @@ void UnityDefaultTestRun(UnityTestFunction Func, const char* FuncName, const int
|
||||
#ifndef UNITY_DETAIL2_NAME
|
||||
#define UNITY_DETAIL2_NAME "Argument"
|
||||
#endif
|
||||
|
||||
#ifdef UNITY_DETAIL_STACK_SIZE
|
||||
/* stack based implementation */
|
||||
#ifndef UNITY_DETAIL_LABEL_NAMES
|
||||
/* Note: If the label name string starts with '#', the second byte is interpreted as UNITY_DISPLAY_STYLE_T,
|
||||
* and the detail value will be printed as number (e.g. "#\x24Line" to output "Line <UINT32 value>").
|
||||
* Otherwise, the detail value must be a pointer to a string that is valid until it is pop'ed.
|
||||
*/
|
||||
#define UNITY_DETAIL_LABEL_NAMES {0, UNITY_DETAIL1_NAME, UNITY_DETAIL2_NAME}
|
||||
typedef enum
|
||||
{
|
||||
UNITY_DETAIL_NONE = 0,
|
||||
UNITY_DETAIL_D1 = 1,
|
||||
UNITY_DETAIL_D2 = 2
|
||||
} UNITY_DETAIL_LABEL_T;
|
||||
#endif
|
||||
void UnityPushDetail(UNITY_DETAIL_LABEL_TYPE label, UNITY_DETAIL_VALUE_TYPE value, const UNITY_LINE_TYPE line);
|
||||
void UnityPopDetail(UNITY_DETAIL_LABEL_TYPE label, UNITY_DETAIL_VALUE_TYPE value, const UNITY_LINE_TYPE line);
|
||||
|
||||
#define UNITY_CLR_DETAILS() do { \
|
||||
if(Unity.CurrentDetailStackSize && \
|
||||
Unity.CurrentDetailStackLabels[Unity.CurrentDetailStackSize - 1] == UNITY_DETAIL_D2) { \
|
||||
Unity.CurrentDetailStackLabels[--Unity.CurrentDetailStackSize] = UNITY_DETAIL_NONE;} \
|
||||
if(Unity.CurrentDetailStackSize && \
|
||||
Unity.CurrentDetailStackLabels[Unity.CurrentDetailStackSize - 1] == UNITY_DETAIL_D1) { \
|
||||
Unity.CurrentDetailStackLabels[--Unity.CurrentDetailStackSize] = UNITY_DETAIL_NONE;} \
|
||||
} while (0)
|
||||
#define UNITY_SET_DETAIL(d1) do { UNITY_CLR_DETAILS(); \
|
||||
UnityPushDetail(UNITY_DETAIL_D1, (UNITY_DETAIL_VALUE_TYPE)(d1), __LINE__); \
|
||||
} while (0)
|
||||
#define UNITY_SET_DETAILS(d1,d2) do { UNITY_CLR_DETAILS(); \
|
||||
UnityPushDetail(UNITY_DETAIL_D1, (UNITY_DETAIL_VALUE_TYPE)(d1), __LINE__); \
|
||||
UnityPushDetail(UNITY_DETAIL_D2, (UNITY_DETAIL_VALUE_TYPE)(d2), __LINE__); \
|
||||
} while (0)
|
||||
|
||||
#else
|
||||
/* just two hardcoded slots */
|
||||
#define UNITY_CLR_DETAILS() do { Unity.CurrentDetail1 = 0; Unity.CurrentDetail2 = 0; } while (0)
|
||||
#define UNITY_SET_DETAIL(d1) do { Unity.CurrentDetail1 = (d1); Unity.CurrentDetail2 = 0; } while (0)
|
||||
#define UNITY_SET_DETAILS(d1,d2) do { Unity.CurrentDetail1 = (d1); Unity.CurrentDetail2 = (d2); } while (0)
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef UNITY_PRINT_TEST_CONTEXT
|
||||
@@ -1179,5 +1233,13 @@ int UnityTestMatches(void);
|
||||
#define UNITY_TEST_ASSERT_DOUBLE_IS_NOT_DETERMINATE(actual, line, message) UnityAssertDoubleSpecial((UNITY_DOUBLE)(actual), (message), (UNITY_LINE_TYPE)(line), UNITY_FLOAT_IS_NOT_DET)
|
||||
#endif
|
||||
|
||||
#if !defined(UNITY_EXCLUDE_DETAILS) && defined(UNITY_DETAIL_STACK_SIZE)
|
||||
#define UNITY_DETAIL_PUSH(label, value) UnityPushDetail((UNITY_DETAIL_LABEL_TYPE)(label), (UNITY_DETAIL_VALUE_TYPE)(value), __LINE__)
|
||||
#define UNITY_DETAIL_POP(label, value) UnityPopDetail((UNITY_DETAIL_LABEL_TYPE)(label), (UNITY_DETAIL_VALUE_TYPE)(value), __LINE__)
|
||||
#else
|
||||
#define UNITY_DETAIL_PUSH(label, value) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDetailStack)
|
||||
#define UNITY_DETAIL_POP(label, value) UNITY_TEST_FAIL((UNITY_LINE_TYPE)(line), UnityStrErrDetailStack)
|
||||
#endif
|
||||
|
||||
/* End of UNITY_INTERNALS_H */
|
||||
#endif
|
||||
|
Reference in New Issue
Block a user