unity.c 60.8 KB
Newer Older
M
Mark VanderVoord 已提交
1 2
/* =========================================================================
    Unity Project - A Test Framework for C
3
    Copyright (c) 2007-19 Mike Karlesky, Mark VanderVoord, Greg Williams
M
Mark VanderVoord 已提交
4 5 6 7 8 9
    [Released under MIT License. Please refer to license.txt for details]
============================================================================ */

#include "unity.h"
#include <stddef.h>

10
/* If omitted from header, declare overrideable prototypes here so they're ready for use */
11
#ifdef UNITY_OMIT_OUTPUT_CHAR_HEADER_DECLARATION
12
void UNITY_OUTPUT_CHAR(int);
13 14
#endif

15
/* Helpful macros for us to use here in Assert functions */
16 17
#define UNITY_FAIL_AND_BAIL   { Unity.CurrentTestFailed  = 1; UNITY_OUTPUT_FLUSH(); TEST_ABORT(); }
#define UNITY_IGNORE_AND_BAIL { Unity.CurrentTestIgnored = 1; UNITY_OUTPUT_FLUSH(); TEST_ABORT(); }
18
#define RETURN_IF_FAIL_OR_IGNORE if (Unity.CurrentTestFailed || Unity.CurrentTestIgnored) return
M
Mark VanderVoord 已提交
19

20
struct UNITY_STORAGE_T Unity;
M
Mark VanderVoord 已提交
21

22
#ifdef UNITY_OUTPUT_COLOR
23 24 25 26
const char UnityStrOk[]                            = "\033[42mOK\033[00m";
const char UnityStrPass[]                          = "\033[42mPASS\033[00m";
const char UnityStrFail[]                          = "\033[41mFAIL\033[00m";
const char UnityStrIgnore[]                        = "\033[43mIGNORE\033[00m";
27
#else
28 29 30 31
const char UnityStrOk[]                            = "OK";
const char UnityStrPass[]                          = "PASS";
const char UnityStrFail[]                          = "FAIL";
const char UnityStrIgnore[]                        = "IGNORE";
32
#endif
33 34 35 36
static const char UnityStrNull[]                   = "NULL";
static const char UnityStrSpacer[]                 = ". ";
static const char UnityStrExpected[]               = " Expected ";
static const char UnityStrWas[]                    = " Was ";
37 38
static const char UnityStrGt[]                     = " to be greater than ";
static const char UnityStrLt[]                     = " to be less than ";
39
static const char UnityStrOrEqual[]                = "or equal to ";
40 41 42 43 44 45 46
static const char UnityStrElement[]                = " Element ";
static const char UnityStrByte[]                   = " Byte ";
static const char UnityStrMemory[]                 = " Memory Mismatch.";
static const char UnityStrDelta[]                  = " Values Not Within Delta ";
static const char UnityStrPointless[]              = " You Asked Me To Compare Nothing, Which Was Pointless.";
static const char UnityStrNullPointerForExpected[] = " Expected pointer to be NULL";
static const char UnityStrNullPointerForActual[]   = " Actual pointer was NULL";
47
#ifndef UNITY_EXCLUDE_FLOAT
48 49 50 51 52 53
static const char UnityStrNot[]                    = "Not ";
static const char UnityStrInf[]                    = "Infinity";
static const char UnityStrNegInf[]                 = "Negative Infinity";
static const char UnityStrNaN[]                    = "NaN";
static const char UnityStrDet[]                    = "Determinate";
static const char UnityStrInvalidFloatTrait[]      = "Invalid Float Trait";
54
#endif
55
const char UnityStrErrShorthand[]                  = "Unity Shorthand Support Disabled";
56 57 58 59 60 61 62 63 64
const char UnityStrErrFloat[]                      = "Unity Floating Point Disabled";
const char UnityStrErrDouble[]                     = "Unity Double Precision Disabled";
const char UnityStrErr64[]                         = "Unity 64-bit Support Disabled";
static const char UnityStrBreaker[]                = "-----------------------";
static const char UnityStrResultsTests[]           = " Tests ";
static const char UnityStrResultsFailures[]        = " Failures ";
static const char UnityStrResultsIgnored[]         = " Ignored ";
static const char UnityStrDetail1Name[]            = UNITY_DETAIL1_NAME " ";
static const char UnityStrDetail2Name[]            = " " UNITY_DETAIL2_NAME " ";
M
Mark VanderVoord 已提交
65

66 67 68
/*-----------------------------------------------
 * Pretty Printers & Test Result Output Handlers
 *-----------------------------------------------*/
M
Mark VanderVoord 已提交
69

F
Fabian Zahn 已提交
70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
/*-----------------------------------------------*/
/* Local helper function to print characters. */
static void UnityPrintChar(const char* pch)
{
    /* printable characters plus CR & LF are printed */
    if ((*pch <= 126) && (*pch >= 32))
    {
        UNITY_OUTPUT_CHAR(*pch);
    }
    /* write escaped carriage returns */
    else if (*pch == 13)
    {
        UNITY_OUTPUT_CHAR('\\');
        UNITY_OUTPUT_CHAR('r');
    }
    /* write escaped line feeds */
    else if (*pch == 10)
    {
        UNITY_OUTPUT_CHAR('\\');
        UNITY_OUTPUT_CHAR('n');
    }
    /* unprintable characters are shown as codes */
    else
    {
        UNITY_OUTPUT_CHAR('\\');
        UNITY_OUTPUT_CHAR('x');
        UnityPrintNumberHex((UNITY_UINT)*pch, 2);
    }
}

/*-----------------------------------------------*/
101
/* Local helper function to print ANSI escape strings e.g. "\033[42m". */
F
Fabian Zahn 已提交
102 103 104 105 106 107
#ifdef UNITY_OUTPUT_COLOR
static UNITY_UINT UnityPrintAnsiEscapeString(const char* string)
{
    const char* pch = string;
    UNITY_UINT count = 0;

108
    while (*pch && (*pch != 'm'))
F
Fabian Zahn 已提交
109 110 111 112 113 114 115 116 117 118 119 120
    {
        UNITY_OUTPUT_CHAR(*pch);
        pch++;
        count++;
    }
    UNITY_OUTPUT_CHAR('m');
    count++;

    return count;
}
#endif

K
Kochise 已提交
121
/*-----------------------------------------------*/
M
Mark VanderVoord 已提交
122 123 124 125 126 127 128 129
void UnityPrint(const char* string)
{
    const char* pch = string;

    if (pch != NULL)
    {
        while (*pch)
        {
F
Fabian Zahn 已提交
130 131
#ifdef UNITY_OUTPUT_COLOR
            /* print ANSI escape code */
132
            if ((*pch == 27) && (*(pch + 1) == '['))
M
Mark VanderVoord 已提交
133
            {
F
Fabian Zahn 已提交
134 135
                pch += UnityPrintAnsiEscapeString(pch);
                continue;
M
Mark VanderVoord 已提交
136
            }
F
Fabian Zahn 已提交
137 138 139 140 141 142 143 144
#endif
            UnityPrintChar(pch);
            pch++;
        }
    }
}

/*-----------------------------------------------*/
145 146
#ifdef UNITY_INCLUDE_PRINT_FORMATTED
void UnityPrintFormatted(const char* format, ...)
F
Fabian Zahn 已提交
147 148 149 150 151 152 153 154 155 156 157
{
    const char* pch = format;
    va_list va;
    va_start(va, format);

    if (pch != NULL)
    {
        while (*pch)
        {
            /* format identification character */
            if (*pch == '%')
M
Mark VanderVoord 已提交
158
            {
F
Fabian Zahn 已提交
159 160 161 162 163 164 165 166 167
                pch++;

                if (pch != NULL)
                {
                    switch (*pch)
                    {
                        case 'd':
                        case 'i':
                            {
168 169
                                const int number = va_arg(va, int);
                                UnityPrintNumber((UNITY_INT)number);
F
Fabian Zahn 已提交
170 171
                                break;
                            }
172 173 174 175 176 177 178 179 180
#ifndef UNITY_EXCLUDE_FLOAT_PRINT
                        case 'f':
                        case 'g':
                            {
                                const double number = va_arg(va, double);
                                UnityPrintFloat((UNITY_DOUBLE)number);
                                break;
                            }
#endif
F
Fabian Zahn 已提交
181 182
                        case 'u':
                            {
183 184 185 186 187 188 189 190 191 192 193
                                const unsigned int number = va_arg(va, unsigned int);
                                UnityPrintNumberUnsigned((UNITY_UINT)number);
                                break;
                            }
                        case 'b':
                            {
                                const unsigned int number = va_arg(va, unsigned int);
                                const UNITY_UINT mask = (UNITY_UINT)0 - (UNITY_UINT)1;
                                UNITY_OUTPUT_CHAR('0');
                                UNITY_OUTPUT_CHAR('b');
                                UnityPrintMask(mask, (UNITY_UINT)number);
F
Fabian Zahn 已提交
194 195 196 197 198 199
                                break;
                            }
                        case 'x':
                        case 'X':
                        case 'p':
                            {
200
                                const unsigned int number = va_arg(va, unsigned int);
F
Fabian Zahn 已提交
201 202
                                UNITY_OUTPUT_CHAR('0');
                                UNITY_OUTPUT_CHAR('x');
203
                                UnityPrintNumberHex((UNITY_UINT)number, 8);
F
Fabian Zahn 已提交
204 205 206 207
                                break;
                            }
                        case 'c':
                            {
208
                                const int ch = va_arg(va, int);
F
Fabian Zahn 已提交
209 210 211 212
                                UnityPrintChar((const char *)&ch);
                                break;
                            }
                        case 's':
213 214
                            {
                                const char * string = va_arg(va, const char *);
F
Fabian Zahn 已提交
215 216 217 218
                                UnityPrint(string);
                                break;
                            }
                        case '%':
219 220 221 222
                            {
                                UnityPrintChar(pch);
                                break;
                            }
F
Fabian Zahn 已提交
223
                        default:
224
                            {
225
                                /* print the unknown format character */
226 227 228 229
                                UNITY_OUTPUT_CHAR('%');
                                UnityPrintChar(pch);
                                break;
                            }
F
Fabian Zahn 已提交
230 231
                    }
                }
M
Mark VanderVoord 已提交
232
            }
233 234
#ifdef UNITY_OUTPUT_COLOR
            /* print ANSI escape code */
235
            else if ((*pch == 27) && (*(pch + 1) == '['))
236
            {
F
Fabian Zahn 已提交
237 238
                pch += UnityPrintAnsiEscapeString(pch);
                continue;
239 240
            }
#endif
F
Fabian Zahn 已提交
241 242 243 244
            else if (*pch == '\n')
            {
                UNITY_PRINT_EOL();
            }
M
Mark VanderVoord 已提交
245 246
            else
            {
F
Fabian Zahn 已提交
247
                UnityPrintChar(pch);
M
Mark VanderVoord 已提交
248
            }
F
Fabian Zahn 已提交
249

M
Mark VanderVoord 已提交
250 251 252
            pch++;
        }
    }
F
Fabian Zahn 已提交
253 254

    va_end(va);
M
Mark VanderVoord 已提交
255
}
256
#endif /* ! UNITY_INCLUDE_PRINT_FORMATTED */
M
Mark VanderVoord 已提交
257

