mirror of
https://github.com/ThrowTheSwitch/Unity.git
synced 2025-10-20 21:59:59 +08:00
Implement macro TEST_PRINTF: Works like TEST_MESSAGE, but with a format-string.
Depends on UnityPrintFormatted (define UNITY_INCLUDE_PRINT_FORMATTED). UnityPrintFormatted has been renamed to UnityPrintF due to changes below. API of UnityPrintFormatted has been changed (hence the rename), but end users (developers) can use the TEST_PRINTF as an almost-drop-in replacement TEST_PRINTF is compatible with the old UnityPrintFormatted API (see below). The behaviour of UnityPrintF has also been changed: - Now it prefixes the outout with test location information Output is marked as INFO. - It adds an EOL. Both behaviours adopted from other output functions.
This commit is contained in:
242
src/unity.c
242
src/unity.c
@@ -146,121 +146,6 @@ void UnityPrint(const char* string)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*-----------------------------------------------*/
|
|
||||||
#ifdef UNITY_INCLUDE_PRINT_FORMATTED
|
|
||||||
void UnityPrintFormatted(const char* format, ...)
|
|
||||||
{
|
|
||||||
const char* pch = format;
|
|
||||||
va_list va;
|
|
||||||
va_start(va, format);
|
|
||||||
|
|
||||||
if (pch != NULL)
|
|
||||||
{
|
|
||||||
while (*pch)
|
|
||||||
{
|
|
||||||
/* format identification character */
|
|
||||||
if (*pch == '%')
|
|
||||||
{
|
|
||||||
pch++;
|
|
||||||
|
|
||||||
if (pch != NULL)
|
|
||||||
{
|
|
||||||
switch (*pch)
|
|
||||||
{
|
|
||||||
case 'd':
|
|
||||||
case 'i':
|
|
||||||
{
|
|
||||||
const int number = va_arg(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':
|
|
||||||
{
|
|
||||||
const unsigned int number = va_arg(va, unsigned int);
|
|
||||||
UnityPrintNumberUnsigned((UNITY_UINT)number);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 'b':
|
|
||||||
{
|
|
||||||
const unsigned int number = va_arg(va, unsigned int);
|
|
||||||
const UNITY_UINT mask = (UNITY_UINT)0 - (UNITY_UINT)1;
|
|
||||||
UNITY_OUTPUT_CHAR('0');
|
|
||||||
UNITY_OUTPUT_CHAR('b');
|
|
||||||
UnityPrintMask(mask, (UNITY_UINT)number);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 'x':
|
|
||||||
case 'X':
|
|
||||||
case 'p':
|
|
||||||
{
|
|
||||||
const unsigned int number = va_arg(va, unsigned int);
|
|
||||||
UNITY_OUTPUT_CHAR('0');
|
|
||||||
UNITY_OUTPUT_CHAR('x');
|
|
||||||
UnityPrintNumberHex((UNITY_UINT)number, 8);
|
|
||||||
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:
|
|
||||||
{
|
|
||||||
/* print the unknown format character */
|
|
||||||
UNITY_OUTPUT_CHAR('%');
|
|
||||||
UnityPrintChar(pch);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#ifdef UNITY_OUTPUT_COLOR
|
|
||||||
/* print ANSI escape code */
|
|
||||||
else if ((*pch == 27) && (*(pch + 1) == '['))
|
|
||||||
{
|
|
||||||
pch += UnityPrintAnsiEscapeString(pch);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
else if (*pch == '\n')
|
|
||||||
{
|
|
||||||
UNITY_PRINT_EOL();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
UnityPrintChar(pch);
|
|
||||||
}
|
|
||||||
|
|
||||||
pch++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
va_end(va);
|
|
||||||
}
|
|
||||||
#endif /* ! UNITY_INCLUDE_PRINT_FORMATTED */
|
|
||||||
|
|
||||||
/*-----------------------------------------------*/
|
/*-----------------------------------------------*/
|
||||||
void UnityPrintLen(const char* string, const UNITY_UINT32 length)
|
void UnityPrintLen(const char* string, const UNITY_UINT32 length)
|
||||||
{
|
{
|
||||||
@@ -1731,6 +1616,133 @@ UNITY_INTERNAL_PTR UnityDoubleToPtr(const double num)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/*-----------------------------------------------
|
||||||
|
* printf helper function
|
||||||
|
*-----------------------------------------------*/
|
||||||
|
#ifdef UNITY_INCLUDE_PRINT_FORMATTED
|
||||||
|
static void UnityPrintFVA(const char* format, va_list va)
|
||||||
|
{
|
||||||
|
const char* pch = format;
|
||||||
|
if (pch != NULL)
|
||||||
|
{
|
||||||
|
while (*pch)
|
||||||
|
{
|
||||||
|
/* format identification character */
|
||||||
|
if (*pch == '%')
|
||||||
|
{
|
||||||
|
pch++;
|
||||||
|
|
||||||
|
if (pch != NULL)
|
||||||
|
{
|
||||||
|
switch (*pch)
|
||||||
|
{
|
||||||
|
case 'd':
|
||||||
|
case 'i':
|
||||||
|
{
|
||||||
|
const int number = va_arg(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':
|
||||||
|
{
|
||||||
|
const unsigned int number = va_arg(va, unsigned int);
|
||||||
|
UnityPrintNumberUnsigned((UNITY_UINT)number);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 'b':
|
||||||
|
{
|
||||||
|
const unsigned int number = va_arg(va, unsigned int);
|
||||||
|
const UNITY_UINT mask = (UNITY_UINT)0 - (UNITY_UINT)1;
|
||||||
|
UNITY_OUTPUT_CHAR('0');
|
||||||
|
UNITY_OUTPUT_CHAR('b');
|
||||||
|
UnityPrintMask(mask, (UNITY_UINT)number);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 'x':
|
||||||
|
case 'X':
|
||||||
|
case 'p':
|
||||||
|
{
|
||||||
|
const unsigned int number = va_arg(va, unsigned int);
|
||||||
|
UNITY_OUTPUT_CHAR('0');
|
||||||
|
UNITY_OUTPUT_CHAR('x');
|
||||||
|
UnityPrintNumberHex((UNITY_UINT)number, 8);
|
||||||
|
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:
|
||||||
|
{
|
||||||
|
/* print the unknown format character */
|
||||||
|
UNITY_OUTPUT_CHAR('%');
|
||||||
|
UnityPrintChar(pch);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#ifdef UNITY_OUTPUT_COLOR
|
||||||
|
/* print ANSI escape code */
|
||||||
|
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 /* ! UNITY_INCLUDE_PRINT_FORMATTED */
|
||||||
|
|
||||||
|
|
||||||
/*-----------------------------------------------
|
/*-----------------------------------------------
|
||||||
* Control Functions
|
* Control Functions
|
||||||
*-----------------------------------------------*/
|
*-----------------------------------------------*/
|
||||||
|
@@ -104,6 +104,9 @@ void verifyTest(void);
|
|||||||
#define TEST_IGNORE() UNITY_TEST_IGNORE(__LINE__, NULL)
|
#define TEST_IGNORE() UNITY_TEST_IGNORE(__LINE__, NULL)
|
||||||
#define TEST_MESSAGE(message) UnityMessage((message), __LINE__)
|
#define TEST_MESSAGE(message) UnityMessage((message), __LINE__)
|
||||||
#define TEST_ONLY()
|
#define TEST_ONLY()
|
||||||
|
#ifdef UNITY_INCLUDE_PRINT_FORMATTED
|
||||||
|
#define TEST_PRINTF(message, ...) UnityPrintF(__LINE__, (message), __VA_ARGS__)
|
||||||
|
#endif
|
||||||
|
|
||||||
/* 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. */
|
||||||
|
@@ -515,7 +515,7 @@ void UnityDefaultTestRun(UnityTestFunction Func, const char* FuncName, const int
|
|||||||
void UnityPrint(const char* string);
|
void UnityPrint(const char* string);
|
||||||
|
|
||||||
#ifdef UNITY_INCLUDE_PRINT_FORMATTED
|
#ifdef UNITY_INCLUDE_PRINT_FORMATTED
|
||||||
void UnityPrintFormatted(const char* format, ...);
|
void UnityPrintF(const UNITY_LINE_TYPE line, const char* format, ...);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void UnityPrintLen(const char* string, const UNITY_UINT32 length);
|
void UnityPrintLen(const char* string, const UNITY_UINT32 length);
|
||||||
|
Reference in New Issue
Block a user