19750e409Sopenharmony_ci/* ========================================================================= 29750e409Sopenharmony_ci Unity Project - A Test Framework for C 39750e409Sopenharmony_ci Copyright (c) 2007-14 Mike Karlesky, Mark VanderVoord, Greg Williams 49750e409Sopenharmony_ci [Released under MIT License. Please refer to license.txt for details] 59750e409Sopenharmony_ci============================================================================ */ 69750e409Sopenharmony_ci 79750e409Sopenharmony_ci#define UNITY_INCLUDE_SETUP_STUBS 89750e409Sopenharmony_ci#include "unity.h" 99750e409Sopenharmony_ci#include <stddef.h> 109750e409Sopenharmony_ci 119750e409Sopenharmony_ci/* If omitted from header, declare overrideable prototypes here so they're ready for use */ 129750e409Sopenharmony_ci#ifdef UNITY_OMIT_OUTPUT_CHAR_HEADER_DECLARATION 139750e409Sopenharmony_civoid UNITY_OUTPUT_CHAR(int); 149750e409Sopenharmony_ci#endif 159750e409Sopenharmony_ci 169750e409Sopenharmony_ci/* Helpful macros for us to use here in Assert functions */ 179750e409Sopenharmony_ci#define UNITY_FAIL_AND_BAIL { Unity.CurrentTestFailed = 1; TEST_ABORT(); } 189750e409Sopenharmony_ci#define UNITY_IGNORE_AND_BAIL { Unity.CurrentTestIgnored = 1; TEST_ABORT(); } 199750e409Sopenharmony_ci#define RETURN_IF_FAIL_OR_IGNORE if (Unity.CurrentTestFailed || Unity.CurrentTestIgnored) return 209750e409Sopenharmony_ci 219750e409Sopenharmony_cistruct UNITY_STORAGE_T Unity; 229750e409Sopenharmony_ci 239750e409Sopenharmony_ci#ifdef UNITY_OUTPUT_COLOR 249750e409Sopenharmony_cistatic const char UnityStrOk[] = "\033[42mOK\033[00m"; 259750e409Sopenharmony_cistatic const char UnityStrPass[] = "\033[42mPASS\033[00m"; 269750e409Sopenharmony_cistatic const char UnityStrFail[] = "\033[41mFAIL\033[00m"; 279750e409Sopenharmony_cistatic const char UnityStrIgnore[] = "\033[43mIGNORE\033[00m"; 289750e409Sopenharmony_ci#else 299750e409Sopenharmony_cistatic const char UnityStrOk[] = "OK"; 309750e409Sopenharmony_cistatic const char UnityStrPass[] = "PASS"; 319750e409Sopenharmony_cistatic const char UnityStrFail[] = "FAIL"; 329750e409Sopenharmony_cistatic const char UnityStrIgnore[] = "IGNORE"; 339750e409Sopenharmony_ci#endif 349750e409Sopenharmony_cistatic const char UnityStrNull[] = "NULL"; 359750e409Sopenharmony_cistatic const char UnityStrSpacer[] = ". "; 369750e409Sopenharmony_cistatic const char UnityStrExpected[] = " Expected "; 379750e409Sopenharmony_cistatic const char UnityStrWas[] = " Was "; 389750e409Sopenharmony_cistatic const char UnityStrGt[] = " to be greater than "; 399750e409Sopenharmony_cistatic const char UnityStrLt[] = " to be less than "; 409750e409Sopenharmony_cistatic const char UnityStrOrEqual[] = "or equal to "; 419750e409Sopenharmony_cistatic const char UnityStrElement[] = " Element "; 429750e409Sopenharmony_cistatic const char UnityStrByte[] = " Byte "; 439750e409Sopenharmony_cistatic const char UnityStrMemory[] = " Memory Mismatch."; 449750e409Sopenharmony_cistatic const char UnityStrDelta[] = " Values Not Within Delta "; 459750e409Sopenharmony_cistatic const char UnityStrPointless[] = " You Asked Me To Compare Nothing, Which Was Pointless."; 469750e409Sopenharmony_cistatic const char UnityStrNullPointerForExpected[] = " Expected pointer to be NULL"; 479750e409Sopenharmony_cistatic const char UnityStrNullPointerForActual[] = " Actual pointer was NULL"; 489750e409Sopenharmony_ci#ifndef UNITY_EXCLUDE_FLOAT 499750e409Sopenharmony_cistatic const char UnityStrNot[] = "Not "; 509750e409Sopenharmony_cistatic const char UnityStrInf[] = "Infinity"; 519750e409Sopenharmony_cistatic const char UnityStrNegInf[] = "Negative Infinity"; 529750e409Sopenharmony_cistatic const char UnityStrNaN[] = "NaN"; 539750e409Sopenharmony_cistatic const char UnityStrDet[] = "Determinate"; 549750e409Sopenharmony_cistatic const char UnityStrInvalidFloatTrait[] = "Invalid Float Trait"; 559750e409Sopenharmony_ci#endif 569750e409Sopenharmony_ciconst char UnityStrErrFloat[] = "Unity Floating Point Disabled"; 579750e409Sopenharmony_ciconst char UnityStrErrDouble[] = "Unity Double Precision Disabled"; 589750e409Sopenharmony_ciconst char UnityStrErr64[] = "Unity 64-bit Support Disabled"; 599750e409Sopenharmony_cistatic const char UnityStrBreaker[] = "-----------------------"; 609750e409Sopenharmony_cistatic const char UnityStrResultsTests[] = " Tests "; 619750e409Sopenharmony_cistatic const char UnityStrResultsFailures[] = " Failures "; 629750e409Sopenharmony_cistatic const char UnityStrResultsIgnored[] = " Ignored "; 639750e409Sopenharmony_cistatic const char UnityStrDetail1Name[] = UNITY_DETAIL1_NAME " "; 649750e409Sopenharmony_cistatic const char UnityStrDetail2Name[] = " " UNITY_DETAIL2_NAME " "; 659750e409Sopenharmony_ci 669750e409Sopenharmony_ci/*----------------------------------------------- 679750e409Sopenharmony_ci * Pretty Printers & Test Result Output Handlers 689750e409Sopenharmony_ci *-----------------------------------------------*/ 699750e409Sopenharmony_ci 709750e409Sopenharmony_civoid UnityPrint(const char* string) 719750e409Sopenharmony_ci{ 729750e409Sopenharmony_ci const char* pch = string; 739750e409Sopenharmony_ci 749750e409Sopenharmony_ci if (pch != NULL) 759750e409Sopenharmony_ci { 769750e409Sopenharmony_ci while (*pch) 779750e409Sopenharmony_ci { 789750e409Sopenharmony_ci /* printable characters plus CR & LF are printed */ 799750e409Sopenharmony_ci if ((*pch <= 126) && (*pch >= 32)) 809750e409Sopenharmony_ci { 819750e409Sopenharmony_ci UNITY_OUTPUT_CHAR(*pch); 829750e409Sopenharmony_ci } 839750e409Sopenharmony_ci /* write escaped carriage returns */ 849750e409Sopenharmony_ci else if (*pch == 13) 859750e409Sopenharmony_ci { 869750e409Sopenharmony_ci UNITY_OUTPUT_CHAR('\\'); 879750e409Sopenharmony_ci UNITY_OUTPUT_CHAR('r'); 889750e409Sopenharmony_ci } 899750e409Sopenharmony_ci /* write escaped line feeds */ 909750e409Sopenharmony_ci else if (*pch == 10) 919750e409Sopenharmony_ci { 929750e409Sopenharmony_ci UNITY_OUTPUT_CHAR('\\'); 939750e409Sopenharmony_ci UNITY_OUTPUT_CHAR('n'); 949750e409Sopenharmony_ci } 959750e409Sopenharmony_ci#ifdef UNITY_OUTPUT_COLOR 969750e409Sopenharmony_ci /* print ANSI escape code */ 979750e409Sopenharmony_ci else if (*pch == 27 && *(pch + 1) == '[') 989750e409Sopenharmony_ci { 999750e409Sopenharmony_ci while (*pch && *pch != 'm') 1009750e409Sopenharmony_ci { 1019750e409Sopenharmony_ci UNITY_OUTPUT_CHAR(*pch); 1029750e409Sopenharmony_ci pch++; 1039750e409Sopenharmony_ci } 1049750e409Sopenharmony_ci UNITY_OUTPUT_CHAR('m'); 1059750e409Sopenharmony_ci } 1069750e409Sopenharmony_ci#endif 1079750e409Sopenharmony_ci /* unprintable characters are shown as codes */ 1089750e409Sopenharmony_ci else 1099750e409Sopenharmony_ci { 1109750e409Sopenharmony_ci UNITY_OUTPUT_CHAR('\\'); 1119750e409Sopenharmony_ci UNITY_OUTPUT_CHAR('x'); 1129750e409Sopenharmony_ci UnityPrintNumberHex((UNITY_UINT)*pch, 2); 1139750e409Sopenharmony_ci } 1149750e409Sopenharmony_ci pch++; 1159750e409Sopenharmony_ci } 1169750e409Sopenharmony_ci } 1179750e409Sopenharmony_ci} 1189750e409Sopenharmony_ci 1199750e409Sopenharmony_civoid UnityPrintLen(const char* string, const UNITY_UINT32 length) 1209750e409Sopenharmony_ci{ 1219750e409Sopenharmony_ci const char* pch = string; 1229750e409Sopenharmony_ci 1239750e409Sopenharmony_ci if (pch != NULL) 1249750e409Sopenharmony_ci { 1259750e409Sopenharmony_ci while (*pch && (UNITY_UINT32)(pch - string) < length) 1269750e409Sopenharmony_ci { 1279750e409Sopenharmony_ci /* printable characters plus CR & LF are printed */ 1289750e409Sopenharmony_ci if ((*pch <= 126) && (*pch >= 32)) 1299750e409Sopenharmony_ci { 1309750e409Sopenharmony_ci UNITY_OUTPUT_CHAR(*pch); 1319750e409Sopenharmony_ci } 1329750e409Sopenharmony_ci /* write escaped carriage returns */ 1339750e409Sopenharmony_ci else if (*pch == 13) 1349750e409Sopenharmony_ci { 1359750e409Sopenharmony_ci UNITY_OUTPUT_CHAR('\\'); 1369750e409Sopenharmony_ci UNITY_OUTPUT_CHAR('r'); 1379750e409Sopenharmony_ci } 1389750e409Sopenharmony_ci /* write escaped line feeds */ 1399750e409Sopenharmony_ci else if (*pch == 10) 1409750e409Sopenharmony_ci { 1419750e409Sopenharmony_ci UNITY_OUTPUT_CHAR('\\'); 1429750e409Sopenharmony_ci UNITY_OUTPUT_CHAR('n'); 1439750e409Sopenharmony_ci } 1449750e409Sopenharmony_ci /* unprintable characters are shown as codes */ 1459750e409Sopenharmony_ci else 1469750e409Sopenharmony_ci { 1479750e409Sopenharmony_ci UNITY_OUTPUT_CHAR('\\'); 1489750e409Sopenharmony_ci UNITY_OUTPUT_CHAR('x'); 1499750e409Sopenharmony_ci UnityPrintNumberHex((UNITY_UINT)*pch, 2); 1509750e409Sopenharmony_ci } 1519750e409Sopenharmony_ci pch++; 1529750e409Sopenharmony_ci } 1539750e409Sopenharmony_ci } 1549750e409Sopenharmony_ci} 1559750e409Sopenharmony_ci 1569750e409Sopenharmony_ci/*-----------------------------------------------*/ 1579750e409Sopenharmony_civoid UnityPrintNumberByStyle(const UNITY_INT number, const UNITY_DISPLAY_STYLE_T style) 1589750e409Sopenharmony_ci{ 1599750e409Sopenharmony_ci if ((style & UNITY_DISPLAY_RANGE_INT) == UNITY_DISPLAY_RANGE_INT) 1609750e409Sopenharmony_ci { 1619750e409Sopenharmony_ci UnityPrintNumber(number); 1629750e409Sopenharmony_ci } 1639750e409Sopenharmony_ci else if ((style & UNITY_DISPLAY_RANGE_UINT) == UNITY_DISPLAY_RANGE_UINT) 1649750e409Sopenharmony_ci { 1659750e409Sopenharmony_ci UnityPrintNumberUnsigned((UNITY_UINT)number); 1669750e409Sopenharmony_ci } 1679750e409Sopenharmony_ci else 1689750e409Sopenharmony_ci { 1699750e409Sopenharmony_ci UNITY_OUTPUT_CHAR('0'); 1709750e409Sopenharmony_ci UNITY_OUTPUT_CHAR('x'); 1719750e409Sopenharmony_ci UnityPrintNumberHex((UNITY_UINT)number, (char)((style & 0xF) * 2)); 1729750e409Sopenharmony_ci } 1739750e409Sopenharmony_ci} 1749750e409Sopenharmony_ci 1759750e409Sopenharmony_ci/*-----------------------------------------------*/ 1769750e409Sopenharmony_civoid UnityPrintNumber(const UNITY_INT number_to_print) 1779750e409Sopenharmony_ci{ 1789750e409Sopenharmony_ci UNITY_UINT number = (UNITY_UINT)number_to_print; 1799750e409Sopenharmony_ci 1809750e409Sopenharmony_ci if (number_to_print < 0) 1819750e409Sopenharmony_ci { 1829750e409Sopenharmony_ci /* A negative number, including MIN negative */ 1839750e409Sopenharmony_ci UNITY_OUTPUT_CHAR('-'); 1849750e409Sopenharmony_ci number = (UNITY_UINT)(-number_to_print); 1859750e409Sopenharmony_ci } 1869750e409Sopenharmony_ci UnityPrintNumberUnsigned(number); 1879750e409Sopenharmony_ci} 1889750e409Sopenharmony_ci 1899750e409Sopenharmony_ci/*----------------------------------------------- 1909750e409Sopenharmony_ci * basically do an itoa using as little ram as possible */ 1919750e409Sopenharmony_civoid UnityPrintNumberUnsigned(const UNITY_UINT number) 1929750e409Sopenharmony_ci{ 1939750e409Sopenharmony_ci UNITY_UINT divisor = 1; 1949750e409Sopenharmony_ci 1959750e409Sopenharmony_ci /* figure out initial divisor */ 1969750e409Sopenharmony_ci while (number / divisor > 9) 1979750e409Sopenharmony_ci { 1989750e409Sopenharmony_ci divisor *= 10; 1999750e409Sopenharmony_ci } 2009750e409Sopenharmony_ci 2019750e409Sopenharmony_ci /* now mod and print, then divide divisor */ 2029750e409Sopenharmony_ci do 2039750e409Sopenharmony_ci { 2049750e409Sopenharmony_ci UNITY_OUTPUT_CHAR((char)('0' + (number / divisor % 10))); 2059750e409Sopenharmony_ci divisor /= 10; 2069750e409Sopenharmony_ci } while (divisor > 0); 2079750e409Sopenharmony_ci} 2089750e409Sopenharmony_ci 2099750e409Sopenharmony_ci/*-----------------------------------------------*/ 2109750e409Sopenharmony_civoid UnityPrintNumberHex(const UNITY_UINT number, const char nibbles_to_print) 2119750e409Sopenharmony_ci{ 2129750e409Sopenharmony_ci int nibble; 2139750e409Sopenharmony_ci char nibbles = nibbles_to_print; 2149750e409Sopenharmony_ci if ((unsigned)nibbles > (2 * sizeof(number))) 2159750e409Sopenharmony_ci nibbles = 2 * sizeof(number); 2169750e409Sopenharmony_ci 2179750e409Sopenharmony_ci while (nibbles > 0) 2189750e409Sopenharmony_ci { 2199750e409Sopenharmony_ci nibbles--; 2209750e409Sopenharmony_ci nibble = (int)(number >> (nibbles * 4)) & 0x0F; 2219750e409Sopenharmony_ci if (nibble <= 9) 2229750e409Sopenharmony_ci { 2239750e409Sopenharmony_ci UNITY_OUTPUT_CHAR((char)('0' + nibble)); 2249750e409Sopenharmony_ci } 2259750e409Sopenharmony_ci else 2269750e409Sopenharmony_ci { 2279750e409Sopenharmony_ci UNITY_OUTPUT_CHAR((char)('A' - 10 + nibble)); 2289750e409Sopenharmony_ci } 2299750e409Sopenharmony_ci } 2309750e409Sopenharmony_ci} 2319750e409Sopenharmony_ci 2329750e409Sopenharmony_ci/*-----------------------------------------------*/ 2339750e409Sopenharmony_civoid UnityPrintMask(const UNITY_UINT mask, const UNITY_UINT number) 2349750e409Sopenharmony_ci{ 2359750e409Sopenharmony_ci UNITY_UINT current_bit = (UNITY_UINT)1 << (UNITY_INT_WIDTH - 1); 2369750e409Sopenharmony_ci UNITY_INT32 i; 2379750e409Sopenharmony_ci 2389750e409Sopenharmony_ci for (i = 0; i < UNITY_INT_WIDTH; i++) 2399750e409Sopenharmony_ci { 2409750e409Sopenharmony_ci if (current_bit & mask) 2419750e409Sopenharmony_ci { 2429750e409Sopenharmony_ci if (current_bit & number) 2439750e409Sopenharmony_ci { 2449750e409Sopenharmony_ci UNITY_OUTPUT_CHAR('1'); 2459750e409Sopenharmony_ci } 2469750e409Sopenharmony_ci else 2479750e409Sopenharmony_ci { 2489750e409Sopenharmony_ci UNITY_OUTPUT_CHAR('0'); 2499750e409Sopenharmony_ci } 2509750e409Sopenharmony_ci } 2519750e409Sopenharmony_ci else 2529750e409Sopenharmony_ci { 2539750e409Sopenharmony_ci UNITY_OUTPUT_CHAR('X'); 2549750e409Sopenharmony_ci } 2559750e409Sopenharmony_ci current_bit = current_bit >> 1; 2569750e409Sopenharmony_ci } 2579750e409Sopenharmony_ci} 2589750e409Sopenharmony_ci 2599750e409Sopenharmony_ci/*-----------------------------------------------*/ 2609750e409Sopenharmony_ci#ifndef UNITY_EXCLUDE_FLOAT_PRINT 2619750e409Sopenharmony_ci/* This function prints a floating-point value in a format similar to 2629750e409Sopenharmony_ci * printf("%.6g"). It can work with either single- or double-precision, 2639750e409Sopenharmony_ci * but for simplicity, it prints only 6 significant digits in either case. 2649750e409Sopenharmony_ci * Printing more than 6 digits accurately is hard (at least in the single- 2659750e409Sopenharmony_ci * precision case) and isn't attempted here. */ 2669750e409Sopenharmony_civoid UnityPrintFloat(const UNITY_DOUBLE input_number) 2679750e409Sopenharmony_ci{ 2689750e409Sopenharmony_ci UNITY_DOUBLE number = input_number; 2699750e409Sopenharmony_ci 2709750e409Sopenharmony_ci /* print minus sign (including for negative zero) */ 2719750e409Sopenharmony_ci if (number < (double)0.0f || (number == (double)0.0f && (double)1.0f / number < (double)0.0f)) 2729750e409Sopenharmony_ci { 2739750e409Sopenharmony_ci UNITY_OUTPUT_CHAR('-'); 2749750e409Sopenharmony_ci number = -number; 2759750e409Sopenharmony_ci } 2769750e409Sopenharmony_ci 2779750e409Sopenharmony_ci /* handle zero, NaN, and +/- infinity */ 2789750e409Sopenharmony_ci if (number == (double)0.0f) UnityPrint("0"); 2799750e409Sopenharmony_ci else if (isnan(number)) UnityPrint("nan"); 2809750e409Sopenharmony_ci else if (isinf(number)) UnityPrint("inf"); 2819750e409Sopenharmony_ci else 2829750e409Sopenharmony_ci { 2839750e409Sopenharmony_ci int exponent = 0; 2849750e409Sopenharmony_ci int decimals, digits; 2859750e409Sopenharmony_ci UNITY_INT32 n; 2869750e409Sopenharmony_ci char buf[16]; 2879750e409Sopenharmony_ci 2889750e409Sopenharmony_ci /* scale up or down by powers of 10 */ 2899750e409Sopenharmony_ci while (number < (double)(100000.0f / 1e6f)) { number *= (double)1e6f; exponent -= 6; } 2909750e409Sopenharmony_ci while (number < (double)100000.0f) { number *= (double)10.0f; exponent--; } 2919750e409Sopenharmony_ci while (number > (double)(1000000.0f * 1e6f)) { number /= (double)1e6f; exponent += 6; } 2929750e409Sopenharmony_ci while (number > (double)1000000.0f) { number /= (double)10.0f; exponent++; } 2939750e409Sopenharmony_ci 2949750e409Sopenharmony_ci /* round to nearest integer */ 2959750e409Sopenharmony_ci n = ((UNITY_INT32)(number + number) + 1) / 2; 2969750e409Sopenharmony_ci if (n > 999999) 2979750e409Sopenharmony_ci { 2989750e409Sopenharmony_ci n = 100000; 2999750e409Sopenharmony_ci exponent++; 3009750e409Sopenharmony_ci } 3019750e409Sopenharmony_ci 3029750e409Sopenharmony_ci /* determine where to place decimal point */ 3039750e409Sopenharmony_ci decimals = (exponent <= 0 && exponent >= -9) ? -exponent : 5; 3049750e409Sopenharmony_ci exponent += decimals; 3059750e409Sopenharmony_ci 3069750e409Sopenharmony_ci /* truncate trailing zeroes after decimal point */ 3079750e409Sopenharmony_ci while (decimals > 0 && n % 10 == 0) 3089750e409Sopenharmony_ci { 3099750e409Sopenharmony_ci n /= 10; 3109750e409Sopenharmony_ci decimals--; 3119750e409Sopenharmony_ci } 3129750e409Sopenharmony_ci 3139750e409Sopenharmony_ci /* build up buffer in reverse order */ 3149750e409Sopenharmony_ci digits = 0; 3159750e409Sopenharmony_ci while (n != 0 || digits < decimals + 1) 3169750e409Sopenharmony_ci { 3179750e409Sopenharmony_ci buf[digits++] = (char)('0' + n % 10); 3189750e409Sopenharmony_ci n /= 10; 3199750e409Sopenharmony_ci } 3209750e409Sopenharmony_ci while (digits > 0) 3219750e409Sopenharmony_ci { 3229750e409Sopenharmony_ci if(digits == decimals) UNITY_OUTPUT_CHAR('.'); 3239750e409Sopenharmony_ci UNITY_OUTPUT_CHAR(buf[--digits]); 3249750e409Sopenharmony_ci } 3259750e409Sopenharmony_ci 3269750e409Sopenharmony_ci /* print exponent if needed */ 3279750e409Sopenharmony_ci if (exponent != 0) 3289750e409Sopenharmony_ci { 3299750e409Sopenharmony_ci UNITY_OUTPUT_CHAR('e'); 3309750e409Sopenharmony_ci 3319750e409Sopenharmony_ci if(exponent < 0) 3329750e409Sopenharmony_ci { 3339750e409Sopenharmony_ci UNITY_OUTPUT_CHAR('-'); 3349750e409Sopenharmony_ci exponent = -exponent; 3359750e409Sopenharmony_ci } 3369750e409Sopenharmony_ci else 3379750e409Sopenharmony_ci { 3389750e409Sopenharmony_ci UNITY_OUTPUT_CHAR('+'); 3399750e409Sopenharmony_ci } 3409750e409Sopenharmony_ci 3419750e409Sopenharmony_ci digits = 0; 3429750e409Sopenharmony_ci while (exponent != 0 || digits < 2) 3439750e409Sopenharmony_ci { 3449750e409Sopenharmony_ci buf[digits++] = (char)('0' + exponent % 10); 3459750e409Sopenharmony_ci exponent /= 10; 3469750e409Sopenharmony_ci } 3479750e409Sopenharmony_ci while (digits > 0) 3489750e409Sopenharmony_ci { 3499750e409Sopenharmony_ci UNITY_OUTPUT_CHAR(buf[--digits]); 3509750e409Sopenharmony_ci } 3519750e409Sopenharmony_ci } 3529750e409Sopenharmony_ci } 3539750e409Sopenharmony_ci} 3549750e409Sopenharmony_ci#endif /* ! UNITY_EXCLUDE_FLOAT_PRINT */ 3559750e409Sopenharmony_ci 3569750e409Sopenharmony_ci/*-----------------------------------------------*/ 3579750e409Sopenharmony_cistatic void UnityTestResultsBegin(const char* file, const UNITY_LINE_TYPE line) 3589750e409Sopenharmony_ci{ 3599750e409Sopenharmony_ci UnityPrint(file); 3609750e409Sopenharmony_ci UNITY_OUTPUT_CHAR(':'); 3619750e409Sopenharmony_ci UnityPrintNumber((UNITY_INT)line); 3629750e409Sopenharmony_ci UNITY_OUTPUT_CHAR(':'); 3639750e409Sopenharmony_ci UnityPrint(Unity.CurrentTestName); 3649750e409Sopenharmony_ci UNITY_OUTPUT_CHAR(':'); 3659750e409Sopenharmony_ci} 3669750e409Sopenharmony_ci 3679750e409Sopenharmony_ci/*-----------------------------------------------*/ 3689750e409Sopenharmony_cistatic void UnityTestResultsFailBegin(const UNITY_LINE_TYPE line) 3699750e409Sopenharmony_ci{ 3709750e409Sopenharmony_ci UnityTestResultsBegin(Unity.TestFile, line); 3719750e409Sopenharmony_ci UnityPrint(UnityStrFail); 3729750e409Sopenharmony_ci UNITY_OUTPUT_CHAR(':'); 3739750e409Sopenharmony_ci} 3749750e409Sopenharmony_ci 3759750e409Sopenharmony_ci/*-----------------------------------------------*/ 3769750e409Sopenharmony_civoid UnityConcludeTest(void) 3779750e409Sopenharmony_ci{ 3789750e409Sopenharmony_ci if (Unity.CurrentTestIgnored) 3799750e409Sopenharmony_ci { 3809750e409Sopenharmony_ci Unity.TestIgnores++; 3819750e409Sopenharmony_ci } 3829750e409Sopenharmony_ci else if (!Unity.CurrentTestFailed) 3839750e409Sopenharmony_ci { 3849750e409Sopenharmony_ci UnityTestResultsBegin(Unity.TestFile, Unity.CurrentTestLineNumber); 3859750e409Sopenharmony_ci UnityPrint(UnityStrPass); 3869750e409Sopenharmony_ci } 3879750e409Sopenharmony_ci else 3889750e409Sopenharmony_ci { 3899750e409Sopenharmony_ci Unity.TestFailures++; 3909750e409Sopenharmony_ci } 3919750e409Sopenharmony_ci 3929750e409Sopenharmony_ci Unity.CurrentTestFailed = 0; 3939750e409Sopenharmony_ci Unity.CurrentTestIgnored = 0; 3949750e409Sopenharmony_ci UNITY_PRINT_EOL(); 3959750e409Sopenharmony_ci UNITY_FLUSH_CALL(); 3969750e409Sopenharmony_ci} 3979750e409Sopenharmony_ci 3989750e409Sopenharmony_ci/*-----------------------------------------------*/ 3999750e409Sopenharmony_cistatic void UnityAddMsgIfSpecified(const char* msg) 4009750e409Sopenharmony_ci{ 4019750e409Sopenharmony_ci if (msg) 4029750e409Sopenharmony_ci { 4039750e409Sopenharmony_ci UnityPrint(UnityStrSpacer); 4049750e409Sopenharmony_ci#ifndef UNITY_EXCLUDE_DETAILS 4059750e409Sopenharmony_ci if (Unity.CurrentDetail1) 4069750e409Sopenharmony_ci { 4079750e409Sopenharmony_ci UnityPrint(UnityStrDetail1Name); 4089750e409Sopenharmony_ci UnityPrint(Unity.CurrentDetail1); 4099750e409Sopenharmony_ci if (Unity.CurrentDetail2) 4109750e409Sopenharmony_ci { 4119750e409Sopenharmony_ci UnityPrint(UnityStrDetail2Name); 4129750e409Sopenharmony_ci UnityPrint(Unity.CurrentDetail2); 4139750e409Sopenharmony_ci } 4149750e409Sopenharmony_ci UnityPrint(UnityStrSpacer); 4159750e409Sopenharmony_ci } 4169750e409Sopenharmony_ci#endif 4179750e409Sopenharmony_ci UnityPrint(msg); 4189750e409Sopenharmony_ci } 4199750e409Sopenharmony_ci} 4209750e409Sopenharmony_ci 4219750e409Sopenharmony_ci/*-----------------------------------------------*/ 4229750e409Sopenharmony_cistatic void UnityPrintExpectedAndActualStrings(const char* expected, const char* actual) 4239750e409Sopenharmony_ci{ 4249750e409Sopenharmony_ci UnityPrint(UnityStrExpected); 4259750e409Sopenharmony_ci if (expected != NULL) 4269750e409Sopenharmony_ci { 4279750e409Sopenharmony_ci UNITY_OUTPUT_CHAR('\''); 4289750e409Sopenharmony_ci UnityPrint(expected); 4299750e409Sopenharmony_ci UNITY_OUTPUT_CHAR('\''); 4309750e409Sopenharmony_ci } 4319750e409Sopenharmony_ci else 4329750e409Sopenharmony_ci { 4339750e409Sopenharmony_ci UnityPrint(UnityStrNull); 4349750e409Sopenharmony_ci } 4359750e409Sopenharmony_ci UnityPrint(UnityStrWas); 4369750e409Sopenharmony_ci if (actual != NULL) 4379750e409Sopenharmony_ci { 4389750e409Sopenharmony_ci UNITY_OUTPUT_CHAR('\''); 4399750e409Sopenharmony_ci UnityPrint(actual); 4409750e409Sopenharmony_ci UNITY_OUTPUT_CHAR('\''); 4419750e409Sopenharmony_ci } 4429750e409Sopenharmony_ci else 4439750e409Sopenharmony_ci { 4449750e409Sopenharmony_ci UnityPrint(UnityStrNull); 4459750e409Sopenharmony_ci } 4469750e409Sopenharmony_ci} 4479750e409Sopenharmony_ci 4489750e409Sopenharmony_ci/*-----------------------------------------------*/ 4499750e409Sopenharmony_cistatic void UnityPrintExpectedAndActualStringsLen(const char* expected, 4509750e409Sopenharmony_ci const char* actual, 4519750e409Sopenharmony_ci const UNITY_UINT32 length) 4529750e409Sopenharmony_ci{ 4539750e409Sopenharmony_ci UnityPrint(UnityStrExpected); 4549750e409Sopenharmony_ci if (expected != NULL) 4559750e409Sopenharmony_ci { 4569750e409Sopenharmony_ci UNITY_OUTPUT_CHAR('\''); 4579750e409Sopenharmony_ci UnityPrintLen(expected, length); 4589750e409Sopenharmony_ci UNITY_OUTPUT_CHAR('\''); 4599750e409Sopenharmony_ci } 4609750e409Sopenharmony_ci else 4619750e409Sopenharmony_ci { 4629750e409Sopenharmony_ci UnityPrint(UnityStrNull); 4639750e409Sopenharmony_ci } 4649750e409Sopenharmony_ci UnityPrint(UnityStrWas); 4659750e409Sopenharmony_ci if (actual != NULL) 4669750e409Sopenharmony_ci { 4679750e409Sopenharmony_ci UNITY_OUTPUT_CHAR('\''); 4689750e409Sopenharmony_ci UnityPrintLen(actual, length); 4699750e409Sopenharmony_ci UNITY_OUTPUT_CHAR('\''); 4709750e409Sopenharmony_ci } 4719750e409Sopenharmony_ci else 4729750e409Sopenharmony_ci { 4739750e409Sopenharmony_ci UnityPrint(UnityStrNull); 4749750e409Sopenharmony_ci } 4759750e409Sopenharmony_ci} 4769750e409Sopenharmony_ci 4779750e409Sopenharmony_ci/*----------------------------------------------- 4789750e409Sopenharmony_ci * Assertion & Control Helpers 4799750e409Sopenharmony_ci *-----------------------------------------------*/ 4809750e409Sopenharmony_ci 4819750e409Sopenharmony_cistatic int UnityIsOneArrayNull(UNITY_INTERNAL_PTR expected, 4829750e409Sopenharmony_ci UNITY_INTERNAL_PTR actual, 4839750e409Sopenharmony_ci const UNITY_LINE_TYPE lineNumber, 4849750e409Sopenharmony_ci const char* msg) 4859750e409Sopenharmony_ci{ 4869750e409Sopenharmony_ci if (expected == actual) return 0; /* Both are NULL or same pointer */ 4879750e409Sopenharmony_ci 4889750e409Sopenharmony_ci /* print and return true if just expected is NULL */ 4899750e409Sopenharmony_ci if (expected == NULL) 4909750e409Sopenharmony_ci { 4919750e409Sopenharmony_ci UnityTestResultsFailBegin(lineNumber); 4929750e409Sopenharmony_ci UnityPrint(UnityStrNullPointerForExpected); 4939750e409Sopenharmony_ci UnityAddMsgIfSpecified(msg); 4949750e409Sopenharmony_ci return 1; 4959750e409Sopenharmony_ci } 4969750e409Sopenharmony_ci 4979750e409Sopenharmony_ci /* print and return true if just actual is NULL */ 4989750e409Sopenharmony_ci if (actual == NULL) 4999750e409Sopenharmony_ci { 5009750e409Sopenharmony_ci UnityTestResultsFailBegin(lineNumber); 5019750e409Sopenharmony_ci UnityPrint(UnityStrNullPointerForActual); 5029750e409Sopenharmony_ci UnityAddMsgIfSpecified(msg); 5039750e409Sopenharmony_ci return 1; 5049750e409Sopenharmony_ci } 5059750e409Sopenharmony_ci 5069750e409Sopenharmony_ci return 0; /* return false if neither is NULL */ 5079750e409Sopenharmony_ci} 5089750e409Sopenharmony_ci 5099750e409Sopenharmony_ci/*----------------------------------------------- 5109750e409Sopenharmony_ci * Assertion Functions 5119750e409Sopenharmony_ci *-----------------------------------------------*/ 5129750e409Sopenharmony_ci 5139750e409Sopenharmony_civoid UnityAssertBits(const UNITY_INT mask, 5149750e409Sopenharmony_ci const UNITY_INT expected, 5159750e409Sopenharmony_ci const UNITY_INT actual, 5169750e409Sopenharmony_ci const char* msg, 5179750e409Sopenharmony_ci const UNITY_LINE_TYPE lineNumber) 5189750e409Sopenharmony_ci{ 5199750e409Sopenharmony_ci RETURN_IF_FAIL_OR_IGNORE; 5209750e409Sopenharmony_ci 5219750e409Sopenharmony_ci if ((mask & expected) != (mask & actual)) 5229750e409Sopenharmony_ci { 5239750e409Sopenharmony_ci UnityTestResultsFailBegin(lineNumber); 5249750e409Sopenharmony_ci UnityPrint(UnityStrExpected); 5259750e409Sopenharmony_ci UnityPrintMask((UNITY_UINT)mask, (UNITY_UINT)expected); 5269750e409Sopenharmony_ci UnityPrint(UnityStrWas); 5279750e409Sopenharmony_ci UnityPrintMask((UNITY_UINT)mask, (UNITY_UINT)actual); 5289750e409Sopenharmony_ci UnityAddMsgIfSpecified(msg); 5299750e409Sopenharmony_ci UNITY_FAIL_AND_BAIL; 5309750e409Sopenharmony_ci } 5319750e409Sopenharmony_ci} 5329750e409Sopenharmony_ci 5339750e409Sopenharmony_ci/*-----------------------------------------------*/ 5349750e409Sopenharmony_civoid UnityAssertEqualNumber(const UNITY_INT expected, 5359750e409Sopenharmony_ci const UNITY_INT actual, 5369750e409Sopenharmony_ci const char* msg, 5379750e409Sopenharmony_ci const UNITY_LINE_TYPE lineNumber, 5389750e409Sopenharmony_ci const UNITY_DISPLAY_STYLE_T style) 5399750e409Sopenharmony_ci{ 5409750e409Sopenharmony_ci RETURN_IF_FAIL_OR_IGNORE; 5419750e409Sopenharmony_ci 5429750e409Sopenharmony_ci if (expected != actual) 5439750e409Sopenharmony_ci { 5449750e409Sopenharmony_ci UnityTestResultsFailBegin(lineNumber); 5459750e409Sopenharmony_ci UnityPrint(UnityStrExpected); 5469750e409Sopenharmony_ci UnityPrintNumberByStyle(expected, style); 5479750e409Sopenharmony_ci UnityPrint(UnityStrWas); 5489750e409Sopenharmony_ci UnityPrintNumberByStyle(actual, style); 5499750e409Sopenharmony_ci UnityAddMsgIfSpecified(msg); 5509750e409Sopenharmony_ci UNITY_FAIL_AND_BAIL; 5519750e409Sopenharmony_ci } 5529750e409Sopenharmony_ci} 5539750e409Sopenharmony_ci 5549750e409Sopenharmony_ci/*-----------------------------------------------*/ 5559750e409Sopenharmony_civoid UnityAssertGreaterOrLessOrEqualNumber(const UNITY_INT threshold, 5569750e409Sopenharmony_ci const UNITY_INT actual, 5579750e409Sopenharmony_ci const UNITY_COMPARISON_T compare, 5589750e409Sopenharmony_ci const char *msg, 5599750e409Sopenharmony_ci const UNITY_LINE_TYPE lineNumber, 5609750e409Sopenharmony_ci const UNITY_DISPLAY_STYLE_T style) 5619750e409Sopenharmony_ci{ 5629750e409Sopenharmony_ci int failed = 0; 5639750e409Sopenharmony_ci RETURN_IF_FAIL_OR_IGNORE; 5649750e409Sopenharmony_ci 5659750e409Sopenharmony_ci if (threshold == actual && compare & UNITY_EQUAL_TO) return; 5669750e409Sopenharmony_ci if (threshold == actual) failed = 1; 5679750e409Sopenharmony_ci 5689750e409Sopenharmony_ci if ((style & UNITY_DISPLAY_RANGE_INT) == UNITY_DISPLAY_RANGE_INT) 5699750e409Sopenharmony_ci { 5709750e409Sopenharmony_ci if (actual > threshold && compare & UNITY_SMALLER_THAN) failed = 1; 5719750e409Sopenharmony_ci if (actual < threshold && compare & UNITY_GREATER_THAN) failed = 1; 5729750e409Sopenharmony_ci } 5739750e409Sopenharmony_ci else /* UINT or HEX */ 5749750e409Sopenharmony_ci { 5759750e409Sopenharmony_ci if ((UNITY_UINT)actual > (UNITY_UINT)threshold && compare & UNITY_SMALLER_THAN) failed = 1; 5769750e409Sopenharmony_ci if ((UNITY_UINT)actual < (UNITY_UINT)threshold && compare & UNITY_GREATER_THAN) failed = 1; 5779750e409Sopenharmony_ci } 5789750e409Sopenharmony_ci 5799750e409Sopenharmony_ci if (failed) 5809750e409Sopenharmony_ci { 5819750e409Sopenharmony_ci UnityTestResultsFailBegin(lineNumber); 5829750e409Sopenharmony_ci UnityPrint(UnityStrExpected); 5839750e409Sopenharmony_ci UnityPrintNumberByStyle(actual, style); 5849750e409Sopenharmony_ci if (compare & UNITY_GREATER_THAN) UnityPrint(UnityStrGt); 5859750e409Sopenharmony_ci if (compare & UNITY_SMALLER_THAN) UnityPrint(UnityStrLt); 5869750e409Sopenharmony_ci if (compare & UNITY_EQUAL_TO) UnityPrint(UnityStrOrEqual); 5879750e409Sopenharmony_ci UnityPrintNumberByStyle(threshold, style); 5889750e409Sopenharmony_ci UnityAddMsgIfSpecified(msg); 5899750e409Sopenharmony_ci UNITY_FAIL_AND_BAIL; 5909750e409Sopenharmony_ci } 5919750e409Sopenharmony_ci} 5929750e409Sopenharmony_ci 5939750e409Sopenharmony_ci#define UnityPrintPointlessAndBail() \ 5949750e409Sopenharmony_ci{ \ 5959750e409Sopenharmony_ci UnityTestResultsFailBegin(lineNumber); \ 5969750e409Sopenharmony_ci UnityPrint(UnityStrPointless); \ 5979750e409Sopenharmony_ci UnityAddMsgIfSpecified(msg); \ 5989750e409Sopenharmony_ci UNITY_FAIL_AND_BAIL; } 5999750e409Sopenharmony_ci 6009750e409Sopenharmony_ci/*-----------------------------------------------*/ 6019750e409Sopenharmony_civoid UnityAssertEqualIntArray(UNITY_INTERNAL_PTR expected, 6029750e409Sopenharmony_ci UNITY_INTERNAL_PTR actual, 6039750e409Sopenharmony_ci const UNITY_UINT32 num_elements, 6049750e409Sopenharmony_ci const char* msg, 6059750e409Sopenharmony_ci const UNITY_LINE_TYPE lineNumber, 6069750e409Sopenharmony_ci const UNITY_DISPLAY_STYLE_T style, 6079750e409Sopenharmony_ci const UNITY_FLAGS_T flags) 6089750e409Sopenharmony_ci{ 6099750e409Sopenharmony_ci UNITY_UINT32 elements = num_elements; 6109750e409Sopenharmony_ci unsigned int length = style & 0xF; 6119750e409Sopenharmony_ci 6129750e409Sopenharmony_ci RETURN_IF_FAIL_OR_IGNORE; 6139750e409Sopenharmony_ci 6149750e409Sopenharmony_ci if (num_elements == 0) 6159750e409Sopenharmony_ci { 6169750e409Sopenharmony_ci UnityPrintPointlessAndBail(); 6179750e409Sopenharmony_ci } 6189750e409Sopenharmony_ci 6199750e409Sopenharmony_ci if (expected == actual) return; /* Both are NULL or same pointer */ 6209750e409Sopenharmony_ci if (UnityIsOneArrayNull(expected, actual, lineNumber, msg)) 6219750e409Sopenharmony_ci UNITY_FAIL_AND_BAIL; 6229750e409Sopenharmony_ci 6239750e409Sopenharmony_ci while (elements--) 6249750e409Sopenharmony_ci { 6259750e409Sopenharmony_ci UNITY_INT expect_val; 6269750e409Sopenharmony_ci UNITY_INT actual_val; 6279750e409Sopenharmony_ci switch (length) 6289750e409Sopenharmony_ci { 6299750e409Sopenharmony_ci case 1: 6309750e409Sopenharmony_ci expect_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT8*)expected; 6319750e409Sopenharmony_ci actual_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT8*)actual; 6329750e409Sopenharmony_ci break; 6339750e409Sopenharmony_ci case 2: 6349750e409Sopenharmony_ci expect_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT16*)expected; 6359750e409Sopenharmony_ci actual_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT16*)actual; 6369750e409Sopenharmony_ci break; 6379750e409Sopenharmony_ci#ifdef UNITY_SUPPORT_64 6389750e409Sopenharmony_ci case 8: 6399750e409Sopenharmony_ci expect_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT64*)expected; 6409750e409Sopenharmony_ci actual_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT64*)actual; 6419750e409Sopenharmony_ci break; 6429750e409Sopenharmony_ci#endif 6439750e409Sopenharmony_ci default: /* length 4 bytes */ 6449750e409Sopenharmony_ci expect_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT32*)expected; 6459750e409Sopenharmony_ci actual_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT32*)actual; 6469750e409Sopenharmony_ci length = 4; 6479750e409Sopenharmony_ci break; 6489750e409Sopenharmony_ci } 6499750e409Sopenharmony_ci 6509750e409Sopenharmony_ci if (expect_val != actual_val) 6519750e409Sopenharmony_ci { 6529750e409Sopenharmony_ci if (style & UNITY_DISPLAY_RANGE_UINT && length < sizeof(expect_val)) 6539750e409Sopenharmony_ci { /* For UINT, remove sign extension (padding 1's) from signed type casts above */ 6549750e409Sopenharmony_ci UNITY_INT mask = 1; 6559750e409Sopenharmony_ci mask = (mask << 8 * length) - 1; 6569750e409Sopenharmony_ci expect_val &= mask; 6579750e409Sopenharmony_ci actual_val &= mask; 6589750e409Sopenharmony_ci } 6599750e409Sopenharmony_ci UnityTestResultsFailBegin(lineNumber); 6609750e409Sopenharmony_ci UnityPrint(UnityStrElement); 6619750e409Sopenharmony_ci UnityPrintNumberUnsigned(num_elements - elements - 1); 6629750e409Sopenharmony_ci UnityPrint(UnityStrExpected); 6639750e409Sopenharmony_ci UnityPrintNumberByStyle(expect_val, style); 6649750e409Sopenharmony_ci UnityPrint(UnityStrWas); 6659750e409Sopenharmony_ci UnityPrintNumberByStyle(actual_val, style); 6669750e409Sopenharmony_ci UnityAddMsgIfSpecified(msg); 6679750e409Sopenharmony_ci UNITY_FAIL_AND_BAIL; 6689750e409Sopenharmony_ci } 6699750e409Sopenharmony_ci if (flags == UNITY_ARRAY_TO_ARRAY) 6709750e409Sopenharmony_ci { 6719750e409Sopenharmony_ci expected = (UNITY_INTERNAL_PTR)(length + (const char*)expected); 6729750e409Sopenharmony_ci } 6739750e409Sopenharmony_ci actual = (UNITY_INTERNAL_PTR)(length + (const char*)actual); 6749750e409Sopenharmony_ci } 6759750e409Sopenharmony_ci} 6769750e409Sopenharmony_ci 6779750e409Sopenharmony_ci/*-----------------------------------------------*/ 6789750e409Sopenharmony_ci#ifndef UNITY_EXCLUDE_FLOAT 6799750e409Sopenharmony_ci/* Wrap this define in a function with variable types as float or double */ 6809750e409Sopenharmony_ci#define UNITY_FLOAT_OR_DOUBLE_WITHIN(delta, expected, actual, diff) \ 6819750e409Sopenharmony_ci if (isinf(expected) && isinf(actual) && ((expected < 0) == (actual < 0))) return 1; \ 6829750e409Sopenharmony_ci if (UNITY_NAN_CHECK) return 1; \ 6839750e409Sopenharmony_ci diff = actual - expected; \ 6849750e409Sopenharmony_ci if (diff < 0) diff = -diff; \ 6859750e409Sopenharmony_ci if (delta < 0) delta = -delta; \ 6869750e409Sopenharmony_ci return !(isnan(diff) || isinf(diff) || (diff > delta)) 6879750e409Sopenharmony_ci /* This first part of this condition will catch any NaN or Infinite values */ 6889750e409Sopenharmony_ci#ifndef UNITY_NAN_NOT_EQUAL_NAN 6899750e409Sopenharmony_ci #define UNITY_NAN_CHECK isnan(expected) && isnan(actual) 6909750e409Sopenharmony_ci#else 6919750e409Sopenharmony_ci #define UNITY_NAN_CHECK 0 6929750e409Sopenharmony_ci#endif 6939750e409Sopenharmony_ci 6949750e409Sopenharmony_ci#ifndef UNITY_EXCLUDE_FLOAT_PRINT 6959750e409Sopenharmony_ci #define UNITY_PRINT_EXPECTED_AND_ACTUAL_FLOAT(expected, actual) \ 6969750e409Sopenharmony_ci { \ 6979750e409Sopenharmony_ci UnityPrint(UnityStrExpected); \ 6989750e409Sopenharmony_ci UnityPrintFloat(expected); \ 6999750e409Sopenharmony_ci UnityPrint(UnityStrWas); \ 7009750e409Sopenharmony_ci UnityPrintFloat(actual); } 7019750e409Sopenharmony_ci#else 7029750e409Sopenharmony_ci #define UNITY_PRINT_EXPECTED_AND_ACTUAL_FLOAT(expected, actual) \ 7039750e409Sopenharmony_ci UnityPrint(UnityStrDelta) 7049750e409Sopenharmony_ci#endif /* UNITY_EXCLUDE_FLOAT_PRINT */ 7059750e409Sopenharmony_ci 7069750e409Sopenharmony_cistatic int UnityFloatsWithin(UNITY_FLOAT delta, UNITY_FLOAT expected, UNITY_FLOAT actual) 7079750e409Sopenharmony_ci{ 7089750e409Sopenharmony_ci UNITY_FLOAT diff; 7099750e409Sopenharmony_ci UNITY_FLOAT_OR_DOUBLE_WITHIN(delta, expected, actual, diff); 7109750e409Sopenharmony_ci} 7119750e409Sopenharmony_ci 7129750e409Sopenharmony_civoid UnityAssertEqualFloatArray(UNITY_PTR_ATTRIBUTE const UNITY_FLOAT* expected, 7139750e409Sopenharmony_ci UNITY_PTR_ATTRIBUTE const UNITY_FLOAT* actual, 7149750e409Sopenharmony_ci const UNITY_UINT32 num_elements, 7159750e409Sopenharmony_ci const char* msg, 7169750e409Sopenharmony_ci const UNITY_LINE_TYPE lineNumber, 7179750e409Sopenharmony_ci const UNITY_FLAGS_T flags) 7189750e409Sopenharmony_ci{ 7199750e409Sopenharmony_ci UNITY_UINT32 elements = num_elements; 7209750e409Sopenharmony_ci UNITY_PTR_ATTRIBUTE const UNITY_FLOAT* ptr_expected = expected; 7219750e409Sopenharmony_ci UNITY_PTR_ATTRIBUTE const UNITY_FLOAT* ptr_actual = actual; 7229750e409Sopenharmony_ci 7239750e409Sopenharmony_ci RETURN_IF_FAIL_OR_IGNORE; 7249750e409Sopenharmony_ci 7259750e409Sopenharmony_ci if (elements == 0) 7269750e409Sopenharmony_ci { 7279750e409Sopenharmony_ci UnityPrintPointlessAndBail(); 7289750e409Sopenharmony_ci } 7299750e409Sopenharmony_ci 7309750e409Sopenharmony_ci if (expected == actual) return; /* Both are NULL or same pointer */ 7319750e409Sopenharmony_ci if (UnityIsOneArrayNull((UNITY_INTERNAL_PTR)expected, (UNITY_INTERNAL_PTR)actual, lineNumber, msg)) 7329750e409Sopenharmony_ci UNITY_FAIL_AND_BAIL; 7339750e409Sopenharmony_ci 7349750e409Sopenharmony_ci while (elements--) 7359750e409Sopenharmony_ci { 7369750e409Sopenharmony_ci if (!UnityFloatsWithin(*ptr_expected * UNITY_FLOAT_PRECISION, *ptr_expected, *ptr_actual)) 7379750e409Sopenharmony_ci { 7389750e409Sopenharmony_ci UnityTestResultsFailBegin(lineNumber); 7399750e409Sopenharmony_ci UnityPrint(UnityStrElement); 7409750e409Sopenharmony_ci UnityPrintNumberUnsigned(num_elements - elements - 1); 7419750e409Sopenharmony_ci UNITY_PRINT_EXPECTED_AND_ACTUAL_FLOAT((UNITY_DOUBLE)*ptr_expected, (UNITY_DOUBLE)*ptr_actual); 7429750e409Sopenharmony_ci UnityAddMsgIfSpecified(msg); 7439750e409Sopenharmony_ci UNITY_FAIL_AND_BAIL; 7449750e409Sopenharmony_ci } 7459750e409Sopenharmony_ci if (flags == UNITY_ARRAY_TO_ARRAY) 7469750e409Sopenharmony_ci { 7479750e409Sopenharmony_ci ptr_expected++; 7489750e409Sopenharmony_ci } 7499750e409Sopenharmony_ci ptr_actual++; 7509750e409Sopenharmony_ci } 7519750e409Sopenharmony_ci} 7529750e409Sopenharmony_ci 7539750e409Sopenharmony_ci/*-----------------------------------------------*/ 7549750e409Sopenharmony_civoid UnityAssertFloatsWithin(const UNITY_FLOAT delta, 7559750e409Sopenharmony_ci const UNITY_FLOAT expected, 7569750e409Sopenharmony_ci const UNITY_FLOAT actual, 7579750e409Sopenharmony_ci const char* msg, 7589750e409Sopenharmony_ci const UNITY_LINE_TYPE lineNumber) 7599750e409Sopenharmony_ci{ 7609750e409Sopenharmony_ci RETURN_IF_FAIL_OR_IGNORE; 7619750e409Sopenharmony_ci 7629750e409Sopenharmony_ci 7639750e409Sopenharmony_ci if (!UnityFloatsWithin(delta, expected, actual)) 7649750e409Sopenharmony_ci { 7659750e409Sopenharmony_ci UnityTestResultsFailBegin(lineNumber); 7669750e409Sopenharmony_ci UNITY_PRINT_EXPECTED_AND_ACTUAL_FLOAT((UNITY_DOUBLE)expected, (UNITY_DOUBLE)actual); 7679750e409Sopenharmony_ci UnityAddMsgIfSpecified(msg); 7689750e409Sopenharmony_ci UNITY_FAIL_AND_BAIL; 7699750e409Sopenharmony_ci } 7709750e409Sopenharmony_ci} 7719750e409Sopenharmony_ci 7729750e409Sopenharmony_ci/*-----------------------------------------------*/ 7739750e409Sopenharmony_civoid UnityAssertFloatSpecial(const UNITY_FLOAT actual, 7749750e409Sopenharmony_ci const char* msg, 7759750e409Sopenharmony_ci const UNITY_LINE_TYPE lineNumber, 7769750e409Sopenharmony_ci const UNITY_FLOAT_TRAIT_T style) 7779750e409Sopenharmony_ci{ 7789750e409Sopenharmony_ci const char* trait_names[] = {UnityStrInf, UnityStrNegInf, UnityStrNaN, UnityStrDet}; 7799750e409Sopenharmony_ci UNITY_INT should_be_trait = ((UNITY_INT)style & 1); 7809750e409Sopenharmony_ci UNITY_INT is_trait = !should_be_trait; 7819750e409Sopenharmony_ci UNITY_INT trait_index = (UNITY_INT)(style >> 1); 7829750e409Sopenharmony_ci 7839750e409Sopenharmony_ci RETURN_IF_FAIL_OR_IGNORE; 7849750e409Sopenharmony_ci 7859750e409Sopenharmony_ci switch (style) 7869750e409Sopenharmony_ci { 7879750e409Sopenharmony_ci case UNITY_FLOAT_IS_INF: 7889750e409Sopenharmony_ci case UNITY_FLOAT_IS_NOT_INF: 7899750e409Sopenharmony_ci is_trait = isinf(actual) && (actual > 0); 7909750e409Sopenharmony_ci break; 7919750e409Sopenharmony_ci case UNITY_FLOAT_IS_NEG_INF: 7929750e409Sopenharmony_ci case UNITY_FLOAT_IS_NOT_NEG_INF: 7939750e409Sopenharmony_ci is_trait = isinf(actual) && (actual < 0); 7949750e409Sopenharmony_ci break; 7959750e409Sopenharmony_ci 7969750e409Sopenharmony_ci case UNITY_FLOAT_IS_NAN: 7979750e409Sopenharmony_ci case UNITY_FLOAT_IS_NOT_NAN: 7989750e409Sopenharmony_ci is_trait = isnan(actual) ? 1 : 0; 7999750e409Sopenharmony_ci break; 8009750e409Sopenharmony_ci 8019750e409Sopenharmony_ci case UNITY_FLOAT_IS_DET: /* A determinate number is non infinite and not NaN. */ 8029750e409Sopenharmony_ci case UNITY_FLOAT_IS_NOT_DET: 8039750e409Sopenharmony_ci is_trait = !isinf(actual) && !isnan(actual); 8049750e409Sopenharmony_ci break; 8059750e409Sopenharmony_ci 8069750e409Sopenharmony_ci default: 8079750e409Sopenharmony_ci trait_index = 0; 8089750e409Sopenharmony_ci trait_names[0] = UnityStrInvalidFloatTrait; 8099750e409Sopenharmony_ci break; 8109750e409Sopenharmony_ci } 8119750e409Sopenharmony_ci 8129750e409Sopenharmony_ci if (is_trait != should_be_trait) 8139750e409Sopenharmony_ci { 8149750e409Sopenharmony_ci UnityTestResultsFailBegin(lineNumber); 8159750e409Sopenharmony_ci UnityPrint(UnityStrExpected); 8169750e409Sopenharmony_ci if (!should_be_trait) 8179750e409Sopenharmony_ci UnityPrint(UnityStrNot); 8189750e409Sopenharmony_ci UnityPrint(trait_names[trait_index]); 8199750e409Sopenharmony_ci UnityPrint(UnityStrWas); 8209750e409Sopenharmony_ci#ifndef UNITY_EXCLUDE_FLOAT_PRINT 8219750e409Sopenharmony_ci UnityPrintFloat((UNITY_DOUBLE)actual); 8229750e409Sopenharmony_ci#else 8239750e409Sopenharmony_ci if (should_be_trait) 8249750e409Sopenharmony_ci UnityPrint(UnityStrNot); 8259750e409Sopenharmony_ci UnityPrint(trait_names[trait_index]); 8269750e409Sopenharmony_ci#endif 8279750e409Sopenharmony_ci UnityAddMsgIfSpecified(msg); 8289750e409Sopenharmony_ci UNITY_FAIL_AND_BAIL; 8299750e409Sopenharmony_ci } 8309750e409Sopenharmony_ci} 8319750e409Sopenharmony_ci 8329750e409Sopenharmony_ci#endif /* not UNITY_EXCLUDE_FLOAT */ 8339750e409Sopenharmony_ci 8349750e409Sopenharmony_ci/*-----------------------------------------------*/ 8359750e409Sopenharmony_ci#ifndef UNITY_EXCLUDE_DOUBLE 8369750e409Sopenharmony_cistatic int UnityDoublesWithin(UNITY_DOUBLE delta, UNITY_DOUBLE expected, UNITY_DOUBLE actual) 8379750e409Sopenharmony_ci{ 8389750e409Sopenharmony_ci UNITY_DOUBLE diff; 8399750e409Sopenharmony_ci UNITY_FLOAT_OR_DOUBLE_WITHIN(delta, expected, actual, diff); 8409750e409Sopenharmony_ci} 8419750e409Sopenharmony_ci 8429750e409Sopenharmony_civoid UnityAssertEqualDoubleArray(UNITY_PTR_ATTRIBUTE const UNITY_DOUBLE* expected, 8439750e409Sopenharmony_ci UNITY_PTR_ATTRIBUTE const UNITY_DOUBLE* actual, 8449750e409Sopenharmony_ci const UNITY_UINT32 num_elements, 8459750e409Sopenharmony_ci const char* msg, 8469750e409Sopenharmony_ci const UNITY_LINE_TYPE lineNumber, 8479750e409Sopenharmony_ci const UNITY_FLAGS_T flags) 8489750e409Sopenharmony_ci{ 8499750e409Sopenharmony_ci UNITY_UINT32 elements = num_elements; 8509750e409Sopenharmony_ci UNITY_PTR_ATTRIBUTE const UNITY_DOUBLE* ptr_expected = expected; 8519750e409Sopenharmony_ci UNITY_PTR_ATTRIBUTE const UNITY_DOUBLE* ptr_actual = actual; 8529750e409Sopenharmony_ci 8539750e409Sopenharmony_ci RETURN_IF_FAIL_OR_IGNORE; 8549750e409Sopenharmony_ci 8559750e409Sopenharmony_ci if (elements == 0) 8569750e409Sopenharmony_ci { 8579750e409Sopenharmony_ci UnityPrintPointlessAndBail(); 8589750e409Sopenharmony_ci } 8599750e409Sopenharmony_ci 8609750e409Sopenharmony_ci if (expected == actual) return; /* Both are NULL or same pointer */ 8619750e409Sopenharmony_ci if (UnityIsOneArrayNull((UNITY_INTERNAL_PTR)expected, (UNITY_INTERNAL_PTR)actual, lineNumber, msg)) 8629750e409Sopenharmony_ci UNITY_FAIL_AND_BAIL; 8639750e409Sopenharmony_ci 8649750e409Sopenharmony_ci while (elements--) 8659750e409Sopenharmony_ci { 8669750e409Sopenharmony_ci if (!UnityDoublesWithin(*ptr_expected * UNITY_DOUBLE_PRECISION, *ptr_expected, *ptr_actual)) 8679750e409Sopenharmony_ci { 8689750e409Sopenharmony_ci UnityTestResultsFailBegin(lineNumber); 8699750e409Sopenharmony_ci UnityPrint(UnityStrElement); 8709750e409Sopenharmony_ci UnityPrintNumberUnsigned(num_elements - elements - 1); 8719750e409Sopenharmony_ci UNITY_PRINT_EXPECTED_AND_ACTUAL_FLOAT(*ptr_expected, *ptr_actual); 8729750e409Sopenharmony_ci UnityAddMsgIfSpecified(msg); 8739750e409Sopenharmony_ci UNITY_FAIL_AND_BAIL; 8749750e409Sopenharmony_ci } 8759750e409Sopenharmony_ci if (flags == UNITY_ARRAY_TO_ARRAY) 8769750e409Sopenharmony_ci { 8779750e409Sopenharmony_ci ptr_expected++; 8789750e409Sopenharmony_ci } 8799750e409Sopenharmony_ci ptr_actual++; 8809750e409Sopenharmony_ci } 8819750e409Sopenharmony_ci} 8829750e409Sopenharmony_ci 8839750e409Sopenharmony_ci/*-----------------------------------------------*/ 8849750e409Sopenharmony_civoid UnityAssertDoublesWithin(const UNITY_DOUBLE delta, 8859750e409Sopenharmony_ci const UNITY_DOUBLE expected, 8869750e409Sopenharmony_ci const UNITY_DOUBLE actual, 8879750e409Sopenharmony_ci const char* msg, 8889750e409Sopenharmony_ci const UNITY_LINE_TYPE lineNumber) 8899750e409Sopenharmony_ci{ 8909750e409Sopenharmony_ci RETURN_IF_FAIL_OR_IGNORE; 8919750e409Sopenharmony_ci 8929750e409Sopenharmony_ci if (!UnityDoublesWithin(delta, expected, actual)) 8939750e409Sopenharmony_ci { 8949750e409Sopenharmony_ci UnityTestResultsFailBegin(lineNumber); 8959750e409Sopenharmony_ci UNITY_PRINT_EXPECTED_AND_ACTUAL_FLOAT(expected, actual); 8969750e409Sopenharmony_ci UnityAddMsgIfSpecified(msg); 8979750e409Sopenharmony_ci UNITY_FAIL_AND_BAIL; 8989750e409Sopenharmony_ci } 8999750e409Sopenharmony_ci} 9009750e409Sopenharmony_ci 9019750e409Sopenharmony_ci/*-----------------------------------------------*/ 9029750e409Sopenharmony_ci 9039750e409Sopenharmony_civoid UnityAssertDoubleSpecial(const UNITY_DOUBLE actual, 9049750e409Sopenharmony_ci const char* msg, 9059750e409Sopenharmony_ci const UNITY_LINE_TYPE lineNumber, 9069750e409Sopenharmony_ci const UNITY_FLOAT_TRAIT_T style) 9079750e409Sopenharmony_ci{ 9089750e409Sopenharmony_ci const char* trait_names[] = {UnityStrInf, UnityStrNegInf, UnityStrNaN, UnityStrDet}; 9099750e409Sopenharmony_ci UNITY_INT should_be_trait = ((UNITY_INT)style & 1); 9109750e409Sopenharmony_ci UNITY_INT is_trait = !should_be_trait; 9119750e409Sopenharmony_ci UNITY_INT trait_index = (UNITY_INT)(style >> 1); 9129750e409Sopenharmony_ci 9139750e409Sopenharmony_ci RETURN_IF_FAIL_OR_IGNORE; 9149750e409Sopenharmony_ci 9159750e409Sopenharmony_ci switch (style) 9169750e409Sopenharmony_ci { 9179750e409Sopenharmony_ci case UNITY_FLOAT_IS_INF: 9189750e409Sopenharmony_ci case UNITY_FLOAT_IS_NOT_INF: 9199750e409Sopenharmony_ci is_trait = isinf(actual) && (actual > 0); 9209750e409Sopenharmony_ci break; 9219750e409Sopenharmony_ci case UNITY_FLOAT_IS_NEG_INF: 9229750e409Sopenharmony_ci case UNITY_FLOAT_IS_NOT_NEG_INF: 9239750e409Sopenharmony_ci is_trait = isinf(actual) && (actual < 0); 9249750e409Sopenharmony_ci break; 9259750e409Sopenharmony_ci 9269750e409Sopenharmony_ci case UNITY_FLOAT_IS_NAN: 9279750e409Sopenharmony_ci case UNITY_FLOAT_IS_NOT_NAN: 9289750e409Sopenharmony_ci is_trait = isnan(actual) ? 1 : 0; 9299750e409Sopenharmony_ci break; 9309750e409Sopenharmony_ci 9319750e409Sopenharmony_ci case UNITY_FLOAT_IS_DET: /* A determinate number is non infinite and not NaN. */ 9329750e409Sopenharmony_ci case UNITY_FLOAT_IS_NOT_DET: 9339750e409Sopenharmony_ci is_trait = !isinf(actual) && !isnan(actual); 9349750e409Sopenharmony_ci break; 9359750e409Sopenharmony_ci 9369750e409Sopenharmony_ci default: 9379750e409Sopenharmony_ci trait_index = 0; 9389750e409Sopenharmony_ci trait_names[0] = UnityStrInvalidFloatTrait; 9399750e409Sopenharmony_ci break; 9409750e409Sopenharmony_ci } 9419750e409Sopenharmony_ci 9429750e409Sopenharmony_ci if (is_trait != should_be_trait) 9439750e409Sopenharmony_ci { 9449750e409Sopenharmony_ci UnityTestResultsFailBegin(lineNumber); 9459750e409Sopenharmony_ci UnityPrint(UnityStrExpected); 9469750e409Sopenharmony_ci if (!should_be_trait) 9479750e409Sopenharmony_ci UnityPrint(UnityStrNot); 9489750e409Sopenharmony_ci UnityPrint(trait_names[trait_index]); 9499750e409Sopenharmony_ci UnityPrint(UnityStrWas); 9509750e409Sopenharmony_ci#ifndef UNITY_EXCLUDE_FLOAT_PRINT 9519750e409Sopenharmony_ci UnityPrintFloat(actual); 9529750e409Sopenharmony_ci#else 9539750e409Sopenharmony_ci if (should_be_trait) 9549750e409Sopenharmony_ci UnityPrint(UnityStrNot); 9559750e409Sopenharmony_ci UnityPrint(trait_names[trait_index]); 9569750e409Sopenharmony_ci#endif 9579750e409Sopenharmony_ci UnityAddMsgIfSpecified(msg); 9589750e409Sopenharmony_ci UNITY_FAIL_AND_BAIL; 9599750e409Sopenharmony_ci } 9609750e409Sopenharmony_ci} 9619750e409Sopenharmony_ci 9629750e409Sopenharmony_ci#endif /* not UNITY_EXCLUDE_DOUBLE */ 9639750e409Sopenharmony_ci 9649750e409Sopenharmony_ci/*-----------------------------------------------*/ 9659750e409Sopenharmony_civoid UnityAssertNumbersWithin(const UNITY_UINT delta, 9669750e409Sopenharmony_ci const UNITY_INT expected, 9679750e409Sopenharmony_ci const UNITY_INT actual, 9689750e409Sopenharmony_ci const char* msg, 9699750e409Sopenharmony_ci const UNITY_LINE_TYPE lineNumber, 9709750e409Sopenharmony_ci const UNITY_DISPLAY_STYLE_T style) 9719750e409Sopenharmony_ci{ 9729750e409Sopenharmony_ci RETURN_IF_FAIL_OR_IGNORE; 9739750e409Sopenharmony_ci 9749750e409Sopenharmony_ci if ((style & UNITY_DISPLAY_RANGE_INT) == UNITY_DISPLAY_RANGE_INT) 9759750e409Sopenharmony_ci { 9769750e409Sopenharmony_ci if (actual > expected) 9779750e409Sopenharmony_ci Unity.CurrentTestFailed = (UNITY_UINT)((UNITY_UINT)(actual - expected) > delta); 9789750e409Sopenharmony_ci else 9799750e409Sopenharmony_ci Unity.CurrentTestFailed = (UNITY_UINT)((UNITY_UINT)(expected - actual) > delta); 9809750e409Sopenharmony_ci } 9819750e409Sopenharmony_ci else 9829750e409Sopenharmony_ci { 9839750e409Sopenharmony_ci if ((UNITY_UINT)actual > (UNITY_UINT)expected) 9849750e409Sopenharmony_ci Unity.CurrentTestFailed = (UNITY_UINT)((UNITY_UINT)(actual - expected) > delta); 9859750e409Sopenharmony_ci else 9869750e409Sopenharmony_ci Unity.CurrentTestFailed = (UNITY_UINT)((UNITY_UINT)(expected - actual) > delta); 9879750e409Sopenharmony_ci } 9889750e409Sopenharmony_ci 9899750e409Sopenharmony_ci if (Unity.CurrentTestFailed) 9909750e409Sopenharmony_ci { 9919750e409Sopenharmony_ci UnityTestResultsFailBegin(lineNumber); 9929750e409Sopenharmony_ci UnityPrint(UnityStrDelta); 9939750e409Sopenharmony_ci UnityPrintNumberByStyle((UNITY_INT)delta, style); 9949750e409Sopenharmony_ci UnityPrint(UnityStrExpected); 9959750e409Sopenharmony_ci UnityPrintNumberByStyle(expected, style); 9969750e409Sopenharmony_ci UnityPrint(UnityStrWas); 9979750e409Sopenharmony_ci UnityPrintNumberByStyle(actual, style); 9989750e409Sopenharmony_ci UnityAddMsgIfSpecified(msg); 9999750e409Sopenharmony_ci UNITY_FAIL_AND_BAIL; 10009750e409Sopenharmony_ci } 10019750e409Sopenharmony_ci} 10029750e409Sopenharmony_ci 10039750e409Sopenharmony_ci/*-----------------------------------------------*/ 10049750e409Sopenharmony_civoid UnityAssertEqualString(const char* expected, 10059750e409Sopenharmony_ci const char* actual, 10069750e409Sopenharmony_ci const char* msg, 10079750e409Sopenharmony_ci const UNITY_LINE_TYPE lineNumber) 10089750e409Sopenharmony_ci{ 10099750e409Sopenharmony_ci UNITY_UINT32 i; 10109750e409Sopenharmony_ci 10119750e409Sopenharmony_ci RETURN_IF_FAIL_OR_IGNORE; 10129750e409Sopenharmony_ci 10139750e409Sopenharmony_ci /* if both pointers not null compare the strings */ 10149750e409Sopenharmony_ci if (expected && actual) 10159750e409Sopenharmony_ci { 10169750e409Sopenharmony_ci for (i = 0; expected[i] || actual[i]; i++) 10179750e409Sopenharmony_ci { 10189750e409Sopenharmony_ci if (expected[i] != actual[i]) 10199750e409Sopenharmony_ci { 10209750e409Sopenharmony_ci Unity.CurrentTestFailed = 1; 10219750e409Sopenharmony_ci break; 10229750e409Sopenharmony_ci } 10239750e409Sopenharmony_ci } 10249750e409Sopenharmony_ci } 10259750e409Sopenharmony_ci else 10269750e409Sopenharmony_ci { /* handle case of one pointers being null (if both null, test should pass) */ 10279750e409Sopenharmony_ci if (expected != actual) 10289750e409Sopenharmony_ci { 10299750e409Sopenharmony_ci Unity.CurrentTestFailed = 1; 10309750e409Sopenharmony_ci } 10319750e409Sopenharmony_ci } 10329750e409Sopenharmony_ci 10339750e409Sopenharmony_ci if (Unity.CurrentTestFailed) 10349750e409Sopenharmony_ci { 10359750e409Sopenharmony_ci UnityTestResultsFailBegin(lineNumber); 10369750e409Sopenharmony_ci UnityPrintExpectedAndActualStrings(expected, actual); 10379750e409Sopenharmony_ci UnityAddMsgIfSpecified(msg); 10389750e409Sopenharmony_ci UNITY_FAIL_AND_BAIL; 10399750e409Sopenharmony_ci } 10409750e409Sopenharmony_ci} 10419750e409Sopenharmony_ci 10429750e409Sopenharmony_ci/*-----------------------------------------------*/ 10439750e409Sopenharmony_civoid UnityAssertEqualStringLen(const char* expected, 10449750e409Sopenharmony_ci const char* actual, 10459750e409Sopenharmony_ci const UNITY_UINT32 length, 10469750e409Sopenharmony_ci const char* msg, 10479750e409Sopenharmony_ci const UNITY_LINE_TYPE lineNumber) 10489750e409Sopenharmony_ci{ 10499750e409Sopenharmony_ci UNITY_UINT32 i; 10509750e409Sopenharmony_ci 10519750e409Sopenharmony_ci RETURN_IF_FAIL_OR_IGNORE; 10529750e409Sopenharmony_ci 10539750e409Sopenharmony_ci /* if both pointers not null compare the strings */ 10549750e409Sopenharmony_ci if (expected && actual) 10559750e409Sopenharmony_ci { 10569750e409Sopenharmony_ci for (i = 0; (i < length) && (expected[i] || actual[i]); i++) 10579750e409Sopenharmony_ci { 10589750e409Sopenharmony_ci if (expected[i] != actual[i]) 10599750e409Sopenharmony_ci { 10609750e409Sopenharmony_ci Unity.CurrentTestFailed = 1; 10619750e409Sopenharmony_ci break; 10629750e409Sopenharmony_ci } 10639750e409Sopenharmony_ci } 10649750e409Sopenharmony_ci } 10659750e409Sopenharmony_ci else 10669750e409Sopenharmony_ci { /* handle case of one pointers being null (if both null, test should pass) */ 10679750e409Sopenharmony_ci if (expected != actual) 10689750e409Sopenharmony_ci { 10699750e409Sopenharmony_ci Unity.CurrentTestFailed = 1; 10709750e409Sopenharmony_ci } 10719750e409Sopenharmony_ci } 10729750e409Sopenharmony_ci 10739750e409Sopenharmony_ci if (Unity.CurrentTestFailed) 10749750e409Sopenharmony_ci { 10759750e409Sopenharmony_ci UnityTestResultsFailBegin(lineNumber); 10769750e409Sopenharmony_ci UnityPrintExpectedAndActualStringsLen(expected, actual, length); 10779750e409Sopenharmony_ci UnityAddMsgIfSpecified(msg); 10789750e409Sopenharmony_ci UNITY_FAIL_AND_BAIL; 10799750e409Sopenharmony_ci } 10809750e409Sopenharmony_ci} 10819750e409Sopenharmony_ci 10829750e409Sopenharmony_ci/*-----------------------------------------------*/ 10839750e409Sopenharmony_civoid UnityAssertEqualStringArray(UNITY_INTERNAL_PTR expected, 10849750e409Sopenharmony_ci const char** actual, 10859750e409Sopenharmony_ci const UNITY_UINT32 num_elements, 10869750e409Sopenharmony_ci const char* msg, 10879750e409Sopenharmony_ci const UNITY_LINE_TYPE lineNumber, 10889750e409Sopenharmony_ci const UNITY_FLAGS_T flags) 10899750e409Sopenharmony_ci{ 10909750e409Sopenharmony_ci UNITY_UINT32 i = 0; 10919750e409Sopenharmony_ci UNITY_UINT32 j = 0; 10929750e409Sopenharmony_ci const char* expd = NULL; 10939750e409Sopenharmony_ci const char* act = NULL; 10949750e409Sopenharmony_ci 10959750e409Sopenharmony_ci RETURN_IF_FAIL_OR_IGNORE; 10969750e409Sopenharmony_ci 10979750e409Sopenharmony_ci /* if no elements, it's an error */ 10989750e409Sopenharmony_ci if (num_elements == 0) 10999750e409Sopenharmony_ci { 11009750e409Sopenharmony_ci UnityPrintPointlessAndBail(); 11019750e409Sopenharmony_ci } 11029750e409Sopenharmony_ci 11039750e409Sopenharmony_ci if ((const void*)expected == (const void*)actual) 11049750e409Sopenharmony_ci { 11059750e409Sopenharmony_ci return; /* Both are NULL or same pointer */ 11069750e409Sopenharmony_ci } 11079750e409Sopenharmony_ci 11089750e409Sopenharmony_ci if (UnityIsOneArrayNull((UNITY_INTERNAL_PTR)expected, (UNITY_INTERNAL_PTR)actual, lineNumber, msg)) 11099750e409Sopenharmony_ci { 11109750e409Sopenharmony_ci UNITY_FAIL_AND_BAIL; 11119750e409Sopenharmony_ci } 11129750e409Sopenharmony_ci 11139750e409Sopenharmony_ci if (flags != UNITY_ARRAY_TO_ARRAY) 11149750e409Sopenharmony_ci { 11159750e409Sopenharmony_ci expd = (const char*)expected; 11169750e409Sopenharmony_ci } 11179750e409Sopenharmony_ci 11189750e409Sopenharmony_ci do 11199750e409Sopenharmony_ci { 11209750e409Sopenharmony_ci act = actual[j]; 11219750e409Sopenharmony_ci if (flags == UNITY_ARRAY_TO_ARRAY) 11229750e409Sopenharmony_ci { 11239750e409Sopenharmony_ci expd = ((const char* const*)expected)[j]; 11249750e409Sopenharmony_ci } 11259750e409Sopenharmony_ci 11269750e409Sopenharmony_ci /* if both pointers not null compare the strings */ 11279750e409Sopenharmony_ci if (expd && act) 11289750e409Sopenharmony_ci { 11299750e409Sopenharmony_ci for (i = 0; expd[i] || act[i]; i++) 11309750e409Sopenharmony_ci { 11319750e409Sopenharmony_ci if (expd[i] != act[i]) 11329750e409Sopenharmony_ci { 11339750e409Sopenharmony_ci Unity.CurrentTestFailed = 1; 11349750e409Sopenharmony_ci break; 11359750e409Sopenharmony_ci } 11369750e409Sopenharmony_ci } 11379750e409Sopenharmony_ci } 11389750e409Sopenharmony_ci else 11399750e409Sopenharmony_ci { /* handle case of one pointers being null (if both null, test should pass) */ 11409750e409Sopenharmony_ci if (expd != act) 11419750e409Sopenharmony_ci { 11429750e409Sopenharmony_ci Unity.CurrentTestFailed = 1; 11439750e409Sopenharmony_ci } 11449750e409Sopenharmony_ci } 11459750e409Sopenharmony_ci 11469750e409Sopenharmony_ci if (Unity.CurrentTestFailed) 11479750e409Sopenharmony_ci { 11489750e409Sopenharmony_ci UnityTestResultsFailBegin(lineNumber); 11499750e409Sopenharmony_ci if (num_elements > 1) 11509750e409Sopenharmony_ci { 11519750e409Sopenharmony_ci UnityPrint(UnityStrElement); 11529750e409Sopenharmony_ci UnityPrintNumberUnsigned(j); 11539750e409Sopenharmony_ci } 11549750e409Sopenharmony_ci UnityPrintExpectedAndActualStrings(expd, act); 11559750e409Sopenharmony_ci UnityAddMsgIfSpecified(msg); 11569750e409Sopenharmony_ci UNITY_FAIL_AND_BAIL; 11579750e409Sopenharmony_ci } 11589750e409Sopenharmony_ci } while (++j < num_elements); 11599750e409Sopenharmony_ci} 11609750e409Sopenharmony_ci 11619750e409Sopenharmony_ci/*-----------------------------------------------*/ 11629750e409Sopenharmony_civoid UnityAssertEqualMemory(UNITY_INTERNAL_PTR expected, 11639750e409Sopenharmony_ci UNITY_INTERNAL_PTR actual, 11649750e409Sopenharmony_ci const UNITY_UINT32 length, 11659750e409Sopenharmony_ci const UNITY_UINT32 num_elements, 11669750e409Sopenharmony_ci const char* msg, 11679750e409Sopenharmony_ci const UNITY_LINE_TYPE lineNumber, 11689750e409Sopenharmony_ci const UNITY_FLAGS_T flags) 11699750e409Sopenharmony_ci{ 11709750e409Sopenharmony_ci UNITY_PTR_ATTRIBUTE const unsigned char* ptr_exp = (UNITY_PTR_ATTRIBUTE const unsigned char*)expected; 11719750e409Sopenharmony_ci UNITY_PTR_ATTRIBUTE const unsigned char* ptr_act = (UNITY_PTR_ATTRIBUTE const unsigned char*)actual; 11729750e409Sopenharmony_ci UNITY_UINT32 elements = num_elements; 11739750e409Sopenharmony_ci UNITY_UINT32 bytes; 11749750e409Sopenharmony_ci 11759750e409Sopenharmony_ci RETURN_IF_FAIL_OR_IGNORE; 11769750e409Sopenharmony_ci 11779750e409Sopenharmony_ci if ((elements == 0) || (length == 0)) 11789750e409Sopenharmony_ci { 11799750e409Sopenharmony_ci UnityPrintPointlessAndBail(); 11809750e409Sopenharmony_ci } 11819750e409Sopenharmony_ci 11829750e409Sopenharmony_ci if (expected == actual) return; /* Both are NULL or same pointer */ 11839750e409Sopenharmony_ci if (UnityIsOneArrayNull(expected, actual, lineNumber, msg)) 11849750e409Sopenharmony_ci UNITY_FAIL_AND_BAIL; 11859750e409Sopenharmony_ci 11869750e409Sopenharmony_ci while (elements--) 11879750e409Sopenharmony_ci { 11889750e409Sopenharmony_ci bytes = length; 11899750e409Sopenharmony_ci while (bytes--) 11909750e409Sopenharmony_ci { 11919750e409Sopenharmony_ci if (*ptr_exp != *ptr_act) 11929750e409Sopenharmony_ci { 11939750e409Sopenharmony_ci UnityTestResultsFailBegin(lineNumber); 11949750e409Sopenharmony_ci UnityPrint(UnityStrMemory); 11959750e409Sopenharmony_ci if (num_elements > 1) 11969750e409Sopenharmony_ci { 11979750e409Sopenharmony_ci UnityPrint(UnityStrElement); 11989750e409Sopenharmony_ci UnityPrintNumberUnsigned(num_elements - elements - 1); 11999750e409Sopenharmony_ci } 12009750e409Sopenharmony_ci UnityPrint(UnityStrByte); 12019750e409Sopenharmony_ci UnityPrintNumberUnsigned(length - bytes - 1); 12029750e409Sopenharmony_ci UnityPrint(UnityStrExpected); 12039750e409Sopenharmony_ci UnityPrintNumberByStyle(*ptr_exp, UNITY_DISPLAY_STYLE_HEX8); 12049750e409Sopenharmony_ci UnityPrint(UnityStrWas); 12059750e409Sopenharmony_ci UnityPrintNumberByStyle(*ptr_act, UNITY_DISPLAY_STYLE_HEX8); 12069750e409Sopenharmony_ci UnityAddMsgIfSpecified(msg); 12079750e409Sopenharmony_ci UNITY_FAIL_AND_BAIL; 12089750e409Sopenharmony_ci } 12099750e409Sopenharmony_ci ptr_exp++; 12109750e409Sopenharmony_ci ptr_act++; 12119750e409Sopenharmony_ci } 12129750e409Sopenharmony_ci if (flags == UNITY_ARRAY_TO_VAL) 12139750e409Sopenharmony_ci { 12149750e409Sopenharmony_ci ptr_exp = (UNITY_PTR_ATTRIBUTE const unsigned char*)expected; 12159750e409Sopenharmony_ci } 12169750e409Sopenharmony_ci } 12179750e409Sopenharmony_ci} 12189750e409Sopenharmony_ci 12199750e409Sopenharmony_ci/*-----------------------------------------------*/ 12209750e409Sopenharmony_ci 12219750e409Sopenharmony_cistatic union 12229750e409Sopenharmony_ci{ 12239750e409Sopenharmony_ci UNITY_INT8 i8; 12249750e409Sopenharmony_ci UNITY_INT16 i16; 12259750e409Sopenharmony_ci UNITY_INT32 i32; 12269750e409Sopenharmony_ci#ifdef UNITY_SUPPORT_64 12279750e409Sopenharmony_ci UNITY_INT64 i64; 12289750e409Sopenharmony_ci#endif 12299750e409Sopenharmony_ci#ifndef UNITY_EXCLUDE_FLOAT 12309750e409Sopenharmony_ci float f; 12319750e409Sopenharmony_ci#endif 12329750e409Sopenharmony_ci#ifndef UNITY_EXCLUDE_DOUBLE 12339750e409Sopenharmony_ci double d; 12349750e409Sopenharmony_ci#endif 12359750e409Sopenharmony_ci} UnityQuickCompare; 12369750e409Sopenharmony_ci 12379750e409Sopenharmony_ciUNITY_INTERNAL_PTR UnityNumToPtr(const UNITY_INT num, const UNITY_UINT8 size) 12389750e409Sopenharmony_ci{ 12399750e409Sopenharmony_ci switch(size) 12409750e409Sopenharmony_ci { 12419750e409Sopenharmony_ci case 1: 12429750e409Sopenharmony_ci UnityQuickCompare.i8 = (UNITY_INT8)num; 12439750e409Sopenharmony_ci return (UNITY_INTERNAL_PTR)(&UnityQuickCompare.i8); 12449750e409Sopenharmony_ci 12459750e409Sopenharmony_ci case 2: 12469750e409Sopenharmony_ci UnityQuickCompare.i16 = (UNITY_INT16)num; 12479750e409Sopenharmony_ci return (UNITY_INTERNAL_PTR)(&UnityQuickCompare.i16); 12489750e409Sopenharmony_ci 12499750e409Sopenharmony_ci#ifdef UNITY_SUPPORT_64 12509750e409Sopenharmony_ci case 8: 12519750e409Sopenharmony_ci UnityQuickCompare.i64 = (UNITY_INT64)num; 12529750e409Sopenharmony_ci return (UNITY_INTERNAL_PTR)(&UnityQuickCompare.i64); 12539750e409Sopenharmony_ci#endif 12549750e409Sopenharmony_ci default: /* 4 bytes */ 12559750e409Sopenharmony_ci UnityQuickCompare.i32 = (UNITY_INT32)num; 12569750e409Sopenharmony_ci return (UNITY_INTERNAL_PTR)(&UnityQuickCompare.i32); 12579750e409Sopenharmony_ci } 12589750e409Sopenharmony_ci} 12599750e409Sopenharmony_ci 12609750e409Sopenharmony_ci#ifndef UNITY_EXCLUDE_FLOAT 12619750e409Sopenharmony_ciUNITY_INTERNAL_PTR UnityFloatToPtr(const float num) 12629750e409Sopenharmony_ci{ 12639750e409Sopenharmony_ci UnityQuickCompare.f = num; 12649750e409Sopenharmony_ci return (UNITY_INTERNAL_PTR)(&UnityQuickCompare.f); 12659750e409Sopenharmony_ci} 12669750e409Sopenharmony_ci#endif 12679750e409Sopenharmony_ci 12689750e409Sopenharmony_ci#ifndef UNITY_EXCLUDE_DOUBLE 12699750e409Sopenharmony_ciUNITY_INTERNAL_PTR UnityDoubleToPtr(const double num) 12709750e409Sopenharmony_ci{ 12719750e409Sopenharmony_ci UnityQuickCompare.d = num; 12729750e409Sopenharmony_ci return (UNITY_INTERNAL_PTR)(&UnityQuickCompare.d); 12739750e409Sopenharmony_ci} 12749750e409Sopenharmony_ci#endif 12759750e409Sopenharmony_ci 12769750e409Sopenharmony_ci/*----------------------------------------------- 12779750e409Sopenharmony_ci * Control Functions 12789750e409Sopenharmony_ci *-----------------------------------------------*/ 12799750e409Sopenharmony_ci 12809750e409Sopenharmony_civoid UnityFail(const char* msg, const UNITY_LINE_TYPE line) 12819750e409Sopenharmony_ci{ 12829750e409Sopenharmony_ci RETURN_IF_FAIL_OR_IGNORE; 12839750e409Sopenharmony_ci 12849750e409Sopenharmony_ci UnityTestResultsBegin(Unity.TestFile, line); 12859750e409Sopenharmony_ci UnityPrint(UnityStrFail); 12869750e409Sopenharmony_ci if (msg != NULL) 12879750e409Sopenharmony_ci { 12889750e409Sopenharmony_ci UNITY_OUTPUT_CHAR(':'); 12899750e409Sopenharmony_ci 12909750e409Sopenharmony_ci#ifndef UNITY_EXCLUDE_DETAILS 12919750e409Sopenharmony_ci if (Unity.CurrentDetail1) 12929750e409Sopenharmony_ci { 12939750e409Sopenharmony_ci UnityPrint(UnityStrDetail1Name); 12949750e409Sopenharmony_ci UnityPrint(Unity.CurrentDetail1); 12959750e409Sopenharmony_ci if (Unity.CurrentDetail2) 12969750e409Sopenharmony_ci { 12979750e409Sopenharmony_ci UnityPrint(UnityStrDetail2Name); 12989750e409Sopenharmony_ci UnityPrint(Unity.CurrentDetail2); 12999750e409Sopenharmony_ci } 13009750e409Sopenharmony_ci UnityPrint(UnityStrSpacer); 13019750e409Sopenharmony_ci } 13029750e409Sopenharmony_ci#endif 13039750e409Sopenharmony_ci if (msg[0] != ' ') 13049750e409Sopenharmony_ci { 13059750e409Sopenharmony_ci UNITY_OUTPUT_CHAR(' '); 13069750e409Sopenharmony_ci } 13079750e409Sopenharmony_ci UnityPrint(msg); 13089750e409Sopenharmony_ci } 13099750e409Sopenharmony_ci 13109750e409Sopenharmony_ci UNITY_FAIL_AND_BAIL; 13119750e409Sopenharmony_ci} 13129750e409Sopenharmony_ci 13139750e409Sopenharmony_ci/*-----------------------------------------------*/ 13149750e409Sopenharmony_civoid UnityIgnore(const char* msg, const UNITY_LINE_TYPE line) 13159750e409Sopenharmony_ci{ 13169750e409Sopenharmony_ci RETURN_IF_FAIL_OR_IGNORE; 13179750e409Sopenharmony_ci 13189750e409Sopenharmony_ci UnityTestResultsBegin(Unity.TestFile, line); 13199750e409Sopenharmony_ci UnityPrint(UnityStrIgnore); 13209750e409Sopenharmony_ci if (msg != NULL) 13219750e409Sopenharmony_ci { 13229750e409Sopenharmony_ci UNITY_OUTPUT_CHAR(':'); 13239750e409Sopenharmony_ci UNITY_OUTPUT_CHAR(' '); 13249750e409Sopenharmony_ci UnityPrint(msg); 13259750e409Sopenharmony_ci } 13269750e409Sopenharmony_ci UNITY_IGNORE_AND_BAIL; 13279750e409Sopenharmony_ci} 13289750e409Sopenharmony_ci 13299750e409Sopenharmony_ci/*-----------------------------------------------*/ 13309750e409Sopenharmony_civoid UnityDefaultTestRun(UnityTestFunction Func, const char* FuncName, const int FuncLineNum) 13319750e409Sopenharmony_ci{ 13329750e409Sopenharmony_ci Unity.CurrentTestName = FuncName; 13339750e409Sopenharmony_ci Unity.CurrentTestLineNumber = (UNITY_LINE_TYPE)FuncLineNum; 13349750e409Sopenharmony_ci Unity.NumberOfTests++; 13359750e409Sopenharmony_ci UNITY_CLR_DETAILS(); 13369750e409Sopenharmony_ci if (TEST_PROTECT()) 13379750e409Sopenharmony_ci { 13389750e409Sopenharmony_ci setUp(); 13399750e409Sopenharmony_ci Func(); 13409750e409Sopenharmony_ci } 13419750e409Sopenharmony_ci if (TEST_PROTECT()) 13429750e409Sopenharmony_ci { 13439750e409Sopenharmony_ci tearDown(); 13449750e409Sopenharmony_ci } 13459750e409Sopenharmony_ci UnityConcludeTest(); 13469750e409Sopenharmony_ci} 13479750e409Sopenharmony_ci 13489750e409Sopenharmony_ci/*-----------------------------------------------*/ 13499750e409Sopenharmony_civoid UnityBegin(const char* filename) 13509750e409Sopenharmony_ci{ 13519750e409Sopenharmony_ci Unity.TestFile = filename; 13529750e409Sopenharmony_ci Unity.CurrentTestName = NULL; 13539750e409Sopenharmony_ci Unity.CurrentTestLineNumber = 0; 13549750e409Sopenharmony_ci Unity.NumberOfTests = 0; 13559750e409Sopenharmony_ci Unity.TestFailures = 0; 13569750e409Sopenharmony_ci Unity.TestIgnores = 0; 13579750e409Sopenharmony_ci Unity.CurrentTestFailed = 0; 13589750e409Sopenharmony_ci Unity.CurrentTestIgnored = 0; 13599750e409Sopenharmony_ci 13609750e409Sopenharmony_ci UNITY_CLR_DETAILS(); 13619750e409Sopenharmony_ci UNITY_OUTPUT_START(); 13629750e409Sopenharmony_ci} 13639750e409Sopenharmony_ci 13649750e409Sopenharmony_ci/*-----------------------------------------------*/ 13659750e409Sopenharmony_ciint UnityEnd(void) 13669750e409Sopenharmony_ci{ 13679750e409Sopenharmony_ci UNITY_PRINT_EOL(); 13689750e409Sopenharmony_ci UnityPrint(UnityStrBreaker); 13699750e409Sopenharmony_ci UNITY_PRINT_EOL(); 13709750e409Sopenharmony_ci UnityPrintNumber((UNITY_INT)(Unity.NumberOfTests)); 13719750e409Sopenharmony_ci UnityPrint(UnityStrResultsTests); 13729750e409Sopenharmony_ci UnityPrintNumber((UNITY_INT)(Unity.TestFailures)); 13739750e409Sopenharmony_ci UnityPrint(UnityStrResultsFailures); 13749750e409Sopenharmony_ci UnityPrintNumber((UNITY_INT)(Unity.TestIgnores)); 13759750e409Sopenharmony_ci UnityPrint(UnityStrResultsIgnored); 13769750e409Sopenharmony_ci UNITY_PRINT_EOL(); 13779750e409Sopenharmony_ci if (Unity.TestFailures == 0U) 13789750e409Sopenharmony_ci { 13799750e409Sopenharmony_ci UnityPrint(UnityStrOk); 13809750e409Sopenharmony_ci } 13819750e409Sopenharmony_ci else 13829750e409Sopenharmony_ci { 13839750e409Sopenharmony_ci UnityPrint(UnityStrFail); 13849750e409Sopenharmony_ci#ifdef UNITY_DIFFERENTIATE_FINAL_FAIL 13859750e409Sopenharmony_ci UNITY_OUTPUT_CHAR('E'); UNITY_OUTPUT_CHAR('D'); 13869750e409Sopenharmony_ci#endif 13879750e409Sopenharmony_ci } 13889750e409Sopenharmony_ci UNITY_PRINT_EOL(); 13899750e409Sopenharmony_ci UNITY_FLUSH_CALL(); 13909750e409Sopenharmony_ci UNITY_OUTPUT_COMPLETE(); 13919750e409Sopenharmony_ci return (int)(Unity.TestFailures); 13929750e409Sopenharmony_ci} 13939750e409Sopenharmony_ci 13949750e409Sopenharmony_ci/*----------------------------------------------- 13959750e409Sopenharmony_ci * Command Line Argument Support 13969750e409Sopenharmony_ci *-----------------------------------------------*/ 13979750e409Sopenharmony_ci#ifdef UNITY_USE_COMMAND_LINE_ARGS 13989750e409Sopenharmony_ci 13999750e409Sopenharmony_cichar* UnityOptionIncludeNamed = NULL; 14009750e409Sopenharmony_cichar* UnityOptionExcludeNamed = NULL; 14019750e409Sopenharmony_ciint UnityVerbosity = 1; 14029750e409Sopenharmony_ci 14039750e409Sopenharmony_ciint UnityParseOptions(int argc, char** argv) 14049750e409Sopenharmony_ci{ 14059750e409Sopenharmony_ci UnityOptionIncludeNamed = NULL; 14069750e409Sopenharmony_ci UnityOptionExcludeNamed = NULL; 14079750e409Sopenharmony_ci 14089750e409Sopenharmony_ci for (int i = 1; i < argc; i++) 14099750e409Sopenharmony_ci { 14109750e409Sopenharmony_ci if (argv[i][0] == '-') 14119750e409Sopenharmony_ci { 14129750e409Sopenharmony_ci switch (argv[i][1]) 14139750e409Sopenharmony_ci { 14149750e409Sopenharmony_ci case 'l': /* list tests */ 14159750e409Sopenharmony_ci return -1; 14169750e409Sopenharmony_ci case 'n': /* include tests with name including this string */ 14179750e409Sopenharmony_ci case 'f': /* an alias for -n */ 14189750e409Sopenharmony_ci if (argv[i][2] == '=') 14199750e409Sopenharmony_ci UnityOptionIncludeNamed = &argv[i][3]; 14209750e409Sopenharmony_ci else if (++i < argc) 14219750e409Sopenharmony_ci UnityOptionIncludeNamed = argv[i]; 14229750e409Sopenharmony_ci else 14239750e409Sopenharmony_ci { 14249750e409Sopenharmony_ci UnityPrint("ERROR: No Test String to Include Matches For"); 14259750e409Sopenharmony_ci UNITY_PRINT_EOL(); 14269750e409Sopenharmony_ci return 1; 14279750e409Sopenharmony_ci } 14289750e409Sopenharmony_ci break; 14299750e409Sopenharmony_ci case 'q': /* quiet */ 14309750e409Sopenharmony_ci UnityVerbosity = 0; 14319750e409Sopenharmony_ci break; 14329750e409Sopenharmony_ci case 'v': /* verbose */ 14339750e409Sopenharmony_ci UnityVerbosity = 2; 14349750e409Sopenharmony_ci break; 14359750e409Sopenharmony_ci case 'x': /* exclude tests with name including this string */ 14369750e409Sopenharmony_ci if (argv[i][2] == '=') 14379750e409Sopenharmony_ci UnityOptionExcludeNamed = &argv[i][3]; 14389750e409Sopenharmony_ci else if (++i < argc) 14399750e409Sopenharmony_ci UnityOptionExcludeNamed = argv[i]; 14409750e409Sopenharmony_ci else 14419750e409Sopenharmony_ci { 14429750e409Sopenharmony_ci UnityPrint("ERROR: No Test String to Exclude Matches For"); 14439750e409Sopenharmony_ci UNITY_PRINT_EOL(); 14449750e409Sopenharmony_ci return 1; 14459750e409Sopenharmony_ci } 14469750e409Sopenharmony_ci break; 14479750e409Sopenharmony_ci default: 14489750e409Sopenharmony_ci UnityPrint("ERROR: Unknown Option "); 14499750e409Sopenharmony_ci UNITY_OUTPUT_CHAR(argv[i][1]); 14509750e409Sopenharmony_ci UNITY_PRINT_EOL(); 14519750e409Sopenharmony_ci return 1; 14529750e409Sopenharmony_ci } 14539750e409Sopenharmony_ci } 14549750e409Sopenharmony_ci } 14559750e409Sopenharmony_ci 14569750e409Sopenharmony_ci return 0; 14579750e409Sopenharmony_ci} 14589750e409Sopenharmony_ci 14599750e409Sopenharmony_ciint IsStringInBiggerString(const char* longstring, const char* shortstring) 14609750e409Sopenharmony_ci{ 14619750e409Sopenharmony_ci const char* lptr = longstring; 14629750e409Sopenharmony_ci const char* sptr = shortstring; 14639750e409Sopenharmony_ci const char* lnext = lptr; 14649750e409Sopenharmony_ci 14659750e409Sopenharmony_ci if (*sptr == '*') 14669750e409Sopenharmony_ci return 1; 14679750e409Sopenharmony_ci 14689750e409Sopenharmony_ci while (*lptr) 14699750e409Sopenharmony_ci { 14709750e409Sopenharmony_ci lnext = lptr + 1; 14719750e409Sopenharmony_ci 14729750e409Sopenharmony_ci /* If they current bytes match, go on to the next bytes */ 14739750e409Sopenharmony_ci while (*lptr && *sptr && (*lptr == *sptr)) 14749750e409Sopenharmony_ci { 14759750e409Sopenharmony_ci lptr++; 14769750e409Sopenharmony_ci sptr++; 14779750e409Sopenharmony_ci 14789750e409Sopenharmony_ci /* We're done if we match the entire string or up to a wildcard */ 14799750e409Sopenharmony_ci if (*sptr == '*') 14809750e409Sopenharmony_ci return 1; 14819750e409Sopenharmony_ci if (*sptr == ',') 14829750e409Sopenharmony_ci return 1; 14839750e409Sopenharmony_ci if (*sptr == '"') 14849750e409Sopenharmony_ci return 1; 14859750e409Sopenharmony_ci if (*sptr == '\'') 14869750e409Sopenharmony_ci return 1; 14879750e409Sopenharmony_ci if (*sptr == ':') 14889750e409Sopenharmony_ci return 2; 14899750e409Sopenharmony_ci if (*sptr == 0) 14909750e409Sopenharmony_ci return 1; 14919750e409Sopenharmony_ci } 14929750e409Sopenharmony_ci 14939750e409Sopenharmony_ci /* Otherwise we start in the long pointer 1 character further and try again */ 14949750e409Sopenharmony_ci lptr = lnext; 14959750e409Sopenharmony_ci sptr = shortstring; 14969750e409Sopenharmony_ci } 14979750e409Sopenharmony_ci return 0; 14989750e409Sopenharmony_ci} 14999750e409Sopenharmony_ci 15009750e409Sopenharmony_ciint UnityStringArgumentMatches(const char* str) 15019750e409Sopenharmony_ci{ 15029750e409Sopenharmony_ci int retval; 15039750e409Sopenharmony_ci const char* ptr1; 15049750e409Sopenharmony_ci const char* ptr2; 15059750e409Sopenharmony_ci const char* ptrf; 15069750e409Sopenharmony_ci 15079750e409Sopenharmony_ci /* Go through the options and get the substrings for matching one at a time */ 15089750e409Sopenharmony_ci ptr1 = str; 15099750e409Sopenharmony_ci while (ptr1[0] != 0) 15109750e409Sopenharmony_ci { 15119750e409Sopenharmony_ci if ((ptr1[0] == '"') || (ptr1[0] == '\'')) 15129750e409Sopenharmony_ci ptr1++; 15139750e409Sopenharmony_ci 15149750e409Sopenharmony_ci /* look for the start of the next partial */ 15159750e409Sopenharmony_ci ptr2 = ptr1; 15169750e409Sopenharmony_ci ptrf = 0; 15179750e409Sopenharmony_ci do 15189750e409Sopenharmony_ci { 15199750e409Sopenharmony_ci ptr2++; 15209750e409Sopenharmony_ci if ((ptr2[0] == ':') && (ptr2[1] != 0) && (ptr2[0] != '\'') && (ptr2[0] != '"') && (ptr2[0] != ',')) 15219750e409Sopenharmony_ci ptrf = &ptr2[1]; 15229750e409Sopenharmony_ci } while ((ptr2[0] != 0) && (ptr2[0] != '\'') && (ptr2[0] != '"') && (ptr2[0] != ',')); 15239750e409Sopenharmony_ci while ((ptr2[0] != 0) && ((ptr2[0] == ':') || (ptr2[0] == '\'') || (ptr2[0] == '"') || (ptr2[0] == ','))) 15249750e409Sopenharmony_ci ptr2++; 15259750e409Sopenharmony_ci 15269750e409Sopenharmony_ci /* done if complete filename match */ 15279750e409Sopenharmony_ci retval = IsStringInBiggerString(Unity.TestFile, ptr1); 15289750e409Sopenharmony_ci if (retval == 1) 15299750e409Sopenharmony_ci return retval; 15309750e409Sopenharmony_ci 15319750e409Sopenharmony_ci /* done if testname match after filename partial match */ 15329750e409Sopenharmony_ci if ((retval == 2) && (ptrf != 0)) 15339750e409Sopenharmony_ci { 15349750e409Sopenharmony_ci if (IsStringInBiggerString(Unity.CurrentTestName, ptrf)) 15359750e409Sopenharmony_ci return 1; 15369750e409Sopenharmony_ci } 15379750e409Sopenharmony_ci 15389750e409Sopenharmony_ci /* done if complete testname match */ 15399750e409Sopenharmony_ci if (IsStringInBiggerString(Unity.CurrentTestName, ptr1) == 1) 15409750e409Sopenharmony_ci return 1; 15419750e409Sopenharmony_ci 15429750e409Sopenharmony_ci ptr1 = ptr2; 15439750e409Sopenharmony_ci } 15449750e409Sopenharmony_ci 15459750e409Sopenharmony_ci /* we couldn't find a match for any substrings */ 15469750e409Sopenharmony_ci return 0; 15479750e409Sopenharmony_ci} 15489750e409Sopenharmony_ci 15499750e409Sopenharmony_ciint UnityTestMatches(void) 15509750e409Sopenharmony_ci{ 15519750e409Sopenharmony_ci /* Check if this test name matches the included test pattern */ 15529750e409Sopenharmony_ci int retval; 15539750e409Sopenharmony_ci if (UnityOptionIncludeNamed) 15549750e409Sopenharmony_ci { 15559750e409Sopenharmony_ci retval = UnityStringArgumentMatches(UnityOptionIncludeNamed); 15569750e409Sopenharmony_ci } 15579750e409Sopenharmony_ci else 15589750e409Sopenharmony_ci retval = 1; 15599750e409Sopenharmony_ci 15609750e409Sopenharmony_ci /* Check if this test name matches the excluded test pattern */ 15619750e409Sopenharmony_ci if (UnityOptionExcludeNamed) 15629750e409Sopenharmony_ci { 15639750e409Sopenharmony_ci if (UnityStringArgumentMatches(UnityOptionExcludeNamed)) 15649750e409Sopenharmony_ci retval = 0; 15659750e409Sopenharmony_ci } 15669750e409Sopenharmony_ci return retval; 15679750e409Sopenharmony_ci} 15689750e409Sopenharmony_ci 15699750e409Sopenharmony_ci#endif /* UNITY_USE_COMMAND_LINE_ARGS */ 15709750e409Sopenharmony_ci/*-----------------------------------------------*/ 1571