K
Kochise 已提交
258
/*-----------------------------------------------*/
259
void UnityPrintLen(const char* string, const UNITY_UINT32 length)
M
Mark VanderVoord 已提交
260 261 262 263 264
{
    const char* pch = string;

    if (pch != NULL)
    {
265
        while (*pch && ((UNITY_UINT32)(pch - string) < length))
M
Mark VanderVoord 已提交
266
        {
267
            /* printable characters plus CR & LF are printed */
M
Mark VanderVoord 已提交
268 269 270 271
            if ((*pch <= 126) && (*pch >= 32))
            {
                UNITY_OUTPUT_CHAR(*pch);
            }
272
            /* write escaped carriage returns */
M
Mark VanderVoord 已提交
273 274 275 276 277
            else if (*pch == 13)
            {
                UNITY_OUTPUT_CHAR('\\');
                UNITY_OUTPUT_CHAR('r');
            }
278
            /* write escaped line feeds */
M
Mark VanderVoord 已提交
279 280 281 282 283
            else if (*pch == 10)
            {
                UNITY_OUTPUT_CHAR('\\');
                UNITY_OUTPUT_CHAR('n');
            }
284
            /* unprintable characters are shown as codes */
M
Mark VanderVoord 已提交
285 286 287
            else
            {
                UNITY_OUTPUT_CHAR('\\');
288
                UNITY_OUTPUT_CHAR('x');
289
                UnityPrintNumberHex((UNITY_UINT)*pch, 2);
M
Mark VanderVoord 已提交
290 291 292 293 294 295
            }
            pch++;
        }
    }
}

296
/*-----------------------------------------------*/
297
void UnityPrintNumberByStyle(const UNITY_INT number, const UNITY_DISPLAY_STYLE_T style)
M
Mark VanderVoord 已提交
298 299 300 301 302 303 304
{
    if ((style & UNITY_DISPLAY_RANGE_INT) == UNITY_DISPLAY_RANGE_INT)
    {
        UnityPrintNumber(number);
    }
    else if ((style & UNITY_DISPLAY_RANGE_UINT) == UNITY_DISPLAY_RANGE_UINT)
    {
305
        UnityPrintNumberUnsigned((UNITY_UINT)number);
M
Mark VanderVoord 已提交
306 307 308
    }
    else
    {
309 310
        UNITY_OUTPUT_CHAR('0');
        UNITY_OUTPUT_CHAR('x');
311
        UnityPrintNumberHex((UNITY_UINT)number, (char)((style & 0xF) * 2));
M
Mark VanderVoord 已提交
312 313 314
    }
}

315
/*-----------------------------------------------*/
316
void UnityPrintNumber(const UNITY_INT number_to_print)
M
Mark VanderVoord 已提交
317
{
318
    UNITY_UINT number = (UNITY_UINT)number_to_print;
M
Mark VanderVoord 已提交
319 320 321

    if (number_to_print < 0)
    {
322
        /* A negative number, including MIN negative */
M
Mark VanderVoord 已提交
323
        UNITY_OUTPUT_CHAR('-');
324
        number = (UNITY_UINT)-number_to_print;
M
Mark VanderVoord 已提交
325
    }
326
    UnityPrintNumberUnsigned(number);
M
Mark VanderVoord 已提交
327 328
}

329 330
/*-----------------------------------------------
 * basically do an itoa using as little ram as possible */
331
void UnityPrintNumberUnsigned(const UNITY_UINT number)
M
Mark VanderVoord 已提交
332
{
333
    UNITY_UINT divisor = 1;
M
Mark VanderVoord 已提交
334

335
    /* figure out initial divisor */
M
Mark VanderVoord 已提交
336 337
    while (number / divisor > 9)
    {
338
        divisor *= 10;
M
Mark VanderVoord 已提交
339 340
    }

341
    /* now mod and print, then divide divisor */
M
Mark VanderVoord 已提交
342 343 344 345
    do
    {
        UNITY_OUTPUT_CHAR((char)('0' + (number / divisor % 10)));
        divisor /= 10;
346
    } while (divisor > 0);
M
Mark VanderVoord 已提交
347 348
}

349
/*-----------------------------------------------*/
350
void UnityPrintNumberHex(const UNITY_UINT number, const char nibbles_to_print)
M
Mark VanderVoord 已提交
351
{
352
    int nibble;
M
Mark VanderVoord 已提交
353
    char nibbles = nibbles_to_print;
354

355
    if ((unsigned)nibbles > UNITY_MAX_NIBBLES)
K
Kochise 已提交
356
    {
357
        nibbles = UNITY_MAX_NIBBLES;
K
Kochise 已提交
358
    }
M
Mark VanderVoord 已提交
359 360 361

    while (nibbles > 0)
    {
362
        nibbles--;
363
        nibble = (int)(number >> (nibbles * 4)) & 0x0F;
M
Mark VanderVoord 已提交
364 365 366 367 368 369 370 371 372 373 374
        if (nibble <= 9)
        {
            UNITY_OUTPUT_CHAR((char)('0' + nibble));
        }
        else
        {
            UNITY_OUTPUT_CHAR((char)('A' - 10 + nibble));
        }
    }
}

375
/*-----------------------------------------------*/
376
void UnityPrintMask(const UNITY_UINT mask, const UNITY_UINT number)
M
Mark VanderVoord 已提交
377
{
378 379
    UNITY_UINT current_bit = (UNITY_UINT)1 << (UNITY_INT_WIDTH - 1);
    UNITY_INT32 i;
M
Mark VanderVoord 已提交
380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401

    for (i = 0; i < UNITY_INT_WIDTH; i++)
    {
        if (current_bit & mask)
        {
            if (current_bit & number)
            {
                UNITY_OUTPUT_CHAR('1');
            }
            else
            {
                UNITY_OUTPUT_CHAR('0');
            }
        }
        else
        {
            UNITY_OUTPUT_CHAR('X');
        }
        current_bit = current_bit >> 1;
    }
}

402
/*-----------------------------------------------*/
J
jsalling 已提交
403
#ifndef UNITY_EXCLUDE_FLOAT_PRINT
404 405
/*
 * This function prints a floating-point value in a format similar to
406 407 408 409
 * printf("%.7g") on a single-precision machine or printf("%.9g") on a
 * double-precision machine.  The 7th digit won't always be totally correct
 * in single-precision operation (for that level of accuracy, a more
 * complicated algorithm would be needed).
410
 */
411
void UnityPrintFloat(const UNITY_DOUBLE input_number)
M
Mark VanderVoord 已提交
412
{
413 414 415 416 417 418 419 420 421 422
#ifdef UNITY_INCLUDE_DOUBLE
    static const int sig_digits = 9;
    static const UNITY_INT32 min_scaled = 100000000;
    static const UNITY_INT32 max_scaled = 1000000000;
#else
    static const int sig_digits = 7;
    static const UNITY_INT32 min_scaled = 1000000;
    static const UNITY_INT32 max_scaled = 10000000;
#endif

423
    UNITY_DOUBLE number = input_number;
424

425
    /* print minus sign (including for negative zero) */
426
    if ((number < 0.0f) || ((number == 0.0f) && ((1.0f / number) < 0.0f)))
J
jsalling 已提交
427 428
    {
        UNITY_OUTPUT_CHAR('-');
429
        number = -number;
J
jsalling 已提交
430
    }
431

432
    /* handle zero, NaN, and +/- infinity */
K
Kochise 已提交
433 434 435 436 437 438 439 440 441 442 443 444
    if (number == 0.0f)
    {
        UnityPrint("0");
    }
    else if (isnan(number))
    {
        UnityPrint("nan");
    }
    else if (isinf(number))
    {
        UnityPrint("inf");
    }
445
    else
J
jsalling 已提交
446
    {
J
John Lindgren 已提交
447
        UNITY_INT32 n_int = 0, n;
448
        int exponent = 0;
J
John Lindgren 已提交
449
        int decimals, digits;
K
Kyle Krueger 已提交
450
        char buf[16] = {0};
451

452 453 454 455 456 457 458
        /*
         * Scale up or down by powers of 10.  To minimize rounding error,
         * start with a factor/divisor of 10^10, which is the largest
         * power of 10 that can be represented exactly.  Finally, compute
         * (exactly) the remaining power of 10 and perform one more
         * multiplication or division.
         */
459
        if (number < 1.0f)
460 461 462
        {
            UNITY_DOUBLE factor = 1.0f;

463
            while (number < (UNITY_DOUBLE)max_scaled / 1e10f)  { number *= 1e10f; exponent -= 10; }
464
            while (number * factor < (UNITY_DOUBLE)min_scaled) { factor *= 10.0f; exponent--; }
465 466 467

            number *= factor;
        }
468
        else if (number > (UNITY_DOUBLE)max_scaled)
469 470 471
        {
            UNITY_DOUBLE divisor = 1.0f;

472
            while (number > (UNITY_DOUBLE)min_scaled * 1e10f)   { number  /= 1e10f; exponent += 10; }
473
            while (number / divisor > (UNITY_DOUBLE)max_scaled) { divisor *= 10.0f; exponent++; }
474 475 476

            number /= divisor;
        }
477 478 479 480 481 482 483 484
        else
        {
            /*
             * In this range, we can split off the integer part before
             * doing any multiplications.  This reduces rounding error by
             * freeing up significant bits in the fractional part.
             */
            UNITY_DOUBLE factor = 1.0f;
J
John Lindgren 已提交
485 486
            n_int = (UNITY_INT32)number;
            number -= (UNITY_DOUBLE)n_int;
487

J
John Lindgren 已提交
488
            while (n_int < min_scaled) { n_int *= 10; factor *= 10.0f; exponent--; }
489 490 491

            number *= factor;
        }
492 493

        /* round to nearest integer */
J
John Lindgren 已提交
494
        n = ((UNITY_INT32)(number + number) + 1) / 2;
J
John Lindgren 已提交
495 496 497

#ifndef UNITY_ROUND_TIES_AWAY_FROM_ZERO
        /* round to even if exactly between two integers */
498
        if ((n & 1) && (((UNITY_DOUBLE)n - number) == 0.5f))
J
John Lindgren 已提交
499 500 501 502 503
            n--;
#endif

        n += n_int;

504
        if (n >= max_scaled)
505
        {
506
            n = min_scaled;
507
            exponent++;
508 509
        }

510
        /* determine where to place decimal point */
511
        decimals = ((exponent <= 0) && (exponent >= -(sig_digits + 3))) ? (-exponent) : (sig_digits - 1);
512 513 514
        exponent += decimals;

        /* truncate trailing zeroes after decimal point */
515
        while ((decimals > 0) && ((n % 10) == 0))
516
        {
517 518 519 520 521
            n /= 10;
            decimals--;
        }

        /* build up buffer in reverse order */
J
John Lindgren 已提交
522
        digits = 0;
523
        while ((n != 0) || (digits < (decimals + 1)))
524 525 526 527 528 529
        {
            buf[digits++] = (char)('0' + n % 10);
            n /= 10;
        }
        while (digits > 0)
        {
530
            if (digits == decimals) { UNITY_OUTPUT_CHAR('.'); }
531 532 533 534 535 536 537 538
            UNITY_OUTPUT_CHAR(buf[--digits]);
        }

        /* print exponent if needed */
        if (exponent != 0)
        {
            UNITY_OUTPUT_CHAR('e');

539
            if (exponent < 0)
540 541 542 543 544 545 546 547 548 549
            {
                UNITY_OUTPUT_CHAR('-');
                exponent = -exponent;
            }
            else
            {
                UNITY_OUTPUT_CHAR('+');
            }

            digits = 0;
550
            while ((exponent != 0) || (digits < 2))
551 552 553 554 555 556 557 558
            {
                buf[digits++] = (char)('0' + exponent % 10);
                exponent /= 10;
            }
            while (digits > 0)
            {
                UNITY_OUTPUT_CHAR(buf[--digits]);
            }
559
        }
J
jsalling 已提交
560
    }
M
Mark VanderVoord 已提交
561
}
J
jsalling 已提交
562
#endif /* ! UNITY_EXCLUDE_FLOAT_PRINT */
M
Mark VanderVoord 已提交
563

