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