564
/*-----------------------------------------------*/
M
Mark VanderVoord 已提交
565 566 567 568
static void UnityTestResultsBegin(const char* file, const UNITY_LINE_TYPE line)
{
    UnityPrint(file);
    UNITY_OUTPUT_CHAR(':');
569
    UnityPrintNumber((UNITY_INT)line);
M
Mark VanderVoord 已提交
570 571 572 573 574
    UNITY_OUTPUT_CHAR(':');
    UnityPrint(Unity.CurrentTestName);
    UNITY_OUTPUT_CHAR(':');
}

575
/*-----------------------------------------------*/
M
Mark VanderVoord 已提交
576 577 578 579 580 581 582
static void UnityTestResultsFailBegin(const UNITY_LINE_TYPE line)
{
    UnityTestResultsBegin(Unity.TestFile, line);
    UnityPrint(UnityStrFail);
    UNITY_OUTPUT_CHAR(':');
}

583
/*-----------------------------------------------*/
M
Mark VanderVoord 已提交
584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601
void UnityConcludeTest(void)
{
    if (Unity.CurrentTestIgnored)
    {
        Unity.TestIgnores++;
    }
    else if (!Unity.CurrentTestFailed)
    {
        UnityTestResultsBegin(Unity.TestFile, Unity.CurrentTestLineNumber);
        UnityPrint(UnityStrPass);
    }
    else
    {
        Unity.TestFailures++;
    }

    Unity.CurrentTestFailed = 0;
    Unity.CurrentTestIgnored = 0;
602
    UNITY_PRINT_EXEC_TIME();
M
Mark VanderVoord 已提交
603
    UNITY_PRINT_EOL();
604
    UNITY_FLUSH_CALL();
M
Mark VanderVoord 已提交
605 606
}

607
/*-----------------------------------------------*/
M
Mark VanderVoord 已提交
608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629
static void UnityAddMsgIfSpecified(const char* msg)
{
    if (msg)
    {
        UnityPrint(UnityStrSpacer);
#ifndef UNITY_EXCLUDE_DETAILS
        if (Unity.CurrentDetail1)
        {
            UnityPrint(UnityStrDetail1Name);
            UnityPrint(Unity.CurrentDetail1);
            if (Unity.CurrentDetail2)
            {
                UnityPrint(UnityStrDetail2Name);
                UnityPrint(Unity.CurrentDetail2);
            }
            UnityPrint(UnityStrSpacer);
        }
#endif
        UnityPrint(msg);
    }
}

630
/*-----------------------------------------------*/
M
Mark VanderVoord 已提交
631 632 633 634 635 636 637 638 639 640 641
static void UnityPrintExpectedAndActualStrings(const char* expected, const char* actual)
{
    UnityPrint(UnityStrExpected);
    if (expected != NULL)
    {
        UNITY_OUTPUT_CHAR('\'');
        UnityPrint(expected);
        UNITY_OUTPUT_CHAR('\'');
    }
    else
    {
642
        UnityPrint(UnityStrNull);
M
Mark VanderVoord 已提交
643 644 645 646 647 648 649 650 651 652
    }
    UnityPrint(UnityStrWas);
    if (actual != NULL)
    {
        UNITY_OUTPUT_CHAR('\'');
        UnityPrint(actual);
        UNITY_OUTPUT_CHAR('\'');
    }
    else
    {
653
        UnityPrint(UnityStrNull);
M
Mark VanderVoord 已提交
654 655 656
    }
}

657
/*-----------------------------------------------*/
658 659 660
static void UnityPrintExpectedAndActualStringsLen(const char* expected,
                                                  const char* actual,
                                                  const UNITY_UINT32 length)
M
Mark VanderVoord 已提交
661 662 663 664 665 666 667 668 669 670
{
    UnityPrint(UnityStrExpected);
    if (expected != NULL)
    {
        UNITY_OUTPUT_CHAR('\'');
        UnityPrintLen(expected, length);
        UNITY_OUTPUT_CHAR('\'');
    }
    else
    {
671
        UnityPrint(UnityStrNull);
M
Mark VanderVoord 已提交
672 673 674 675 676 677 678 679 680 681
    }
    UnityPrint(UnityStrWas);
    if (actual != NULL)
    {
        UNITY_OUTPUT_CHAR('\'');
        UnityPrintLen(actual, length);
        UNITY_OUTPUT_CHAR('\'');
    }
    else
    {
682
        UnityPrint(UnityStrNull);
M
Mark VanderVoord 已提交
683 684 685
    }
}

686 687 688
/*-----------------------------------------------
 * Assertion & Control Helpers
 *-----------------------------------------------*/
M
Mark VanderVoord 已提交
689

K
Kochise 已提交
690
/*-----------------------------------------------*/
691 692 693 694
static int UnityIsOneArrayNull(UNITY_INTERNAL_PTR expected,
                               UNITY_INTERNAL_PTR actual,
                               const UNITY_LINE_TYPE lineNumber,
                               const char* msg)
M
Mark VanderVoord 已提交
695
{
696 697
    /* Both are NULL or same pointer */
    if (expected == actual) { return 0; }
M
Mark VanderVoord 已提交
698

699
    /* print and return true if just expected is NULL */
M
Mark VanderVoord 已提交
700 701 702 703 704
    if (expected == NULL)
    {
        UnityTestResultsFailBegin(lineNumber);
        UnityPrint(UnityStrNullPointerForExpected);
        UnityAddMsgIfSpecified(msg);
705
        return 1;
M
Mark VanderVoord 已提交
706 707
    }

708
    /* print and return true if just actual is NULL */
M
Mark VanderVoord 已提交
709 710 711 712 713
    if (actual == NULL)
    {
        UnityTestResultsFailBegin(lineNumber);
        UnityPrint(UnityStrNullPointerForActual);
        UnityAddMsgIfSpecified(msg);
714
        return 1;
M
Mark VanderVoord 已提交
715 716
    }

717
    return 0; /* return false if neither is NULL */
M
Mark VanderVoord 已提交
718 719
}

720 721 722
/*-----------------------------------------------
 * Assertion Functions
 *-----------------------------------------------*/
M
Mark VanderVoord 已提交
723

K
Kochise 已提交
724
/*-----------------------------------------------*/
725 726 727
void UnityAssertBits(const UNITY_INT mask,
                     const UNITY_INT expected,
                     const UNITY_INT actual,
M
Mark VanderVoord 已提交
728 729 730
                     const char* msg,
                     const UNITY_LINE_TYPE lineNumber)
{
731
    RETURN_IF_FAIL_OR_IGNORE;
M
Mark VanderVoord 已提交
732 733 734 735 736

    if ((mask & expected) != (mask & actual))
    {
        UnityTestResultsFailBegin(lineNumber);
        UnityPrint(UnityStrExpected);
737
        UnityPrintMask((UNITY_UINT)mask, (UNITY_UINT)expected);
M
Mark VanderVoord 已提交
738
        UnityPrint(UnityStrWas);
739
        UnityPrintMask((UNITY_UINT)mask, (UNITY_UINT)actual);
M
Mark VanderVoord 已提交
740 741 742 743 744
        UnityAddMsgIfSpecified(msg);
        UNITY_FAIL_AND_BAIL;
    }
}

745
/*-----------------------------------------------*/
746 747
void UnityAssertEqualNumber(const UNITY_INT expected,
                            const UNITY_INT actual,
M
Mark VanderVoord 已提交
748 749 750 751
                            const char* msg,
                            const UNITY_LINE_TYPE lineNumber,
                            const UNITY_DISPLAY_STYLE_T style)
{
752
    RETURN_IF_FAIL_OR_IGNORE;
M
Mark VanderVoord 已提交
753 754 755 756 757 758 759 760 761 762 763 764 765

    if (expected != actual)
    {
        UnityTestResultsFailBegin(lineNumber);
        UnityPrint(UnityStrExpected);
        UnityPrintNumberByStyle(expected, style);
        UnityPrint(UnityStrWas);
        UnityPrintNumberByStyle(actual, style);
        UnityAddMsgIfSpecified(msg);
        UNITY_FAIL_AND_BAIL;
    }
}

766
/*-----------------------------------------------*/
767 768 769 770 771 772
void UnityAssertGreaterOrLessOrEqualNumber(const UNITY_INT threshold,
                                           const UNITY_INT actual,
                                           const UNITY_COMPARISON_T compare,
                                           const char *msg,
                                           const UNITY_LINE_TYPE lineNumber,
                                           const UNITY_DISPLAY_STYLE_T style)
773
{
774
    int failed = 0;
775 776
    RETURN_IF_FAIL_OR_IGNORE;

777 778
    if ((threshold == actual) && (compare & UNITY_EQUAL_TO)) { return; }
    if ((threshold == actual))                               { failed = 1; }
779 780

    if ((style & UNITY_DISPLAY_RANGE_INT) == UNITY_DISPLAY_RANGE_INT)
781
    {
782 783
        if ((actual > threshold) && (compare & UNITY_SMALLER_THAN)) { failed = 1; }
        if ((actual < threshold) && (compare & UNITY_GREATER_THAN)) { failed = 1; }
784 785 786
    }
    else /* UINT or HEX */
    {
787 788
        if (((UNITY_UINT)actual > (UNITY_UINT)threshold) && (compare & UNITY_SMALLER_THAN)) { failed = 1; }
        if (((UNITY_UINT)actual < (UNITY_UINT)threshold) && (compare & UNITY_GREATER_THAN)) { failed = 1; }
789 790
    }

791
    if (failed)
792 793 794 795
    {
        UnityTestResultsFailBegin(lineNumber);
        UnityPrint(UnityStrExpected);
        UnityPrintNumberByStyle(actual, style);
796 797 798
        if (compare & UNITY_GREATER_THAN) { UnityPrint(UnityStrGt);      }
        if (compare & UNITY_SMALLER_THAN) { UnityPrint(UnityStrLt);      }
        if (compare & UNITY_EQUAL_TO)     { UnityPrint(UnityStrOrEqual); }
799 800 801 802 803 804
        UnityPrintNumberByStyle(threshold, style);
        UnityAddMsgIfSpecified(msg);
        UNITY_FAIL_AND_BAIL;
    }
}

805 806 807 808 809 810 811
#define UnityPrintPointlessAndBail()       \
{                                          \
    UnityTestResultsFailBegin(lineNumber); \
    UnityPrint(UnityStrPointless);         \
    UnityAddMsgIfSpecified(msg);           \
    UNITY_FAIL_AND_BAIL; }

812
/*-----------------------------------------------*/
M
Mark VanderVoord 已提交
813 814
void UnityAssertEqualIntArray(UNITY_INTERNAL_PTR expected,
                              UNITY_INTERNAL_PTR actual,
815
                              const UNITY_UINT32 num_elements,
M
Mark VanderVoord 已提交
816 817
                              const char* msg,
                              const UNITY_LINE_TYPE lineNumber,
818 819
                              const UNITY_DISPLAY_STYLE_T style,
                              const UNITY_FLAGS_T flags)
M
Mark VanderVoord 已提交
820
{
821 822 823
    UNITY_UINT32 elements  = num_elements;
    unsigned int length    = style & 0xF;
    unsigned int increment = 0;
M
Mark VanderVoord 已提交
824

825
    RETURN_IF_FAIL_OR_IGNORE;
M
Mark VanderVoord 已提交
826

827 828 829 830
    if (num_elements == 0)
    {
        UnityPrintPointlessAndBail();
    }
M
Mark VanderVoord 已提交
831

K
Kochise 已提交
832 833 834 835 836
    if (expected == actual)
    {
        return; /* Both are NULL or same pointer */
    }

837
    if (UnityIsOneArrayNull(expected, actual, lineNumber, msg))
K
Kochise 已提交
838
    {
839
        UNITY_FAIL_AND_BAIL;
K
Kochise 已提交
840
    }
M
Mark VanderVoord 已提交
841

842
    while ((elements > 0) && (elements--))
M
Mark VanderVoord 已提交
843
    {
844 845
        UNITY_INT expect_val;
        UNITY_INT actual_val;
846

847 848 849 850 851
        switch (length)
        {
            case 1:
                expect_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT8*)expected;
                actual_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT8*)actual;
852
                increment  = sizeof(UNITY_INT8);
853
                break;
854

855 856 857
            case 2:
                expect_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT16*)expected;
                actual_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT16*)actual;
858
                increment  = sizeof(UNITY_INT16);
859
                break;
860

M
Mark VanderVoord 已提交
861
#ifdef UNITY_SUPPORT_64
862 863 864
            case 8:
                expect_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT64*)expected;
                actual_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT64*)actual;
865
                increment  = sizeof(UNITY_INT64);
866
                break;
M
Mark VanderVoord 已提交
867
#endif
868 869 870

            default: /* default is length 4 bytes */
            case 4:
871 872
                expect_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT32*)expected;
                actual_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT32*)actual;
873
                increment  = sizeof(UNITY_INT32);
874 875
                length = 4;
                break;
876 877 878 879
        }

        if (expect_val != actual_val)
        {
880
            if ((style & UNITY_DISPLAY_RANGE_UINT) && (length < (UNITY_INT_WIDTH / 8)))
881 882 883 884 885 886
            {   /* For UINT, remove sign extension (padding 1's) from signed type casts above */
                UNITY_INT mask = 1;
                mask = (mask << 8 * length) - 1;
                expect_val &= mask;
                actual_val &= mask;
            }
887 888 889 890 891 892 893 894 895 896
            UnityTestResultsFailBegin(lineNumber);
            UnityPrint(UnityStrElement);
            UnityPrintNumberUnsigned(num_elements - elements - 1);
            UnityPrint(UnityStrExpected);
            UnityPrintNumberByStyle(expect_val, style);
            UnityPrint(UnityStrWas);
            UnityPrintNumberByStyle(actual_val, style);
            UnityAddMsgIfSpecified(msg);
            UNITY_FAIL_AND_BAIL;
        }
897
        /* Walk through array by incrementing the pointers */
898 899
        if (flags == UNITY_ARRAY_TO_ARRAY)
        {
900
            expected = (UNITY_INTERNAL_PTR)((const char*)expected + increment);
901
        }
902
        actual = (UNITY_INTERNAL_PTR)((const char*)actual + increment);
M
Mark VanderVoord 已提交
903 904 905
    }
}

906
/*-----------------------------------------------*/
907
#ifndef UNITY_EXCLUDE_FLOAT
908
/* Wrap this define in a function with variable types as float or double */
909 910 911 912 913 914 915
#define UNITY_FLOAT_OR_DOUBLE_WITHIN(delta, expected, actual, diff)                           \
    if (isinf(expected) && isinf(actual) && (((expected) < 0) == ((actual) < 0))) return 1;   \
    if (UNITY_NAN_CHECK) return 1;                                                            \
    (diff) = (actual) - (expected);                                                           \
    if ((diff) < 0) (diff) = -(diff);                                                         \
    if ((delta) < 0) (delta) = -(delta);                                                      \
    return !(isnan(diff) || isinf(diff) || ((diff) > (delta)))
916
    /* This first part of this condition will catch any NaN or Infinite values */
917 918 919 920 921
#ifndef UNITY_NAN_NOT_EQUAL_NAN
  #define UNITY_NAN_CHECK isnan(expected) && isnan(actual)
#else
  #define UNITY_NAN_CHECK 0
#endif
922

923 924
#ifndef UNITY_EXCLUDE_FLOAT_PRINT
  #define UNITY_PRINT_EXPECTED_AND_ACTUAL_FLOAT(expected, actual) \
925
  {                                                               \
926 927 928
    UnityPrint(UnityStrExpected);                                 \
    UnityPrintFloat(expected);                                    \
    UnityPrint(UnityStrWas);                                      \
929
    UnityPrintFloat(actual); }
930 931 932 933 934
#else
  #define UNITY_PRINT_EXPECTED_AND_ACTUAL_FLOAT(expected, actual) \
    UnityPrint(UnityStrDelta)
#endif /* UNITY_EXCLUDE_FLOAT_PRINT */

K
Kochise 已提交
935
/*-----------------------------------------------*/
936
static int UnityFloatsWithin(UNITY_FLOAT delta, UNITY_FLOAT expected, UNITY_FLOAT actual)
937
{
938
    UNITY_FLOAT diff;
939 940 941
    UNITY_FLOAT_OR_DOUBLE_WITHIN(delta, expected, actual, diff);
}

K
Kochise 已提交
942
/*-----------------------------------------------*/
943 944 945
void UnityAssertEqualFloatArray(UNITY_PTR_ATTRIBUTE const UNITY_FLOAT* expected,
                                UNITY_PTR_ATTRIBUTE const UNITY_FLOAT* actual,
                                const UNITY_UINT32 num_elements,
M
Mark VanderVoord 已提交
946
                                const char* msg,
947 948
                                const UNITY_LINE_TYPE lineNumber,
                                const UNITY_FLAGS_T flags)
M
Mark VanderVoord 已提交
949
{
950
    UNITY_UINT32 elements = num_elements;
951 952
    UNITY_PTR_ATTRIBUTE const UNITY_FLOAT* ptr_expected = expected;
    UNITY_PTR_ATTRIBUTE const UNITY_FLOAT* ptr_actual = actual;
M
Mark VanderVoord 已提交
953

954
    RETURN_IF_FAIL_OR_IGNORE;
M
Mark VanderVoord 已提交
955

956 957 958 959
    if (elements == 0)
    {
        UnityPrintPointlessAndBail();
    }
M
Mark VanderVoord 已提交
960

K
Kochise 已提交
961 962 963 964 965
    if (expected == actual)
    {
        return; /* Both are NULL or same pointer */
    }

966
    if (UnityIsOneArrayNull((UNITY_INTERNAL_PTR)expected, (UNITY_INTERNAL_PTR)actual, lineNumber, msg))
K
Kochise 已提交
967
    {
968
        UNITY_FAIL_AND_BAIL;
K
Kochise 已提交
969
    }
M
Mark VanderVoord 已提交
970 971 972

    while (elements--)
    {
973
        if (!UnityFloatsWithin(*ptr_expected * UNITY_FLOAT_PRECISION, *ptr_expected, *ptr_actual))
M
Mark VanderVoord 已提交
974 975 976
        {
            UnityTestResultsFailBegin(lineNumber);
            UnityPrint(UnityStrElement);
977
            UnityPrintNumberUnsigned(num_elements - elements - 1);
978
            UNITY_PRINT_EXPECTED_AND_ACTUAL_FLOAT((UNITY_DOUBLE)*ptr_expected, (UNITY_DOUBLE)*ptr_actual);
M
Mark VanderVoord 已提交
979 980 981
            UnityAddMsgIfSpecified(msg);
            UNITY_FAIL_AND_BAIL;
        }
982 983 984 985
        if (flags == UNITY_ARRAY_TO_ARRAY)
        {
            ptr_expected++;
        }
986
        ptr_actual++;
M
Mark VanderVoord 已提交
987 988 989
    }
}

990
/*-----------------------------------------------*/
991 992 993
void UnityAssertFloatsWithin(const UNITY_FLOAT delta,
                             const UNITY_FLOAT expected,
                             const UNITY_FLOAT actual,
M
Mark VanderVoord 已提交
994 995 996
                             const char* msg,
                             const UNITY_LINE_TYPE lineNumber)
{
997
    RETURN_IF_FAIL_OR_IGNORE;
M
Mark VanderVoord 已提交
998 999


1000
    if (!UnityFloatsWithin(delta, expected, actual))
M
Mark VanderVoord 已提交
1001 1002
    {
        UnityTestResultsFailBegin(lineNumber);
1003
        UNITY_PRINT_EXPECTED_AND_ACTUAL_FLOAT((UNITY_DOUBLE)expected, (UNITY_DOUBLE)actual);
M
Mark VanderVoord 已提交
1004 1005 1006 1007 1008
        UnityAddMsgIfSpecified(msg);
        UNITY_FAIL_AND_BAIL;
    }
}

1009
/*-----------------------------------------------*/
1010
void UnityAssertFloatSpecial(const UNITY_FLOAT actual,
M
Mark VanderVoord 已提交
1011 1012 1013 1014
                             const char* msg,
                             const UNITY_LINE_TYPE lineNumber,
                             const UNITY_FLOAT_TRAIT_T style)
{
1015 1016 1017 1018
    const char* trait_names[] = {UnityStrInf, UnityStrNegInf, UnityStrNaN, UnityStrDet};
    UNITY_INT should_be_trait = ((UNITY_INT)style & 1);
    UNITY_INT is_trait        = !should_be_trait;
    UNITY_INT trait_index     = (UNITY_INT)(style >> 1);
M
Mark VanderVoord 已提交
1019

1020
    RETURN_IF_FAIL_OR_IGNORE;
M
Mark VanderVoord 已提交
1021

1022
    switch (style)
M
Mark VanderVoord 已提交
1023 1024 1025
    {
        case UNITY_FLOAT_IS_INF:
        case UNITY_FLOAT_IS_NOT_INF:
1026
            is_trait = isinf(actual) && (actual > 0);
M
Mark VanderVoord 已提交
1027 1028 1029
            break;
        case UNITY_FLOAT_IS_NEG_INF:
        case UNITY_FLOAT_IS_NOT_NEG_INF:
1030
            is_trait = isinf(actual) && (actual < 0);
M
Mark VanderVoord 已提交
1031 1032 1033 1034
            break;

        case UNITY_FLOAT_IS_NAN:
        case UNITY_FLOAT_IS_NOT_NAN:
1035
            is_trait = isnan(actual) ? 1 : 0;
M
Mark VanderVoord 已提交
1036 1037
            break;

1038
        case UNITY_FLOAT_IS_DET: /* A determinate number is non infinite and not NaN. */
M
Mark VanderVoord 已提交
1039
        case UNITY_FLOAT_IS_NOT_DET:
1040
            is_trait = !isinf(actual) && !isnan(actual);
M
Mark VanderVoord 已提交
1041 1042 1043
            break;

        default:
1044 1045 1046
            trait_index = 0;
            trait_names[0] = UnityStrInvalidFloatTrait;
            break;
M
Mark VanderVoord 已提交
1047 1048 1049 1050 1051 1052 1053
    }

    if (is_trait != should_be_trait)
    {
        UnityTestResultsFailBegin(lineNumber);
        UnityPrint(UnityStrExpected);
        if (!should_be_trait)
K
Kochise 已提交
1054
        {
M
Mark VanderVoord 已提交
1055
            UnityPrint(UnityStrNot);
K
Kochise 已提交
1056
        }
M
Mark VanderVoord 已提交
1057 1058
        UnityPrint(trait_names[trait_index]);
        UnityPrint(UnityStrWas);
J
jsalling 已提交
1059
#ifndef UNITY_EXCLUDE_FLOAT_PRINT
1060
        UnityPrintFloat((UNITY_DOUBLE)actual);
M
Mark VanderVoord 已提交
1061 1062
#else
        if (should_be_trait)
K
Kochise 已提交
1063
        {
M
Mark VanderVoord 已提交
1064
            UnityPrint(UnityStrNot);
K
Kochise 已提交
1065
        }
M
Mark VanderVoord 已提交
1066 1067 1068 1069 1070 1071 1072
        UnityPrint(trait_names[trait_index]);
#endif
        UnityAddMsgIfSpecified(msg);
        UNITY_FAIL_AND_BAIL;
    }
}

1073
#endif /* not UNITY_EXCLUDE_FLOAT */
M
Mark VanderVoord 已提交
1074

1075
/*-----------------------------------------------*/
M
Mark VanderVoord 已提交
1076
#ifndef UNITY_EXCLUDE_DOUBLE
1077
static int UnityDoublesWithin(UNITY_DOUBLE delta, UNITY_DOUBLE expected, UNITY_DOUBLE actual)
1078
{
1079
    UNITY_DOUBLE diff;
1080 1081 1082
    UNITY_FLOAT_OR_DOUBLE_WITHIN(delta, expected, actual, diff);
}

K
Kochise 已提交
1083
/*-----------------------------------------------*/
1084 1085 1086
void UnityAssertEqualDoubleArray(UNITY_PTR_ATTRIBUTE const UNITY_DOUBLE* expected,
                                 UNITY_PTR_ATTRIBUTE const UNITY_DOUBLE* actual,
                                 const UNITY_UINT32 num_elements,
M
Mark VanderVoord 已提交
1087
                                 const char* msg,
1088 1089
                                 const UNITY_LINE_TYPE lineNumber,
                                 const UNITY_FLAGS_T flags)
M
Mark VanderVoord 已提交
1090
{
1091
    UNITY_UINT32 elements = num_elements;
1092 1093
    UNITY_PTR_ATTRIBUTE const UNITY_DOUBLE* ptr_expected = expected;
    UNITY_PTR_ATTRIBUTE const UNITY_DOUBLE* ptr_actual = actual;
M
Mark VanderVoord 已提交
1094

1095
    RETURN_IF_FAIL_OR_IGNORE;
M
Mark VanderVoord 已提交
1096

1097 1098 1099 1100
    if (elements == 0)
    {
        UnityPrintPointlessAndBail();
    }
M
Mark VanderVoord 已提交
1101

K
Kochise 已提交
1102 1103 1104 1105 1106
    if (expected == actual)
    {
        return; /* Both are NULL or same pointer */
    }

1107
    if (UnityIsOneArrayNull((UNITY_INTERNAL_PTR)expected, (UNITY_INTERNAL_PTR)actual, lineNumber, msg))
K
Kochise 已提交
1108
    {
1109
        UNITY_FAIL_AND_BAIL;
K
Kochise 已提交
1110
    }
M
Mark VanderVoord 已提交
1111 1112 1113

    while (elements--)
    {
1114
        if (!UnityDoublesWithin(*ptr_expected * UNITY_DOUBLE_PRECISION, *ptr_expected, *ptr_actual))
M
Mark VanderVoord 已提交
1115 1116 1117
        {
            UnityTestResultsFailBegin(lineNumber);
            UnityPrint(UnityStrElement);
1118
            UnityPrintNumberUnsigned(num_elements - elements - 1);
1119
            UNITY_PRINT_EXPECTED_AND_ACTUAL_FLOAT(*ptr_expected, *ptr_actual);
M
Mark VanderVoord 已提交
1120 1121 1122
            UnityAddMsgIfSpecified(msg);
            UNITY_FAIL_AND_BAIL;
        }
1123 1124 1125 1126
        if (flags == UNITY_ARRAY_TO_ARRAY)
        {
            ptr_expected++;
        }
1127
        ptr_actual++;
M
Mark VanderVoord 已提交
1128 1129 1130
    }
}

1131
/*-----------------------------------------------*/
1132 1133 1134
void UnityAssertDoublesWithin(const UNITY_DOUBLE delta,
                              const UNITY_DOUBLE expected,
                              const UNITY_DOUBLE actual,
M
Mark VanderVoord 已提交
1135 1136 1137
                              const char* msg,
                              const UNITY_LINE_TYPE lineNumber)
{
1138
    RETURN_IF_FAIL_OR_IGNORE;
M
Mark VanderVoord 已提交
1139

1140
    if (!UnityDoublesWithin(delta, expected, actual))
M
Mark VanderVoord 已提交
1141 1142
    {
        UnityTestResultsFailBegin(lineNumber);
1143
        UNITY_PRINT_EXPECTED_AND_ACTUAL_FLOAT(expected, actual);
M
Mark VanderVoord 已提交
1144 1145 1146 1147 1148
        UnityAddMsgIfSpecified(msg);
        UNITY_FAIL_AND_BAIL;
    }
}

1149
/*-----------------------------------------------*/
1150
void UnityAssertDoubleSpecial(const UNITY_DOUBLE actual,
M
Mark VanderVoord 已提交
1151 1152 1153 1154
                              const char* msg,
                              const UNITY_LINE_TYPE lineNumber,
                              const UNITY_FLOAT_TRAIT_T style)
{
1155 1156 1157 1158
    const char* trait_names[] = {UnityStrInf, UnityStrNegInf, UnityStrNaN, UnityStrDet};
    UNITY_INT should_be_trait = ((UNITY_INT)style & 1);
    UNITY_INT is_trait        = !should_be_trait;
    UNITY_INT trait_index     = (UNITY_INT)(style >> 1);
M
Mark VanderVoord 已提交
1159

1160
    RETURN_IF_FAIL_OR_IGNORE;
M
Mark VanderVoord 已提交
1161

1162
    switch (style)
M
Mark VanderVoord 已提交
1163 1164 1165
    {
        case UNITY_FLOAT_IS_INF:
        case UNITY_FLOAT_IS_NOT_INF:
1166
            is_trait = isinf(actual) && (actual > 0);
M
Mark VanderVoord 已提交
1167 1168 1169
            break;
        case UNITY_FLOAT_IS_NEG_INF:
        case UNITY_FLOAT_IS_NOT_NEG_INF:
1170
            is_trait = isinf(actual) && (actual < 0);
M
Mark VanderVoord 已提交
1171 1172 1173 1174
            break;

        case UNITY_FLOAT_IS_NAN:
        case UNITY_FLOAT_IS_NOT_NAN:
1175
            is_trait = isnan(actual) ? 1 : 0;
M
Mark VanderVoord 已提交
1176 1177
            break;

1178
        case UNITY_FLOAT_IS_DET: /* A determinate number is non infinite and not NaN. */
M
Mark VanderVoord 已提交
1179
        case UNITY_FLOAT_IS_NOT_DET:
1180
            is_trait = !isinf(actual) && !isnan(actual);
M
Mark VanderVoord 已提交
1181 1182 1183
            break;

        default:
1184 1185 1186
            trait_index = 0;
            trait_names[0] = UnityStrInvalidFloatTrait;
            break;
M
Mark VanderVoord 已提交
1187 1188 1189 1190 1191 1192 1193
    }

    if (is_trait != should_be_trait)
    {
        UnityTestResultsFailBegin(lineNumber);
        UnityPrint(UnityStrExpected);
        if (!should_be_trait)
K
Kochise 已提交
1194
        {
M
Mark VanderVoord 已提交
1195
            UnityPrint(UnityStrNot);
K
Kochise 已提交
1196
        }
M
Mark VanderVoord 已提交
1197 1198
        UnityPrint(trait_names[trait_index]);
        UnityPrint(UnityStrWas);
J
jsalling 已提交
1199
#ifndef UNITY_EXCLUDE_FLOAT_PRINT
M
Mark VanderVoord 已提交
1200 1201 1202
        UnityPrintFloat(actual);
#else
        if (should_be_trait)
K
Kochise 已提交
1203
        {
M
Mark VanderVoord 已提交
1204
            UnityPrint(UnityStrNot);
K
Kochise 已提交
1205
        }
M
Mark VanderVoord 已提交
1206 1207 1208 1209 1210 1211 1212
        UnityPrint(trait_names[trait_index]);
#endif
        UnityAddMsgIfSpecified(msg);
        UNITY_FAIL_AND_BAIL;
    }
}

1213
#endif /* not UNITY_EXCLUDE_DOUBLE */
M
Mark VanderVoord 已提交
1214

1215
/*-----------------------------------------------*/
1216 1217 1218 1219 1220 1221
void UnityAssertNumbersWithin(const UNITY_UINT delta,
                              const UNITY_INT expected,
                              const UNITY_INT actual,
                              const char* msg,
                              const UNITY_LINE_TYPE lineNumber,
                              const UNITY_DISPLAY_STYLE_T style)
M
Mark VanderVoord 已提交
1222
{
1223
    RETURN_IF_FAIL_OR_IGNORE;
M
Mark VanderVoord 已提交
1224 1225 1226 1227

    if ((style & UNITY_DISPLAY_RANGE_INT) == UNITY_DISPLAY_RANGE_INT)
    {
        if (actual > expected)
K
Kochise 已提交
1228
        {
1229
            Unity.CurrentTestFailed = (((UNITY_UINT)actual - (UNITY_UINT)expected) > delta);
K
Kochise 已提交
1230
        }
M
Mark VanderVoord 已提交
1231
        else
K
Kochise 已提交
1232
        {
1233
            Unity.CurrentTestFailed = (((UNITY_UINT)expected - (UNITY_UINT)actual) > delta);
K
Kochise 已提交
1234
        }
M
Mark VanderVoord 已提交
1235 1236 1237
    }
    else
    {
1238
        if ((UNITY_UINT)actual > (UNITY_UINT)expected)
K
Kochise 已提交
1239
        {
1240
            Unity.CurrentTestFailed = (((UNITY_UINT)actual - (UNITY_UINT)expected) > delta);
K
Kochise 已提交
1241
        }
M
Mark VanderVoord 已提交
1242
        else
K
Kochise 已提交
1243
        {
1244
            Unity.CurrentTestFailed = (((UNITY_UINT)expected - (UNITY_UINT)actual) > delta);
K
Kochise 已提交
1245
        }
M
Mark VanderVoord 已提交
1246 1247 1248 1249 1250 1251
    }

    if (Unity.CurrentTestFailed)
    {
        UnityTestResultsFailBegin(lineNumber);
        UnityPrint(UnityStrDelta);
1252
        UnityPrintNumberByStyle((UNITY_INT)delta, style);
M
Mark VanderVoord 已提交
1253 1254 1255 1256 1257 1258 1259 1260 1261
        UnityPrint(UnityStrExpected);
        UnityPrintNumberByStyle(expected, style);
        UnityPrint(UnityStrWas);
        UnityPrintNumberByStyle(actual, style);
        UnityAddMsgIfSpecified(msg);
        UNITY_FAIL_AND_BAIL;
    }
}

D
Dom Postorivo 已提交
1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273
/*-----------------------------------------------*/
void UnityAssertNumbersArrayWithin(const UNITY_UINT delta,
                                   UNITY_INTERNAL_PTR expected,
                                   UNITY_INTERNAL_PTR actual,
                                   const UNITY_UINT32 num_elements,
                                   const char* msg,
                                   const UNITY_LINE_TYPE lineNumber,
                                   const UNITY_DISPLAY_STYLE_T style,
                                   const UNITY_FLAGS_T flags)
{
    UNITY_UINT32 elements = num_elements;
    unsigned int length   = style & 0xF;
1274
    unsigned int increment = 0;
D
Dom Postorivo 已提交
1275 1276

    RETURN_IF_FAIL_OR_IGNORE;
1277

D
Dom Postorivo 已提交
1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302
    if (num_elements == 0)
    {
        UnityPrintPointlessAndBail();
    }

    if (expected == actual)
    {
        return; /* Both are NULL or same pointer */
    }

    if (UnityIsOneArrayNull(expected, actual, lineNumber, msg))
    {
        UNITY_FAIL_AND_BAIL;
    }

    while ((elements > 0) && (elements--))
    {
        UNITY_INT expect_val;
        UNITY_INT actual_val;

        switch (length)
        {
            case 1:
                expect_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT8*)expected;
                actual_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT8*)actual;
1303
                increment  = sizeof(UNITY_INT8);
D
Dom Postorivo 已提交
1304
                break;
1305

D
Dom Postorivo 已提交
1306 1307 1308
            case 2:
                expect_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT16*)expected;
                actual_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT16*)actual;
1309
                increment  = sizeof(UNITY_INT16);
D
Dom Postorivo 已提交
1310
                break;
1311

D
Dom Postorivo 已提交
1312 1313 1314 1315
#ifdef UNITY_SUPPORT_64
            case 8:
                expect_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT64*)expected;
                actual_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT64*)actual;
1316
                increment  = sizeof(UNITY_INT64);
D
Dom Postorivo 已提交
1317 1318
                break;
#endif
1319 1320 1321

            default: /* default is length 4 bytes */
            case 4:
D
Dom Postorivo 已提交
1322 1323
                expect_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT32*)expected;
                actual_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT32*)actual;
1324
                increment  = sizeof(UNITY_INT32);
D
Dom Postorivo 已提交
1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353
                length = 4;
                break;
        }

        if ((style & UNITY_DISPLAY_RANGE_INT) == UNITY_DISPLAY_RANGE_INT)
        {
            if (actual_val > expect_val)
            {
                Unity.CurrentTestFailed = (((UNITY_UINT)actual_val - (UNITY_UINT)expect_val) > delta);
            }
            else
            {
                Unity.CurrentTestFailed = (((UNITY_UINT)expect_val - (UNITY_UINT)actual_val) > delta);
            }
        }
        else
        {
            if ((UNITY_UINT)actual_val > (UNITY_UINT)expect_val)
            {
                Unity.CurrentTestFailed = (((UNITY_UINT)actual_val - (UNITY_UINT)expect_val) > delta);
            }
            else
            {
                Unity.CurrentTestFailed = (((UNITY_UINT)expect_val - (UNITY_UINT)actual_val) > delta);
            }
        }

        if (Unity.CurrentTestFailed)
        {
1354
            if ((style & UNITY_DISPLAY_RANGE_UINT) && (length < (UNITY_INT_WIDTH / 8)))
D
Dom Postorivo 已提交
1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372
            {   /* For UINT, remove sign extension (padding 1's) from signed type casts above */
                UNITY_INT mask = 1;
                mask = (mask << 8 * length) - 1;
                expect_val &= mask;
                actual_val &= mask;
            }
            UnityTestResultsFailBegin(lineNumber);
            UnityPrint(UnityStrDelta);
            UnityPrintNumberByStyle((UNITY_INT)delta, style);
            UnityPrint(UnityStrElement);
            UnityPrintNumberUnsigned(num_elements - elements - 1);
            UnityPrint(UnityStrExpected);
            UnityPrintNumberByStyle(expect_val, style);
            UnityPrint(UnityStrWas);
            UnityPrintNumberByStyle(actual_val, style);
            UnityAddMsgIfSpecified(msg);
            UNITY_FAIL_AND_BAIL;
        }
1373
        /* Walk through array by incrementing the pointers */
D
Dom Postorivo 已提交
1374 1375
        if (flags == UNITY_ARRAY_TO_ARRAY)
        {
1376
            expected = (UNITY_INTERNAL_PTR)((const char*)expected + increment);
D
Dom Postorivo 已提交
1377
        }
1378
        actual = (UNITY_INTERNAL_PTR)((const char*)actual + increment);
D
Dom Postorivo 已提交
1379 1380 1381
    }
}

1382
/*-----------------------------------------------*/
M
Mark VanderVoord 已提交
1383 1384 1385 1386 1387
void UnityAssertEqualString(const char* expected,
                            const char* actual,
                            const char* msg,
                            const UNITY_LINE_TYPE lineNumber)
{
1388
    UNITY_UINT32 i;
M
Mark VanderVoord 已提交
1389

1390
    RETURN_IF_FAIL_OR_IGNORE;
M
Mark VanderVoord 已提交
1391

1392
    /* if both pointers not null compare the strings */
M
Mark VanderVoord 已提交
1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404
    if (expected && actual)
    {
        for (i = 0; expected[i] || actual[i]; i++)
        {
            if (expected[i] != actual[i])
            {
                Unity.CurrentTestFailed = 1;
                break;
            }
        }
    }
    else
1405
    { /* handle case of one pointers being null (if both null, test should pass) */
M
Mark VanderVoord 已提交
1406 1407 1408 1409 1410 1411 1412 1413
        if (expected != actual)
        {
            Unity.CurrentTestFailed = 1;
        }
    }

    if (Unity.CurrentTestFailed)
    {
1414 1415 1416 1417
        UnityTestResultsFailBegin(lineNumber);
        UnityPrintExpectedAndActualStrings(expected, actual);
        UnityAddMsgIfSpecified(msg);
        UNITY_FAIL_AND_BAIL;
M
Mark VanderVoord 已提交
1418 1419 1420
    }
}

1421
/*-----------------------------------------------*/
M
Mark VanderVoord 已提交
1422
void UnityAssertEqualStringLen(const char* expected,
1423 1424 1425 1426
                               const char* actual,
                               const UNITY_UINT32 length,
                               const char* msg,
                               const UNITY_LINE_TYPE lineNumber)
M
Mark VanderVoord 已提交
1427
{
1428
    UNITY_UINT32 i;
M
Mark VanderVoord 已提交
1429

1430
    RETURN_IF_FAIL_OR_IGNORE;
M
Mark VanderVoord 已提交
1431

1432
    /* if both pointers not null compare the strings */
M
Mark VanderVoord 已提交
1433 1434
    if (expected && actual)
    {
1435
        for (i = 0; (i < length) && (expected[i] || actual[i]); i++)
M
Mark VanderVoord 已提交
1436 1437 1438 1439 1440 1441 1442 1443 1444
        {
            if (expected[i] != actual[i])
            {
                Unity.CurrentTestFailed = 1;
                break;
            }
        }
    }
    else
1445
    { /* handle case of one pointers being null (if both null, test should pass) */
M
Mark VanderVoord 已提交
1446 1447 1448 1449 1450 1451 1452 1453
        if (expected != actual)
        {
            Unity.CurrentTestFailed = 1;
        }
    }

    if (Unity.CurrentTestFailed)
    {
1454 1455 1456 1457
        UnityTestResultsFailBegin(lineNumber);
        UnityPrintExpectedAndActualStringsLen(expected, actual, length);
        UnityAddMsgIfSpecified(msg);
        UNITY_FAIL_AND_BAIL;
M
Mark VanderVoord 已提交
1458 1459 1460
    }
}

1461
/*-----------------------------------------------*/
1462
void UnityAssertEqualStringArray(UNITY_INTERNAL_PTR expected,
1463 1464 1465
                                 const char** actual,
                                 const UNITY_UINT32 num_elements,
                                 const char* msg,
1466 1467
                                 const UNITY_LINE_TYPE lineNumber,
                                 const UNITY_FLAGS_T flags)
M
Mark VanderVoord 已提交
1468
{
1469 1470
    UNITY_UINT32 i = 0;
    UNITY_UINT32 j = 0;
1471
    const char* expd = NULL;
1472
    const char* act = NULL;
M
Mark VanderVoord 已提交
1473

1474
    RETURN_IF_FAIL_OR_IGNORE;
M
Mark VanderVoord 已提交
1475

1476
    /* if no elements, it's an error */
1477 1478 1479 1480
    if (num_elements == 0)
    {
        UnityPrintPointlessAndBail();
    }
M
Mark VanderVoord 已提交
1481

1482
    if ((const void*)expected == (const void*)actual)
1483 1484 1485 1486
    {
        return; /* Both are NULL or same pointer */
    }

1487
    if (UnityIsOneArrayNull((UNITY_INTERNAL_PTR)expected, (UNITY_INTERNAL_PTR)actual, lineNumber, msg))
1488
    {
1489
        UNITY_FAIL_AND_BAIL;
1490 1491 1492 1493
    }

    if (flags != UNITY_ARRAY_TO_ARRAY)
    {
1494
        expd = (const char*)expected;
1495
    }
M
Mark VanderVoord 已提交
1496 1497 1498

    do
    {
1499 1500 1501
        act = actual[j];
        if (flags == UNITY_ARRAY_TO_ARRAY)
        {
1502
            expd = ((const char* const*)expected)[j];
1503 1504
        }

1505
        /* if both pointers not null compare the strings */
1506
        if (expd && act)
M
Mark VanderVoord 已提交
1507
        {
1508
            for (i = 0; expd[i] || act[i]; i++)
M
Mark VanderVoord 已提交
1509
            {
1510
                if (expd[i] != act[i])
M
Mark VanderVoord 已提交
1511 1512 1513 1514 1515 1516 1517
                {
                    Unity.CurrentTestFailed = 1;
                    break;
                }
            }
        }
        else
1518
        { /* handle case of one pointers being null (if both null, test should pass) */
1519
            if (expd != act)
M
Mark VanderVoord 已提交
1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530
            {
                Unity.CurrentTestFailed = 1;
            }
        }

        if (Unity.CurrentTestFailed)
        {
            UnityTestResultsFailBegin(lineNumber);
            if (num_elements > 1)
            {
                UnityPrint(UnityStrElement);
1531
                UnityPrintNumberUnsigned(j);
M
Mark VanderVoord 已提交
1532
            }
1533
            UnityPrintExpectedAndActualStrings(expd, act);
M
Mark VanderVoord 已提交
1534 1535 1536 1537 1538 1539
            UnityAddMsgIfSpecified(msg);
            UNITY_FAIL_AND_BAIL;
        }
    } while (++j < num_elements);
}

1540
/*-----------------------------------------------*/
1541 1542 1543 1544 1545
void UnityAssertEqualMemory(UNITY_INTERNAL_PTR expected,
                            UNITY_INTERNAL_PTR actual,
                            const UNITY_UINT32 length,
                            const UNITY_UINT32 num_elements,
                            const char* msg,
1546 1547
                            const UNITY_LINE_TYPE lineNumber,
                            const UNITY_FLAGS_T flags)
M
Mark VanderVoord 已提交
1548 1549 1550
{
    UNITY_PTR_ATTRIBUTE const unsigned char* ptr_exp = (UNITY_PTR_ATTRIBUTE const unsigned char*)expected;
    UNITY_PTR_ATTRIBUTE const unsigned char* ptr_act = (UNITY_PTR_ATTRIBUTE const unsigned char*)actual;
1551 1552
    UNITY_UINT32 elements = num_elements;
    UNITY_UINT32 bytes;
M
Mark VanderVoord 已提交
1553

1554
    RETURN_IF_FAIL_OR_IGNORE;
M
Mark VanderVoord 已提交
1555

1556 1557 1558 1559
    if ((elements == 0) || (length == 0))
    {
        UnityPrintPointlessAndBail();
    }
M
Mark VanderVoord 已提交
1560

K
Kochise 已提交
1561 1562 1563 1564 1565
    if (expected == actual)
    {
        return; /* Both are NULL or same pointer */
    }

1566
    if (UnityIsOneArrayNull(expected, actual, lineNumber, msg))
K
Kochise 已提交
1567
    {
1568
        UNITY_FAIL_AND_BAIL;
K
Kochise 已提交
1569
    }
M
Mark VanderVoord 已提交
1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582

    while (elements--)
    {
        bytes = length;
        while (bytes--)
        {
            if (*ptr_exp != *ptr_act)
            {
                UnityTestResultsFailBegin(lineNumber);
                UnityPrint(UnityStrMemory);
                if (num_elements > 1)
                {
                    UnityPrint(UnityStrElement);
1583
                    UnityPrintNumberUnsigned(num_elements - elements - 1);
M
Mark VanderVoord 已提交
1584 1585
                }
                UnityPrint(UnityStrByte);
1586
                UnityPrintNumberUnsigned(length - bytes - 1);
M
Mark VanderVoord 已提交
1587 1588 1589 1590 1591 1592 1593
                UnityPrint(UnityStrExpected);
                UnityPrintNumberByStyle(*ptr_exp, UNITY_DISPLAY_STYLE_HEX8);
                UnityPrint(UnityStrWas);
                UnityPrintNumberByStyle(*ptr_act, UNITY_DISPLAY_STYLE_HEX8);
                UnityAddMsgIfSpecified(msg);
                UNITY_FAIL_AND_BAIL;
            }
1594 1595
            ptr_exp++;
            ptr_act++;
M
Mark VanderVoord 已提交
1596
        }
1597 1598 1599 1600
        if (flags == UNITY_ARRAY_TO_VAL)
        {
            ptr_exp = (UNITY_PTR_ATTRIBUTE const unsigned char*)expected;
        }
M
Mark VanderVoord 已提交
1601 1602 1603
    }
}

1604 1605 1606 1607 1608 1609 1610 1611 1612 1613
/*-----------------------------------------------*/

static union
{
    UNITY_INT8 i8;
    UNITY_INT16 i16;
    UNITY_INT32 i32;
#ifdef UNITY_SUPPORT_64
    UNITY_INT64 i64;
#endif
1614 1615 1616 1617 1618 1619
#ifndef UNITY_EXCLUDE_FLOAT
    float f;
#endif
#ifndef UNITY_EXCLUDE_DOUBLE
    double d;
#endif
1620 1621 1622 1623 1624 1625 1626
} UnityQuickCompare;

UNITY_INTERNAL_PTR UnityNumToPtr(const UNITY_INT num, const UNITY_UINT8 size)
{
    switch(size)
    {
        case 1:
1627 1628
            UnityQuickCompare.i8 = (UNITY_INT8)num;
            return (UNITY_INTERNAL_PTR)(&UnityQuickCompare.i8);
1629 1630

        case 2:
1631 1632
            UnityQuickCompare.i16 = (UNITY_INT16)num;
            return (UNITY_INTERNAL_PTR)(&UnityQuickCompare.i16);
1633 1634 1635

#ifdef UNITY_SUPPORT_64
        case 8:
1636 1637
            UnityQuickCompare.i64 = (UNITY_INT64)num;
            return (UNITY_INTERNAL_PTR)(&UnityQuickCompare.i64);
1638
#endif
1639

1640
        default: /* 4 bytes */
1641 1642
            UnityQuickCompare.i32 = (UNITY_INT32)num;
            return (UNITY_INTERNAL_PTR)(&UnityQuickCompare.i32);
1643 1644 1645
    }
}

1646
#ifndef UNITY_EXCLUDE_FLOAT
K
Kochise 已提交
1647
/*-----------------------------------------------*/
1648 1649 1650 1651 1652 1653 1654 1655
UNITY_INTERNAL_PTR UnityFloatToPtr(const float num)
{
    UnityQuickCompare.f = num;
    return (UNITY_INTERNAL_PTR)(&UnityQuickCompare.f);
}
#endif

#ifndef UNITY_EXCLUDE_DOUBLE
K
Kochise 已提交
1656
/*-----------------------------------------------*/
1657 1658 1659 1660 1661 1662 1663
UNITY_INTERNAL_PTR UnityDoubleToPtr(const double num)
{
    UnityQuickCompare.d = num;
    return (UNITY_INTERNAL_PTR)(&UnityQuickCompare.d);
}
#endif

1664 1665 1666
/*-----------------------------------------------
 * Control Functions
 *-----------------------------------------------*/
M
Mark VanderVoord 已提交
1667

K
Kochise 已提交
1668
/*-----------------------------------------------*/
M
Mark VanderVoord 已提交
1669 1670
void UnityFail(const char* msg, const UNITY_LINE_TYPE line)
{
1671
    RETURN_IF_FAIL_OR_IGNORE;
M
Mark VanderVoord 已提交
1672 1673

    UnityTestResultsBegin(Unity.TestFile, line);
1674
    UnityPrint(UnityStrFail);
M
Mark VanderVoord 已提交
1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701
    if (msg != NULL)
    {
        UNITY_OUTPUT_CHAR(':');

#ifndef UNITY_EXCLUDE_DETAILS
        if (Unity.CurrentDetail1)
        {
            UnityPrint(UnityStrDetail1Name);
            UnityPrint(Unity.CurrentDetail1);
            if (Unity.CurrentDetail2)
            {
                UnityPrint(UnityStrDetail2Name);
                UnityPrint(Unity.CurrentDetail2);
            }
            UnityPrint(UnityStrSpacer);
        }
#endif
        if (msg[0] != ' ')
        {
            UNITY_OUTPUT_CHAR(' ');
        }
        UnityPrint(msg);
    }

    UNITY_FAIL_AND_BAIL;
}

1702
/*-----------------------------------------------*/
M
Mark VanderVoord 已提交
1703 1704
void UnityIgnore(const char* msg, const UNITY_LINE_TYPE line)
{
1705
    RETURN_IF_FAIL_OR_IGNORE;
M
Mark VanderVoord 已提交
1706 1707 1708 1709 1710

    UnityTestResultsBegin(Unity.TestFile, line);
    UnityPrint(UnityStrIgnore);
    if (msg != NULL)
    {
1711 1712 1713
        UNITY_OUTPUT_CHAR(':');
        UNITY_OUTPUT_CHAR(' ');
        UnityPrint(msg);
M
Mark VanderVoord 已提交
1714 1715 1716 1717
    }
    UNITY_IGNORE_AND_BAIL;
}

M
Mark VanderVoord 已提交
1718
/*-----------------------------------------------*/
1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731
void UnityMessage(const char* msg, const UNITY_LINE_TYPE line)
{
    UnityTestResultsBegin(Unity.TestFile, line);
    UnityPrint("INFO");
    if (msg != NULL)
    {
      UNITY_OUTPUT_CHAR(':');
      UNITY_OUTPUT_CHAR(' ');
      UnityPrint(msg);
    }
    UNITY_PRINT_EOL();
}

1732
/*-----------------------------------------------*/
M
Mark VanderVoord 已提交
1733 1734 1735 1736 1737 1738
void UnityDefaultTestRun(UnityTestFunction Func, const char* FuncName, const int FuncLineNum)
{
    Unity.CurrentTestName = FuncName;
    Unity.CurrentTestLineNumber = (UNITY_LINE_TYPE)FuncLineNum;
    Unity.NumberOfTests++;
    UNITY_CLR_DETAILS();
1739
    UNITY_EXEC_TIME_START();
M
Mark VanderVoord 已提交
1740 1741 1742 1743 1744
    if (TEST_PROTECT())
    {
        setUp();
        Func();
    }
1745
    if (TEST_PROTECT())
M
Mark VanderVoord 已提交
1746 1747 1748
    {
        tearDown();
    }
1749
    UNITY_EXEC_TIME_STOP();
M
Mark VanderVoord 已提交
1750 1751 1752
    UnityConcludeTest();
}

1753
/*-----------------------------------------------*/
M
Mark VanderVoord 已提交
1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768
void UnityBegin(const char* filename)
{
    Unity.TestFile = filename;
    Unity.CurrentTestName = NULL;
    Unity.CurrentTestLineNumber = 0;
    Unity.NumberOfTests = 0;
    Unity.TestFailures = 0;
    Unity.TestIgnores = 0;
    Unity.CurrentTestFailed = 0;
    Unity.CurrentTestIgnored = 0;

    UNITY_CLR_DETAILS();
    UNITY_OUTPUT_START();
}

1769
/*-----------------------------------------------*/
M
Mark VanderVoord 已提交
1770 1771 1772 1773 1774
int UnityEnd(void)
{
    UNITY_PRINT_EOL();
    UnityPrint(UnityStrBreaker);
    UNITY_PRINT_EOL();
1775
    UnityPrintNumber((UNITY_INT)(Unity.NumberOfTests));
M
Mark VanderVoord 已提交
1776
    UnityPrint(UnityStrResultsTests);
1777
    UnityPrintNumber((UNITY_INT)(Unity.TestFailures));
M
Mark VanderVoord 已提交
1778
    UnityPrint(UnityStrResultsFailures);
1779
    UnityPrintNumber((UNITY_INT)(Unity.TestIgnores));
M
Mark VanderVoord 已提交
1780 1781 1782 1783
    UnityPrint(UnityStrResultsIgnored);
    UNITY_PRINT_EOL();
    if (Unity.TestFailures == 0U)
    {
1784
        UnityPrint(UnityStrOk);
M
Mark VanderVoord 已提交
1785 1786 1787
    }
    else
    {
1788
        UnityPrint(UnityStrFail);
1789 1790 1791
#ifdef UNITY_DIFFERENTIATE_FINAL_FAIL
        UNITY_OUTPUT_CHAR('E'); UNITY_OUTPUT_CHAR('D');
#endif
M
Mark VanderVoord 已提交
1792 1793
    }
    UNITY_PRINT_EOL();
1794
    UNITY_FLUSH_CALL();
M
Mark VanderVoord 已提交
1795 1796 1797 1798
    UNITY_OUTPUT_COMPLETE();
    return (int)(Unity.TestFailures);
}

1799 1800 1801
/*-----------------------------------------------
 * Command Line Argument Support
 *-----------------------------------------------*/
1802
#ifdef UNITY_USE_COMMAND_LINE_ARGS
1803 1804 1805

char* UnityOptionIncludeNamed = NULL;
char* UnityOptionExcludeNamed = NULL;
1806
int UnityVerbosity            = 1;
1807

K
Kochise 已提交
1808
/*-----------------------------------------------*/
1809 1810 1811 1812
int UnityParseOptions(int argc, char** argv)
{
    UnityOptionIncludeNamed = NULL;
    UnityOptionExcludeNamed = NULL;
L
Luca Boccassi 已提交
1813
    int i;
1814

L
Luca Boccassi 已提交
1815
    for (i = 1; i < argc; i++)
1816 1817 1818
    {
        if (argv[i][0] == '-')
        {
1819
            switch (argv[i][1])
1820 1821
            {
                case 'l': /* list tests */
1822
                    return -1;
1823
                case 'n': /* include tests with name including this string */
1824 1825
                case 'f': /* an alias for -n */
                    if (argv[i][2] == '=')
K
Kochise 已提交
1826
                    {
1827
                        UnityOptionIncludeNamed = &argv[i][3];
K
Kochise 已提交
1828
                    }
1829
                    else if (++i < argc)
K
Kochise 已提交
1830
                    {
1831
                        UnityOptionIncludeNamed = argv[i];
K
Kochise 已提交
1832
                    }
1833 1834 1835 1836
                    else
                    {
                        UnityPrint("ERROR: No Test String to Include Matches For");
                        UNITY_PRINT_EOL();
1837
                        return 1;
1838 1839 1840 1841 1842 1843 1844 1845 1846
                    }
                    break;
                case 'q': /* quiet */
                    UnityVerbosity = 0;
                    break;
                case 'v': /* verbose */
                    UnityVerbosity = 2;
                    break;
                case 'x': /* exclude tests with name including this string */
1847
                    if (argv[i][2] == '=')
K
Kochise 已提交
1848
                    {
1849
                        UnityOptionExcludeNamed = &argv[i][3];
K
Kochise 已提交
1850
                    }
1851
                    else if (++i < argc)
K
Kochise 已提交
1852
                    {
1853
                        UnityOptionExcludeNamed = argv[i];
K
Kochise 已提交
1854
                    }
1855 1856 1857 1858
                    else
                    {
                        UnityPrint("ERROR: No Test String to Exclude Matches For");
                        UNITY_PRINT_EOL();
1859
                        return 1;
1860 1861 1862 1863
                    }
                    break;
                default:
                    UnityPrint("ERROR: Unknown Option ");
1864
                    UNITY_OUTPUT_CHAR(argv[i][1]);
1865 1866 1867 1868 1869 1870 1871 1872 1873
                    UNITY_PRINT_EOL();
                    return 1;
            }
        }
    }

    return 0;
}

K
Kochise 已提交
1874
/*-----------------------------------------------*/
1875
int IsStringInBiggerString(const char* longstring, const char* shortstring)
1876
{
1877 1878 1879
    const char* lptr = longstring;
    const char* sptr = shortstring;
    const char* lnext = lptr;
1880

1881
    if (*sptr == '*')
K
Kochise 已提交
1882
    {
1883
        return 1;
K
Kochise 已提交
1884
    }
1885

1886 1887 1888
    while (*lptr)
    {
        lnext = lptr + 1;
1889

1890 1891 1892 1893 1894
        /* If they current bytes match, go on to the next bytes */
        while (*lptr && *sptr && (*lptr == *sptr))
        {
            lptr++;
            sptr++;
1895

1896 1897 1898
            /* We're done if we match the entire string or up to a wildcard */
            if (*sptr == '*')
                return 1;
1899 1900 1901 1902 1903 1904 1905 1906
            if (*sptr == ',')
                return 1;
            if (*sptr == '"')
                return 1;
            if (*sptr == '\'')
                return 1;
            if (*sptr == ':')
                return 2;
1907 1908 1909 1910 1911 1912
            if (*sptr == 0)
                return 1;
        }

        /* Otherwise we start in the long pointer 1 character further and try again */
        lptr = lnext;
1913
        sptr = shortstring;
1914
    }
K
Kochise 已提交
1915

1916
    return 0;
1917 1918
}

K
Kochise 已提交
1919
/*-----------------------------------------------*/
1920 1921
int UnityStringArgumentMatches(const char* str)
{
1922 1923 1924
    int retval;
    const char* ptr1;
    const char* ptr2;
1925
    const char* ptrf;
1926

1927
    /* Go through the options and get the substrings for matching one at a time */
1928 1929 1930 1931
    ptr1 = str;
    while (ptr1[0] != 0)
    {
        if ((ptr1[0] == '"') || (ptr1[0] == '\''))
K
Kochise 已提交
1932
        {
1933
            ptr1++;
K
Kochise 已提交
1934
        }
1935

1936
        /* look for the start of the next partial */
1937
        ptr2 = ptr1;
1938
        ptrf = 0;
1939 1940
        do
        {
1941
            ptr2++;
1942
            if ((ptr2[0] == ':') && (ptr2[1] != 0) && (ptr2[0] != '\'') && (ptr2[0] != '"') && (ptr2[0] != ','))
K
Kochise 已提交
1943
            {
1944
                ptrf = &ptr2[1];
K
Kochise 已提交
1945
            }
1946
        } while ((ptr2[0] != 0) && (ptr2[0] != '\'') && (ptr2[0] != '"') && (ptr2[0] != ','));
K
Kochise 已提交
1947

1948
        while ((ptr2[0] != 0) && ((ptr2[0] == ':') || (ptr2[0] == '\'') || (ptr2[0] == '"') || (ptr2[0] == ',')))
K
Kochise 已提交
1949
        {
1950
            ptr2++;
K
Kochise 已提交
1951
        }
1952

1953
        /* done if complete filename match */
1954 1955
        retval = IsStringInBiggerString(Unity.TestFile, ptr1);
        if (retval == 1)
K
Kochise 已提交
1956
        {
1957
            return retval;
K
Kochise 已提交
1958
        }
1959

1960
        /* done if testname match after filename partial match */
1961
        if ((retval == 2) && (ptrf != 0))
1962
        {
1963
            if (IsStringInBiggerString(Unity.CurrentTestName, ptrf))
K
Kochise 已提交
1964
            {
1965
                return 1;
K
Kochise 已提交
1966
            }
1967 1968
        }

1969
        /* done if complete testname match */
1970
        if (IsStringInBiggerString(Unity.CurrentTestName, ptr1) == 1)
K
Kochise 已提交
1971
        {
1972
            return 1;
K
Kochise 已提交
1973
        }
1974 1975 1976 1977

        ptr1 = ptr2;
    }

1978
    /* we couldn't find a match for any substrings */
1979
    return 0;
1980
}
1981

K
Kochise 已提交
1982
/*-----------------------------------------------*/
1983 1984 1985 1986 1987 1988 1989 1990 1991
int UnityTestMatches(void)
{
    /* Check if this test name matches the included test pattern */
    int retval;
    if (UnityOptionIncludeNamed)
    {
        retval = UnityStringArgumentMatches(UnityOptionIncludeNamed);
    }
    else
K
Kochise 已提交
1992
    {
1993
        retval = 1;
K
Kochise 已提交
1994
    }
1995

1996 1997 1998 1999
    /* Check if this test name matches the excluded test pattern */
    if (UnityOptionExcludeNamed)
    {
        if (UnityStringArgumentMatches(UnityOptionExcludeNamed))
K
Kochise 已提交
2000
        {
2001
            retval = 0;
K
Kochise 已提交
2002
        }
2003
    }
K
Kochise 已提交
2004

2005
    return retval;
2006 2007
}

2008
#endif /* UNITY_USE_COMMAND_LINE_ARGS */
2009
/*-----------------------------------------------*/