acid-drop- Hacking the planet from a LilyGo T-Deck using custom firmware |
git clone git://git.acid.vegas/acid-drop.git |
Log | Files | Refs | Archive | README | LICENSE |
unity.c (65571B)
1 /* ========================================================================= 2 Unity Project - A Test Framework for C 3 Copyright (c) 2007-21 Mike Karlesky, Mark VanderVoord, Greg Williams 4 [Released under MIT License. Please refer to license.txt for details] 5 ============================================================================ */ 6 #if LV_BUILD_TEST 7 #define UNITY_INCLUDE_PRINT_FORMATTED 1 8 #include "unity.h" 9 #include <stddef.h> 10 11 #ifdef AVR 12 #include <avr/pgmspace.h> 13 #else 14 #define PROGMEM 15 #endif 16 17 /* If omitted from header, declare overrideable prototypes here so they're ready for use */ 18 #ifdef UNITY_OMIT_OUTPUT_CHAR_HEADER_DECLARATION 19 void UNITY_OUTPUT_CHAR(int); 20 #endif 21 22 /* Helpful macros for us to use here in Assert functions */ 23 #define UNITY_FAIL_AND_BAIL { Unity.CurrentTestFailed = 1; UNITY_OUTPUT_FLUSH(); TEST_ABORT(); } 24 #define UNITY_IGNORE_AND_BAIL { Unity.CurrentTestIgnored = 1; UNITY_OUTPUT_FLUSH(); TEST_ABORT(); } 25 #define RETURN_IF_FAIL_OR_IGNORE if (Unity.CurrentTestFailed || Unity.CurrentTestIgnored) TEST_ABORT() 26 27 struct UNITY_STORAGE_T Unity; 28 29 #ifdef UNITY_OUTPUT_COLOR 30 const char PROGMEM UnityStrOk[] = "\033[42mOK\033[00m"; 31 const char PROGMEM UnityStrPass[] = "\033[42mPASS\033[00m"; 32 const char PROGMEM UnityStrFail[] = "\033[41mFAIL\033[00m"; 33 const char PROGMEM UnityStrIgnore[] = "\033[43mIGNORE\033[00m"; 34 #else 35 const char PROGMEM UnityStrOk[] = "OK"; 36 const char PROGMEM UnityStrPass[] = "PASS"; 37 const char PROGMEM UnityStrFail[] = "FAIL"; 38 const char PROGMEM UnityStrIgnore[] = "IGNORE"; 39 #endif 40 static const char PROGMEM UnityStrNull[] = "NULL"; 41 static const char PROGMEM UnityStrSpacer[] = ". "; 42 static const char PROGMEM UnityStrExpected[] = " Expected "; 43 static const char PROGMEM UnityStrWas[] = " Was "; 44 static const char PROGMEM UnityStrGt[] = " to be greater than "; 45 static const char PROGMEM UnityStrLt[] = " to be less than "; 46 static const char PROGMEM UnityStrOrEqual[] = "or equal to "; 47 static const char PROGMEM UnityStrNotEqual[] = " to be not equal to "; 48 static const char PROGMEM UnityStrElement[] = " Element "; 49 static const char PROGMEM UnityStrByte[] = " Byte "; 50 static const char PROGMEM UnityStrMemory[] = " Memory Mismatch."; 51 static const char PROGMEM UnityStrDelta[] = " Values Not Within Delta "; 52 static const char PROGMEM UnityStrPointless[] = " You Asked Me To Compare Nothing, Which Was Pointless."; 53 static const char PROGMEM UnityStrNullPointerForExpected[] = " Expected pointer to be NULL"; 54 static const char PROGMEM UnityStrNullPointerForActual[] = " Actual pointer was NULL"; 55 #ifndef UNITY_EXCLUDE_FLOAT 56 static const char PROGMEM UnityStrNot[] = "Not "; 57 static const char PROGMEM UnityStrInf[] = "Infinity"; 58 static const char PROGMEM UnityStrNegInf[] = "Negative Infinity"; 59 static const char PROGMEM UnityStrNaN[] = "NaN"; 60 static const char PROGMEM UnityStrDet[] = "Determinate"; 61 static const char PROGMEM UnityStrInvalidFloatTrait[] = "Invalid Float Trait"; 62 #endif 63 const char PROGMEM UnityStrErrShorthand[] = "Unity Shorthand Support Disabled"; 64 const char PROGMEM UnityStrErrFloat[] = "Unity Floating Point Disabled"; 65 const char PROGMEM UnityStrErrDouble[] = "Unity Double Precision Disabled"; 66 const char PROGMEM UnityStrErr64[] = "Unity 64-bit Support Disabled"; 67 static const char PROGMEM UnityStrBreaker[] = "-----------------------"; 68 static const char PROGMEM UnityStrResultsTests[] = " Tests "; 69 static const char PROGMEM UnityStrResultsFailures[] = " Failures "; 70 static const char PROGMEM UnityStrResultsIgnored[] = " Ignored "; 71 #ifndef UNITY_EXCLUDE_DETAILS 72 static const char PROGMEM UnityStrDetail1Name[] = UNITY_DETAIL1_NAME " "; 73 static const char PROGMEM UnityStrDetail2Name[] = " " UNITY_DETAIL2_NAME " "; 74 #endif 75 /*----------------------------------------------- 76 * Pretty Printers & Test Result Output Handlers 77 *-----------------------------------------------*/ 78 79 /*-----------------------------------------------*/ 80 /* Local helper function to print characters. */ 81 static void UnityPrintChar(const char* pch) 82 { 83 /* printable characters plus CR & LF are printed */ 84 if ((*pch <= 126) && (*pch >= 32)) 85 { 86 UNITY_OUTPUT_CHAR(*pch); 87 } 88 /* write escaped carriage returns */ 89 else if (*pch == 13) 90 { 91 UNITY_OUTPUT_CHAR('\\'); 92 UNITY_OUTPUT_CHAR('r'); 93 } 94 /* write escaped line feeds */ 95 else if (*pch == 10) 96 { 97 UNITY_OUTPUT_CHAR('\\'); 98 UNITY_OUTPUT_CHAR('n'); 99 } 100 /* unprintable characters are shown as codes */ 101 else 102 { 103 UNITY_OUTPUT_CHAR('\\'); 104 UNITY_OUTPUT_CHAR('x'); 105 UnityPrintNumberHex((UNITY_UINT)*pch, 2); 106 } 107 } 108 109 /*-----------------------------------------------*/ 110 /* Local helper function to print ANSI escape strings e.g. "\033[42m". */ 111 #ifdef UNITY_OUTPUT_COLOR 112 static UNITY_UINT UnityPrintAnsiEscapeString(const char* string) 113 { 114 const char* pch = string; 115 UNITY_UINT count = 0; 116 117 while (*pch && (*pch != 'm')) 118 { 119 UNITY_OUTPUT_CHAR(*pch); 120 pch++; 121 count++; 122 } 123 UNITY_OUTPUT_CHAR('m'); 124 count++; 125 126 return count; 127 } 128 #endif 129 130 /*-----------------------------------------------*/ 131 void UnityPrint(const char* string) 132 { 133 const char* pch = string; 134 135 if (pch != NULL) 136 { 137 while (*pch) 138 { 139 #ifdef UNITY_OUTPUT_COLOR 140 /* print ANSI escape code */ 141 if ((*pch == 27) && (*(pch + 1) == '[')) 142 { 143 pch += UnityPrintAnsiEscapeString(pch); 144 continue; 145 } 146 #endif 147 UnityPrintChar(pch); 148 pch++; 149 } 150 } 151 } 152 /*-----------------------------------------------*/ 153 void UnityPrintLen(const char* string, const UNITY_UINT32 length) 154 { 155 const char* pch = string; 156 157 if (pch != NULL) 158 { 159 while (*pch && ((UNITY_UINT32)(pch - string) < length)) 160 { 161 /* printable characters plus CR & LF are printed */ 162 if ((*pch <= 126) && (*pch >= 32)) 163 { 164 UNITY_OUTPUT_CHAR(*pch); 165 } 166 /* write escaped carriage returns */ 167 else if (*pch == 13) 168 { 169 UNITY_OUTPUT_CHAR('\\'); 170 UNITY_OUTPUT_CHAR('r'); 171 } 172 /* write escaped line feeds */ 173 else if (*pch == 10) 174 { 175 UNITY_OUTPUT_CHAR('\\'); 176 UNITY_OUTPUT_CHAR('n'); 177 } 178 /* unprintable characters are shown as codes */ 179 else 180 { 181 UNITY_OUTPUT_CHAR('\\'); 182 UNITY_OUTPUT_CHAR('x'); 183 UnityPrintNumberHex((UNITY_UINT)*pch, 2); 184 } 185 pch++; 186 } 187 } 188 } 189 190 /*-----------------------------------------------*/ 191 void UnityPrintNumberByStyle(const UNITY_INT number, const UNITY_DISPLAY_STYLE_T style) 192 { 193 if ((style & UNITY_DISPLAY_RANGE_INT) == UNITY_DISPLAY_RANGE_INT) 194 { 195 if (style == UNITY_DISPLAY_STYLE_CHAR) 196 { 197 /* printable characters plus CR & LF are printed */ 198 UNITY_OUTPUT_CHAR('\''); 199 if ((number <= 126) && (number >= 32)) 200 { 201 UNITY_OUTPUT_CHAR((int)number); 202 } 203 /* write escaped carriage returns */ 204 else if (number == 13) 205 { 206 UNITY_OUTPUT_CHAR('\\'); 207 UNITY_OUTPUT_CHAR('r'); 208 } 209 /* write escaped line feeds */ 210 else if (number == 10) 211 { 212 UNITY_OUTPUT_CHAR('\\'); 213 UNITY_OUTPUT_CHAR('n'); 214 } 215 /* unprintable characters are shown as codes */ 216 else 217 { 218 UNITY_OUTPUT_CHAR('\\'); 219 UNITY_OUTPUT_CHAR('x'); 220 UnityPrintNumberHex((UNITY_UINT)number, 2); 221 } 222 UNITY_OUTPUT_CHAR('\''); 223 } 224 else 225 { 226 UnityPrintNumber(number); 227 } 228 } 229 else if ((style & UNITY_DISPLAY_RANGE_UINT) == UNITY_DISPLAY_RANGE_UINT) 230 { 231 UnityPrintNumberUnsigned((UNITY_UINT)number); 232 } 233 else 234 { 235 UNITY_OUTPUT_CHAR('0'); 236 UNITY_OUTPUT_CHAR('x'); 237 UnityPrintNumberHex((UNITY_UINT)number, (char)((style & 0xF) * 2)); 238 } 239 } 240 241 /*-----------------------------------------------*/ 242 void UnityPrintNumber(const UNITY_INT number_to_print) 243 { 244 UNITY_UINT number = (UNITY_UINT)number_to_print; 245 246 if (number_to_print < 0) 247 { 248 /* A negative number, including MIN negative */ 249 UNITY_OUTPUT_CHAR('-'); 250 number = (~number) + 1; 251 } 252 UnityPrintNumberUnsigned(number); 253 } 254 255 /*----------------------------------------------- 256 * basically do an itoa using as little ram as possible */ 257 void UnityPrintNumberUnsigned(const UNITY_UINT number) 258 { 259 UNITY_UINT divisor = 1; 260 261 /* figure out initial divisor */ 262 while (number / divisor > 9) 263 { 264 divisor *= 10; 265 } 266 267 /* now mod and print, then divide divisor */ 268 do 269 { 270 UNITY_OUTPUT_CHAR((char)('0' + (number / divisor % 10))); 271 divisor /= 10; 272 } while (divisor > 0); 273 } 274 275 /*-----------------------------------------------*/ 276 void UnityPrintNumberHex(const UNITY_UINT number, const char nibbles_to_print) 277 { 278 int nibble; 279 char nibbles = nibbles_to_print; 280 281 if ((unsigned)nibbles > UNITY_MAX_NIBBLES) 282 { 283 nibbles = UNITY_MAX_NIBBLES; 284 } 285 286 while (nibbles > 0) 287 { 288 nibbles--; 289 nibble = (int)(number >> (nibbles * 4)) & 0x0F; 290 if (nibble <= 9) 291 { 292 UNITY_OUTPUT_CHAR((char)('0' + nibble)); 293 } 294 else 295 { 296 UNITY_OUTPUT_CHAR((char)('A' - 10 + nibble)); 297 } 298 } 299 } 300 301 /*-----------------------------------------------*/ 302 void UnityPrintMask(const UNITY_UINT mask, const UNITY_UINT number) 303 { 304 UNITY_UINT current_bit = (UNITY_UINT)1 << (UNITY_INT_WIDTH - 1); 305 UNITY_INT32 i; 306 307 for (i = 0; i < UNITY_INT_WIDTH; i++) 308 { 309 if (current_bit & mask) 310 { 311 if (current_bit & number) 312 { 313 UNITY_OUTPUT_CHAR('1'); 314 } 315 else 316 { 317 UNITY_OUTPUT_CHAR('0'); 318 } 319 } 320 else 321 { 322 UNITY_OUTPUT_CHAR('X'); 323 } 324 current_bit = current_bit >> 1; 325 } 326 } 327 328 /*-----------------------------------------------*/ 329 #ifndef UNITY_EXCLUDE_FLOAT_PRINT 330 /* 331 * This function prints a floating-point value in a format similar to 332 * printf("%.7g") on a single-precision machine or printf("%.9g") on a 333 * double-precision machine. The 7th digit won't always be totally correct 334 * in single-precision operation (for that level of accuracy, a more 335 * complicated algorithm would be needed). 336 */ 337 void UnityPrintFloat(const UNITY_DOUBLE input_number) 338 { 339 #ifdef UNITY_INCLUDE_DOUBLE 340 static const int sig_digits = 9; 341 static const UNITY_INT32 min_scaled = 100000000; 342 static const UNITY_INT32 max_scaled = 1000000000; 343 #else 344 static const int sig_digits = 7; 345 static const UNITY_INT32 min_scaled = 1000000; 346 static const UNITY_INT32 max_scaled = 10000000; 347 #endif 348 349 UNITY_DOUBLE number = input_number; 350 351 /* print minus sign (does not handle negative zero) */ 352 if (number < 0.0f) 353 { 354 UNITY_OUTPUT_CHAR('-'); 355 number = -number; 356 } 357 358 /* handle zero, NaN, and +/- infinity */ 359 if (number == 0.0f) 360 { 361 UnityPrint("0"); 362 } 363 else if (isnan(number)) 364 { 365 UnityPrint("nan"); 366 } 367 else if (isinf(number)) 368 { 369 UnityPrint("inf"); 370 } 371 else 372 { 373 UNITY_INT32 n_int = 0, n; 374 int exponent = 0; 375 int decimals, digits; 376 char buf[16] = {0}; 377 378 /* 379 * Scale up or down by powers of 10. To minimize rounding error, 380 * start with a factor/divisor of 10^10, which is the largest 381 * power of 10 that can be represented exactly. Finally, compute 382 * (exactly) the remaining power of 10 and perform one more 383 * multiplication or division. 384 */ 385 if (number < 1.0f) 386 { 387 UNITY_DOUBLE factor = 1.0f; 388 389 while (number < (UNITY_DOUBLE)max_scaled / 1e10f) { number *= 1e10f; exponent -= 10; } 390 while (number * factor < (UNITY_DOUBLE)min_scaled) { factor *= 10.0f; exponent--; } 391 392 number *= factor; 393 } 394 else if (number > (UNITY_DOUBLE)max_scaled) 395 { 396 UNITY_DOUBLE divisor = 1.0f; 397 398 while (number > (UNITY_DOUBLE)min_scaled * 1e10f) { number /= 1e10f; exponent += 10; } 399 while (number / divisor > (UNITY_DOUBLE)max_scaled) { divisor *= 10.0f; exponent++; } 400 401 number /= divisor; 402 } 403 else 404 { 405 /* 406 * In this range, we can split off the integer part before 407 * doing any multiplications. This reduces rounding error by 408 * freeing up significant bits in the fractional part. 409 */ 410 UNITY_DOUBLE factor = 1.0f; 411 n_int = (UNITY_INT32)number; 412 number -= (UNITY_DOUBLE)n_int; 413 414 while (n_int < min_scaled) { n_int *= 10; factor *= 10.0f; exponent--; } 415 416 number *= factor; 417 } 418 419 /* round to nearest integer */ 420 n = ((UNITY_INT32)(number + number) + 1) / 2; 421 422 #ifndef UNITY_ROUND_TIES_AWAY_FROM_ZERO 423 /* round to even if exactly between two integers */ 424 if ((n & 1) && (((UNITY_DOUBLE)n - number) == 0.5f)) 425 n--; 426 #endif 427 428 n += n_int; 429 430 if (n >= max_scaled) 431 { 432 n = min_scaled; 433 exponent++; 434 } 435 436 /* determine where to place decimal point */ 437 decimals = ((exponent <= 0) && (exponent >= -(sig_digits + 3))) ? (-exponent) : (sig_digits - 1); 438 exponent += decimals; 439 440 /* truncate trailing zeroes after decimal point */ 441 while ((decimals > 0) && ((n % 10) == 0)) 442 { 443 n /= 10; 444 decimals--; 445 } 446 447 /* build up buffer in reverse order */ 448 digits = 0; 449 while ((n != 0) || (digits < (decimals + 1))) 450 { 451 buf[digits++] = (char)('0' + n % 10); 452 n /= 10; 453 } 454 while (digits > 0) 455 { 456 if (digits == decimals) { UNITY_OUTPUT_CHAR('.'); } 457 UNITY_OUTPUT_CHAR(buf[--digits]); 458 } 459 460 /* print exponent if needed */ 461 if (exponent != 0) 462 { 463 UNITY_OUTPUT_CHAR('e'); 464 465 if (exponent < 0) 466 { 467 UNITY_OUTPUT_CHAR('-'); 468 exponent = -exponent; 469 } 470 else 471 { 472 UNITY_OUTPUT_CHAR('+'); 473 } 474 475 digits = 0; 476 while ((exponent != 0) || (digits < 2)) 477 { 478 buf[digits++] = (char)('0' + exponent % 10); 479 exponent /= 10; 480 } 481 while (digits > 0) 482 { 483 UNITY_OUTPUT_CHAR(buf[--digits]); 484 } 485 } 486 } 487 } 488 #endif /* ! UNITY_EXCLUDE_FLOAT_PRINT */ 489 490 /*-----------------------------------------------*/ 491 static void UnityTestResultsBegin(const char* file, const UNITY_LINE_TYPE line) 492 { 493 #ifdef UNITY_OUTPUT_FOR_ECLIPSE 494 UNITY_OUTPUT_CHAR('('); 495 UnityPrint(file); 496 UNITY_OUTPUT_CHAR(':'); 497 UnityPrintNumber((UNITY_INT)line); 498 UNITY_OUTPUT_CHAR(')'); 499 UNITY_OUTPUT_CHAR(' '); 500 UnityPrint(Unity.CurrentTestName); 501 UNITY_OUTPUT_CHAR(':'); 502 #else 503 #ifdef UNITY_OUTPUT_FOR_IAR_WORKBENCH 504 UnityPrint("<SRCREF line="); 505 UnityPrintNumber((UNITY_INT)line); 506 UnityPrint(" file=\""); 507 UnityPrint(file); 508 UNITY_OUTPUT_CHAR('"'); 509 UNITY_OUTPUT_CHAR('>'); 510 UnityPrint(Unity.CurrentTestName); 511 UnityPrint("</SRCREF> "); 512 #else 513 #ifdef UNITY_OUTPUT_FOR_QT_CREATOR 514 UnityPrint("file://"); 515 UnityPrint(file); 516 UNITY_OUTPUT_CHAR(':'); 517 UnityPrintNumber((UNITY_INT)line); 518 UNITY_OUTPUT_CHAR(' '); 519 UnityPrint(Unity.CurrentTestName); 520 UNITY_OUTPUT_CHAR(':'); 521 #else 522 UnityPrint(file); 523 UNITY_OUTPUT_CHAR(':'); 524 UnityPrintNumber((UNITY_INT)line); 525 UNITY_OUTPUT_CHAR(':'); 526 UnityPrint(Unity.CurrentTestName); 527 UNITY_OUTPUT_CHAR(':'); 528 #endif 529 #endif 530 #endif 531 } 532 533 /*-----------------------------------------------*/ 534 static void UnityTestResultsFailBegin(const UNITY_LINE_TYPE line) 535 { 536 UnityTestResultsBegin(Unity.TestFile, line); 537 UnityPrint(UnityStrFail); 538 UNITY_OUTPUT_CHAR(':'); 539 } 540 541 /*-----------------------------------------------*/ 542 void UnityConcludeTest(void) 543 { 544 if (Unity.CurrentTestIgnored) 545 { 546 Unity.TestIgnores++; 547 } 548 else if (!Unity.CurrentTestFailed) 549 { 550 UnityTestResultsBegin(Unity.TestFile, Unity.CurrentTestLineNumber); 551 UnityPrint(UnityStrPass); 552 } 553 else 554 { 555 Unity.TestFailures++; 556 } 557 558 Unity.CurrentTestFailed = 0; 559 Unity.CurrentTestIgnored = 0; 560 UNITY_PRINT_EXEC_TIME(); 561 UNITY_PRINT_EOL(); 562 UNITY_FLUSH_CALL(); 563 } 564 565 /*-----------------------------------------------*/ 566 static void UnityAddMsgIfSpecified(const char* msg) 567 { 568 if (msg) 569 { 570 UnityPrint(UnityStrSpacer); 571 572 #ifdef UNITY_PRINT_TEST_CONTEXT 573 UNITY_PRINT_TEST_CONTEXT(); 574 #endif 575 #ifndef UNITY_EXCLUDE_DETAILS 576 if (Unity.CurrentDetail1) 577 { 578 UnityPrint(UnityStrDetail1Name); 579 UnityPrint(Unity.CurrentDetail1); 580 if (Unity.CurrentDetail2) 581 { 582 UnityPrint(UnityStrDetail2Name); 583 UnityPrint(Unity.CurrentDetail2); 584 } 585 UnityPrint(UnityStrSpacer); 586 } 587 #endif 588 UnityPrint(msg); 589 } 590 } 591 592 /*-----------------------------------------------*/ 593 static void UnityPrintExpectedAndActualStrings(const char* expected, const char* actual) 594 { 595 UnityPrint(UnityStrExpected); 596 if (expected != NULL) 597 { 598 UNITY_OUTPUT_CHAR('\''); 599 UnityPrint(expected); 600 UNITY_OUTPUT_CHAR('\''); 601 } 602 else 603 { 604 UnityPrint(UnityStrNull); 605 } 606 UnityPrint(UnityStrWas); 607 if (actual != NULL) 608 { 609 UNITY_OUTPUT_CHAR('\''); 610 UnityPrint(actual); 611 UNITY_OUTPUT_CHAR('\''); 612 } 613 else 614 { 615 UnityPrint(UnityStrNull); 616 } 617 } 618 619 /*-----------------------------------------------*/ 620 static void UnityPrintExpectedAndActualStringsLen(const char* expected, 621 const char* actual, 622 const UNITY_UINT32 length) 623 { 624 UnityPrint(UnityStrExpected); 625 if (expected != NULL) 626 { 627 UNITY_OUTPUT_CHAR('\''); 628 UnityPrintLen(expected, length); 629 UNITY_OUTPUT_CHAR('\''); 630 } 631 else 632 { 633 UnityPrint(UnityStrNull); 634 } 635 UnityPrint(UnityStrWas); 636 if (actual != NULL) 637 { 638 UNITY_OUTPUT_CHAR('\''); 639 UnityPrintLen(actual, length); 640 UNITY_OUTPUT_CHAR('\''); 641 } 642 else 643 { 644 UnityPrint(UnityStrNull); 645 } 646 } 647 648 /*----------------------------------------------- 649 * Assertion & Control Helpers 650 *-----------------------------------------------*/ 651 652 /*-----------------------------------------------*/ 653 static int UnityIsOneArrayNull(UNITY_INTERNAL_PTR expected, 654 UNITY_INTERNAL_PTR actual, 655 const UNITY_LINE_TYPE lineNumber, 656 const char* msg) 657 { 658 /* Both are NULL or same pointer */ 659 if (expected == actual) { return 0; } 660 661 /* print and return true if just expected is NULL */ 662 if (expected == NULL) 663 { 664 UnityTestResultsFailBegin(lineNumber); 665 UnityPrint(UnityStrNullPointerForExpected); 666 UnityAddMsgIfSpecified(msg); 667 return 1; 668 } 669 670 /* print and return true if just actual is NULL */ 671 if (actual == NULL) 672 { 673 UnityTestResultsFailBegin(lineNumber); 674 UnityPrint(UnityStrNullPointerForActual); 675 UnityAddMsgIfSpecified(msg); 676 return 1; 677 } 678 679 return 0; /* return false if neither is NULL */ 680 } 681 682 /*----------------------------------------------- 683 * Assertion Functions 684 *-----------------------------------------------*/ 685 686 /*-----------------------------------------------*/ 687 void UnityAssertBits(const UNITY_INT mask, 688 const UNITY_INT expected, 689 const UNITY_INT actual, 690 const char* msg, 691 const UNITY_LINE_TYPE lineNumber) 692 { 693 RETURN_IF_FAIL_OR_IGNORE; 694 695 if ((mask & expected) != (mask & actual)) 696 { 697 UnityTestResultsFailBegin(lineNumber); 698 UnityPrint(UnityStrExpected); 699 UnityPrintMask((UNITY_UINT)mask, (UNITY_UINT)expected); 700 UnityPrint(UnityStrWas); 701 UnityPrintMask((UNITY_UINT)mask, (UNITY_UINT)actual); 702 UnityAddMsgIfSpecified(msg); 703 UNITY_FAIL_AND_BAIL; 704 } 705 } 706 707 /*-----------------------------------------------*/ 708 void UnityAssertEqualNumber(const UNITY_INT expected, 709 const UNITY_INT actual, 710 const char* msg, 711 const UNITY_LINE_TYPE lineNumber, 712 const UNITY_DISPLAY_STYLE_T style) 713 { 714 RETURN_IF_FAIL_OR_IGNORE; 715 716 if (expected != actual) 717 { 718 UnityTestResultsFailBegin(lineNumber); 719 UnityPrint(UnityStrExpected); 720 UnityPrintNumberByStyle(expected, style); 721 UnityPrint(UnityStrWas); 722 UnityPrintNumberByStyle(actual, style); 723 UnityAddMsgIfSpecified(msg); 724 UNITY_FAIL_AND_BAIL; 725 } 726 } 727 728 /*-----------------------------------------------*/ 729 void UnityAssertGreaterOrLessOrEqualNumber(const UNITY_INT threshold, 730 const UNITY_INT actual, 731 const UNITY_COMPARISON_T compare, 732 const char *msg, 733 const UNITY_LINE_TYPE lineNumber, 734 const UNITY_DISPLAY_STYLE_T style) 735 { 736 int failed = 0; 737 RETURN_IF_FAIL_OR_IGNORE; 738 739 if ((threshold == actual) && (compare & UNITY_EQUAL_TO)) { return; } 740 if ((threshold == actual)) { failed = 1; } 741 742 if ((style & UNITY_DISPLAY_RANGE_INT) == UNITY_DISPLAY_RANGE_INT) 743 { 744 if ((actual > threshold) && (compare & UNITY_SMALLER_THAN)) { failed = 1; } 745 if ((actual < threshold) && (compare & UNITY_GREATER_THAN)) { failed = 1; } 746 } 747 else /* UINT or HEX */ 748 { 749 if (((UNITY_UINT)actual > (UNITY_UINT)threshold) && (compare & UNITY_SMALLER_THAN)) { failed = 1; } 750 if (((UNITY_UINT)actual < (UNITY_UINT)threshold) && (compare & UNITY_GREATER_THAN)) { failed = 1; } 751 } 752 753 if (failed) 754 { 755 UnityTestResultsFailBegin(lineNumber); 756 UnityPrint(UnityStrExpected); 757 UnityPrintNumberByStyle(actual, style); 758 if (compare & UNITY_GREATER_THAN) { UnityPrint(UnityStrGt); } 759 if (compare & UNITY_SMALLER_THAN) { UnityPrint(UnityStrLt); } 760 if (compare & UNITY_EQUAL_TO) { UnityPrint(UnityStrOrEqual); } 761 if (compare == UNITY_NOT_EQUAL) { UnityPrint(UnityStrNotEqual); } 762 UnityPrintNumberByStyle(threshold, style); 763 UnityAddMsgIfSpecified(msg); 764 UNITY_FAIL_AND_BAIL; 765 } 766 } 767 768 #define UnityPrintPointlessAndBail() \ 769 { \ 770 UnityTestResultsFailBegin(lineNumber); \ 771 UnityPrint(UnityStrPointless); \ 772 UnityAddMsgIfSpecified(msg); \ 773 UNITY_FAIL_AND_BAIL; } 774 775 /*-----------------------------------------------*/ 776 void UnityAssertEqualIntArray(UNITY_INTERNAL_PTR expected, 777 UNITY_INTERNAL_PTR actual, 778 const UNITY_UINT32 num_elements, 779 const char* msg, 780 const UNITY_LINE_TYPE lineNumber, 781 const UNITY_DISPLAY_STYLE_T style, 782 const UNITY_FLAGS_T flags) 783 { 784 UNITY_UINT32 elements = num_elements; 785 unsigned int length = style & 0xF; 786 unsigned int increment = 0; 787 788 RETURN_IF_FAIL_OR_IGNORE; 789 790 if (num_elements == 0) 791 { 792 UnityPrintPointlessAndBail(); 793 } 794 795 if (expected == actual) 796 { 797 return; /* Both are NULL or same pointer */ 798 } 799 800 if (UnityIsOneArrayNull(expected, actual, lineNumber, msg)) 801 { 802 UNITY_FAIL_AND_BAIL; 803 } 804 805 while ((elements > 0) && (elements--)) 806 { 807 UNITY_INT expect_val; 808 UNITY_INT actual_val; 809 810 switch (length) 811 { 812 case 1: 813 expect_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT8*)expected; 814 actual_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT8*)actual; 815 increment = sizeof(UNITY_INT8); 816 break; 817 818 case 2: 819 expect_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT16*)expected; 820 actual_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT16*)actual; 821 increment = sizeof(UNITY_INT16); 822 break; 823 824 #ifdef UNITY_SUPPORT_64 825 case 8: 826 expect_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT64*)expected; 827 actual_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT64*)actual; 828 increment = sizeof(UNITY_INT64); 829 break; 830 #endif 831 832 default: /* default is length 4 bytes */ 833 case 4: 834 expect_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT32*)expected; 835 actual_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT32*)actual; 836 increment = sizeof(UNITY_INT32); 837 length = 4; 838 break; 839 } 840 841 if (expect_val != actual_val) 842 { 843 if ((style & UNITY_DISPLAY_RANGE_UINT) && (length < (UNITY_INT_WIDTH / 8))) 844 { /* For UINT, remove sign extension (padding 1's) from signed type casts above */ 845 UNITY_INT mask = 1; 846 mask = (mask << 8 * length) - 1; 847 expect_val &= mask; 848 actual_val &= mask; 849 } 850 UnityTestResultsFailBegin(lineNumber); 851 UnityPrint(UnityStrElement); 852 UnityPrintNumberUnsigned(num_elements - elements - 1); 853 UnityPrint(UnityStrExpected); 854 UnityPrintNumberByStyle(expect_val, style); 855 UnityPrint(UnityStrWas); 856 UnityPrintNumberByStyle(actual_val, style); 857 UnityAddMsgIfSpecified(msg); 858 UNITY_FAIL_AND_BAIL; 859 } 860 /* Walk through array by incrementing the pointers */ 861 if (flags == UNITY_ARRAY_TO_ARRAY) 862 { 863 expected = (UNITY_INTERNAL_PTR)((const char*)expected + increment); 864 } 865 actual = (UNITY_INTERNAL_PTR)((const char*)actual + increment); 866 } 867 } 868 869 /*-----------------------------------------------*/ 870 #ifndef UNITY_EXCLUDE_FLOAT 871 /* Wrap this define in a function with variable types as float or double */ 872 #define UNITY_FLOAT_OR_DOUBLE_WITHIN(delta, expected, actual, diff) \ 873 if (isinf(expected) && isinf(actual) && (((expected) < 0) == ((actual) < 0))) return 1; \ 874 if (UNITY_NAN_CHECK) return 1; \ 875 (diff) = (actual) - (expected); \ 876 if ((diff) < 0) (diff) = -(diff); \ 877 if ((delta) < 0) (delta) = -(delta); \ 878 return !(isnan(diff) || isinf(diff) || ((diff) > (delta))) 879 /* This first part of this condition will catch any NaN or Infinite values */ 880 #ifndef UNITY_NAN_NOT_EQUAL_NAN 881 #define UNITY_NAN_CHECK isnan(expected) && isnan(actual) 882 #else 883 #define UNITY_NAN_CHECK 0 884 #endif 885 886 #ifndef UNITY_EXCLUDE_FLOAT_PRINT 887 #define UNITY_PRINT_EXPECTED_AND_ACTUAL_FLOAT(expected, actual) \ 888 { \ 889 UnityPrint(UnityStrExpected); \ 890 UnityPrintFloat(expected); \ 891 UnityPrint(UnityStrWas); \ 892 UnityPrintFloat(actual); } 893 #else 894 #define UNITY_PRINT_EXPECTED_AND_ACTUAL_FLOAT(expected, actual) \ 895 UnityPrint(UnityStrDelta) 896 #endif /* UNITY_EXCLUDE_FLOAT_PRINT */ 897 898 /*-----------------------------------------------*/ 899 static int UnityFloatsWithin(UNITY_FLOAT delta, UNITY_FLOAT expected, UNITY_FLOAT actual) 900 { 901 UNITY_FLOAT diff; 902 UNITY_FLOAT_OR_DOUBLE_WITHIN(delta, expected, actual, diff); 903 } 904 905 /*-----------------------------------------------*/ 906 void UnityAssertEqualFloatArray(UNITY_PTR_ATTRIBUTE const UNITY_FLOAT* expected, 907 UNITY_PTR_ATTRIBUTE const UNITY_FLOAT* actual, 908 const UNITY_UINT32 num_elements, 909 const char* msg, 910 const UNITY_LINE_TYPE lineNumber, 911 const UNITY_FLAGS_T flags) 912 { 913 UNITY_UINT32 elements = num_elements; 914 UNITY_PTR_ATTRIBUTE const UNITY_FLOAT* ptr_expected = expected; 915 UNITY_PTR_ATTRIBUTE const UNITY_FLOAT* ptr_actual = actual; 916 917 RETURN_IF_FAIL_OR_IGNORE; 918 919 if (elements == 0) 920 { 921 UnityPrintPointlessAndBail(); 922 } 923 924 if (expected == actual) 925 { 926 return; /* Both are NULL or same pointer */ 927 } 928 929 if (UnityIsOneArrayNull((UNITY_INTERNAL_PTR)expected, (UNITY_INTERNAL_PTR)actual, lineNumber, msg)) 930 { 931 UNITY_FAIL_AND_BAIL; 932 } 933 934 while (elements--) 935 { 936 if (!UnityFloatsWithin(*ptr_expected * UNITY_FLOAT_PRECISION, *ptr_expected, *ptr_actual)) 937 { 938 UnityTestResultsFailBegin(lineNumber); 939 UnityPrint(UnityStrElement); 940 UnityPrintNumberUnsigned(num_elements - elements - 1); 941 UNITY_PRINT_EXPECTED_AND_ACTUAL_FLOAT((UNITY_DOUBLE)*ptr_expected, (UNITY_DOUBLE)*ptr_actual); 942 UnityAddMsgIfSpecified(msg); 943 UNITY_FAIL_AND_BAIL; 944 } 945 if (flags == UNITY_ARRAY_TO_ARRAY) 946 { 947 ptr_expected++; 948 } 949 ptr_actual++; 950 } 951 } 952 953 /*-----------------------------------------------*/ 954 void UnityAssertFloatsWithin(const UNITY_FLOAT delta, 955 const UNITY_FLOAT expected, 956 const UNITY_FLOAT actual, 957 const char* msg, 958 const UNITY_LINE_TYPE lineNumber) 959 { 960 RETURN_IF_FAIL_OR_IGNORE; 961 962 963 if (!UnityFloatsWithin(delta, expected, actual)) 964 { 965 UnityTestResultsFailBegin(lineNumber); 966 UNITY_PRINT_EXPECTED_AND_ACTUAL_FLOAT((UNITY_DOUBLE)expected, (UNITY_DOUBLE)actual); 967 UnityAddMsgIfSpecified(msg); 968 UNITY_FAIL_AND_BAIL; 969 } 970 } 971 972 /*-----------------------------------------------*/ 973 void UnityAssertFloatSpecial(const UNITY_FLOAT actual, 974 const char* msg, 975 const UNITY_LINE_TYPE lineNumber, 976 const UNITY_FLOAT_TRAIT_T style) 977 { 978 const char* trait_names[] = {UnityStrInf, UnityStrNegInf, UnityStrNaN, UnityStrDet}; 979 UNITY_INT should_be_trait = ((UNITY_INT)style & 1); 980 UNITY_INT is_trait = !should_be_trait; 981 UNITY_INT trait_index = (UNITY_INT)(style >> 1); 982 983 RETURN_IF_FAIL_OR_IGNORE; 984 985 switch (style) 986 { 987 case UNITY_FLOAT_IS_INF: 988 case UNITY_FLOAT_IS_NOT_INF: 989 is_trait = isinf(actual) && (actual > 0); 990 break; 991 case UNITY_FLOAT_IS_NEG_INF: 992 case UNITY_FLOAT_IS_NOT_NEG_INF: 993 is_trait = isinf(actual) && (actual < 0); 994 break; 995 996 case UNITY_FLOAT_IS_NAN: 997 case UNITY_FLOAT_IS_NOT_NAN: 998 is_trait = isnan(actual) ? 1 : 0; 999 break; 1000 1001 case UNITY_FLOAT_IS_DET: /* A determinate number is non infinite and not NaN. */ 1002 case UNITY_FLOAT_IS_NOT_DET: 1003 is_trait = !isinf(actual) && !isnan(actual); 1004 break; 1005 1006 default: /* including UNITY_FLOAT_INVALID_TRAIT */ 1007 trait_index = 0; 1008 trait_names[0] = UnityStrInvalidFloatTrait; 1009 break; 1010 } 1011 1012 if (is_trait != should_be_trait) 1013 { 1014 UnityTestResultsFailBegin(lineNumber); 1015 UnityPrint(UnityStrExpected); 1016 if (!should_be_trait) 1017 { 1018 UnityPrint(UnityStrNot); 1019 } 1020 UnityPrint(trait_names[trait_index]); 1021 UnityPrint(UnityStrWas); 1022 #ifndef UNITY_EXCLUDE_FLOAT_PRINT 1023 UnityPrintFloat((UNITY_DOUBLE)actual); 1024 #else 1025 if (should_be_trait) 1026 { 1027 UnityPrint(UnityStrNot); 1028 } 1029 UnityPrint(trait_names[trait_index]); 1030 #endif 1031 UnityAddMsgIfSpecified(msg); 1032 UNITY_FAIL_AND_BAIL; 1033 } 1034 } 1035 1036 #endif /* not UNITY_EXCLUDE_FLOAT */ 1037 1038 /*-----------------------------------------------*/ 1039 #ifndef UNITY_EXCLUDE_DOUBLE 1040 static int UnityDoublesWithin(UNITY_DOUBLE delta, UNITY_DOUBLE expected, UNITY_DOUBLE actual) 1041 { 1042 UNITY_DOUBLE diff; 1043 UNITY_FLOAT_OR_DOUBLE_WITHIN(delta, expected, actual, diff); 1044 } 1045 1046 /*-----------------------------------------------*/ 1047 void UnityAssertEqualDoubleArray(UNITY_PTR_ATTRIBUTE const UNITY_DOUBLE* expected, 1048 UNITY_PTR_ATTRIBUTE const UNITY_DOUBLE* actual, 1049 const UNITY_UINT32 num_elements, 1050 const char* msg, 1051 const UNITY_LINE_TYPE lineNumber, 1052 const UNITY_FLAGS_T flags) 1053 { 1054 UNITY_UINT32 elements = num_elements; 1055 UNITY_PTR_ATTRIBUTE const UNITY_DOUBLE* ptr_expected = expected; 1056 UNITY_PTR_ATTRIBUTE const UNITY_DOUBLE* ptr_actual = actual; 1057 1058 RETURN_IF_FAIL_OR_IGNORE; 1059 1060 if (elements == 0) 1061 { 1062 UnityPrintPointlessAndBail(); 1063 } 1064 1065 if (expected == actual) 1066 { 1067 return; /* Both are NULL or same pointer */ 1068 } 1069 1070 if (UnityIsOneArrayNull((UNITY_INTERNAL_PTR)expected, (UNITY_INTERNAL_PTR)actual, lineNumber, msg)) 1071 { 1072 UNITY_FAIL_AND_BAIL; 1073 } 1074 1075 while (elements--) 1076 { 1077 if (!UnityDoublesWithin(*ptr_expected * UNITY_DOUBLE_PRECISION, *ptr_expected, *ptr_actual)) 1078 { 1079 UnityTestResultsFailBegin(lineNumber); 1080 UnityPrint(UnityStrElement); 1081 UnityPrintNumberUnsigned(num_elements - elements - 1); 1082 UNITY_PRINT_EXPECTED_AND_ACTUAL_FLOAT(*ptr_expected, *ptr_actual); 1083 UnityAddMsgIfSpecified(msg); 1084 UNITY_FAIL_AND_BAIL; 1085 } 1086 if (flags == UNITY_ARRAY_TO_ARRAY) 1087 { 1088 ptr_expected++; 1089 } 1090 ptr_actual++; 1091 } 1092 } 1093 1094 /*-----------------------------------------------*/ 1095 void UnityAssertDoublesWithin(const UNITY_DOUBLE delta, 1096 const UNITY_DOUBLE expected, 1097 const UNITY_DOUBLE actual, 1098 const char* msg, 1099 const UNITY_LINE_TYPE lineNumber) 1100 { 1101 RETURN_IF_FAIL_OR_IGNORE; 1102 1103 if (!UnityDoublesWithin(delta, expected, actual)) 1104 { 1105 UnityTestResultsFailBegin(lineNumber); 1106 UNITY_PRINT_EXPECTED_AND_ACTUAL_FLOAT(expected, actual); 1107 UnityAddMsgIfSpecified(msg); 1108 UNITY_FAIL_AND_BAIL; 1109 } 1110 } 1111 1112 /*-----------------------------------------------*/ 1113 void UnityAssertDoubleSpecial(const UNITY_DOUBLE actual, 1114 const char* msg, 1115 const UNITY_LINE_TYPE lineNumber, 1116 const UNITY_FLOAT_TRAIT_T style) 1117 { 1118 const char* trait_names[] = {UnityStrInf, UnityStrNegInf, UnityStrNaN, UnityStrDet}; 1119 UNITY_INT should_be_trait = ((UNITY_INT)style & 1); 1120 UNITY_INT is_trait = !should_be_trait; 1121 UNITY_INT trait_index = (UNITY_INT)(style >> 1); 1122 1123 RETURN_IF_FAIL_OR_IGNORE; 1124 1125 switch (style) 1126 { 1127 case UNITY_FLOAT_IS_INF: 1128 case UNITY_FLOAT_IS_NOT_INF: 1129 is_trait = isinf(actual) && (actual > 0); 1130 break; 1131 case UNITY_FLOAT_IS_NEG_INF: 1132 case UNITY_FLOAT_IS_NOT_NEG_INF: 1133 is_trait = isinf(actual) && (actual < 0); 1134 break; 1135 1136 case UNITY_FLOAT_IS_NAN: 1137 case UNITY_FLOAT_IS_NOT_NAN: 1138 is_trait = isnan(actual) ? 1 : 0; 1139 break; 1140 1141 case UNITY_FLOAT_IS_DET: /* A determinate number is non infinite and not NaN. */ 1142 case UNITY_FLOAT_IS_NOT_DET: 1143 is_trait = !isinf(actual) && !isnan(actual); 1144 break; 1145 1146 default: /* including UNITY_FLOAT_INVALID_TRAIT */ 1147 trait_index = 0; 1148 trait_names[0] = UnityStrInvalidFloatTrait; 1149 break; 1150 } 1151 1152 if (is_trait != should_be_trait) 1153 { 1154 UnityTestResultsFailBegin(lineNumber); 1155 UnityPrint(UnityStrExpected); 1156 if (!should_be_trait) 1157 { 1158 UnityPrint(UnityStrNot); 1159 } 1160 UnityPrint(trait_names[trait_index]); 1161 UnityPrint(UnityStrWas); 1162 #ifndef UNITY_EXCLUDE_FLOAT_PRINT 1163 UnityPrintFloat(actual); 1164 #else 1165 if (should_be_trait) 1166 { 1167 UnityPrint(UnityStrNot); 1168 } 1169 UnityPrint(trait_names[trait_index]); 1170 #endif 1171 UnityAddMsgIfSpecified(msg); 1172 UNITY_FAIL_AND_BAIL; 1173 } 1174 } 1175 1176 #endif /* not UNITY_EXCLUDE_DOUBLE */ 1177 1178 /*-----------------------------------------------*/ 1179 void UnityAssertNumbersWithin(const UNITY_UINT delta, 1180 const UNITY_INT expected, 1181 const UNITY_INT actual, 1182 const char* msg, 1183 const UNITY_LINE_TYPE lineNumber, 1184 const UNITY_DISPLAY_STYLE_T style) 1185 { 1186 RETURN_IF_FAIL_OR_IGNORE; 1187 1188 if ((style & UNITY_DISPLAY_RANGE_INT) == UNITY_DISPLAY_RANGE_INT) 1189 { 1190 if (actual > expected) 1191 { 1192 Unity.CurrentTestFailed = (((UNITY_UINT)actual - (UNITY_UINT)expected) > delta); 1193 } 1194 else 1195 { 1196 Unity.CurrentTestFailed = (((UNITY_UINT)expected - (UNITY_UINT)actual) > delta); 1197 } 1198 } 1199 else 1200 { 1201 if ((UNITY_UINT)actual > (UNITY_UINT)expected) 1202 { 1203 Unity.CurrentTestFailed = (((UNITY_UINT)actual - (UNITY_UINT)expected) > delta); 1204 } 1205 else 1206 { 1207 Unity.CurrentTestFailed = (((UNITY_UINT)expected - (UNITY_UINT)actual) > delta); 1208 } 1209 } 1210 1211 if (Unity.CurrentTestFailed) 1212 { 1213 UnityTestResultsFailBegin(lineNumber); 1214 UnityPrint(UnityStrDelta); 1215 UnityPrintNumberByStyle((UNITY_INT)delta, style); 1216 UnityPrint(UnityStrExpected); 1217 UnityPrintNumberByStyle(expected, style); 1218 UnityPrint(UnityStrWas); 1219 UnityPrintNumberByStyle(actual, style); 1220 UnityAddMsgIfSpecified(msg); 1221 UNITY_FAIL_AND_BAIL; 1222 } 1223 } 1224 1225 /*-----------------------------------------------*/ 1226 void UnityAssertNumbersArrayWithin(const UNITY_UINT delta, 1227 UNITY_INTERNAL_PTR expected, 1228 UNITY_INTERNAL_PTR actual, 1229 const UNITY_UINT32 num_elements, 1230 const char* msg, 1231 const UNITY_LINE_TYPE lineNumber, 1232 const UNITY_DISPLAY_STYLE_T style, 1233 const UNITY_FLAGS_T flags) 1234 { 1235 UNITY_UINT32 elements = num_elements; 1236 unsigned int length = style & 0xF; 1237 unsigned int increment = 0; 1238 1239 RETURN_IF_FAIL_OR_IGNORE; 1240 1241 if (num_elements == 0) 1242 { 1243 UnityPrintPointlessAndBail(); 1244 } 1245 1246 if (expected == actual) 1247 { 1248 return; /* Both are NULL or same pointer */ 1249 } 1250 1251 if (UnityIsOneArrayNull(expected, actual, lineNumber, msg)) 1252 { 1253 UNITY_FAIL_AND_BAIL; 1254 } 1255 1256 while ((elements > 0) && (elements--)) 1257 { 1258 UNITY_INT expect_val; 1259 UNITY_INT actual_val; 1260 1261 switch (length) 1262 { 1263 case 1: 1264 expect_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT8*)expected; 1265 actual_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT8*)actual; 1266 increment = sizeof(UNITY_INT8); 1267 break; 1268 1269 case 2: 1270 expect_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT16*)expected; 1271 actual_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT16*)actual; 1272 increment = sizeof(UNITY_INT16); 1273 break; 1274 1275 #ifdef UNITY_SUPPORT_64 1276 case 8: 1277 expect_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT64*)expected; 1278 actual_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT64*)actual; 1279 increment = sizeof(UNITY_INT64); 1280 break; 1281 #endif 1282 1283 default: /* default is length 4 bytes */ 1284 case 4: 1285 expect_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT32*)expected; 1286 actual_val = *(UNITY_PTR_ATTRIBUTE const UNITY_INT32*)actual; 1287 increment = sizeof(UNITY_INT32); 1288 length = 4; 1289 break; 1290 } 1291 1292 if ((style & UNITY_DISPLAY_RANGE_INT) == UNITY_DISPLAY_RANGE_INT) 1293 { 1294 if (actual_val > expect_val) 1295 { 1296 Unity.CurrentTestFailed = (((UNITY_UINT)actual_val - (UNITY_UINT)expect_val) > delta); 1297 } 1298 else 1299 { 1300 Unity.CurrentTestFailed = (((UNITY_UINT)expect_val - (UNITY_UINT)actual_val) > delta); 1301 } 1302 } 1303 else 1304 { 1305 if ((UNITY_UINT)actual_val > (UNITY_UINT)expect_val) 1306 { 1307 Unity.CurrentTestFailed = (((UNITY_UINT)actual_val - (UNITY_UINT)expect_val) > delta); 1308 } 1309 else 1310 { 1311 Unity.CurrentTestFailed = (((UNITY_UINT)expect_val - (UNITY_UINT)actual_val) > delta); 1312 } 1313 } 1314 1315 if (Unity.CurrentTestFailed) 1316 { 1317 if ((style & UNITY_DISPLAY_RANGE_UINT) && (length < (UNITY_INT_WIDTH / 8))) 1318 { /* For UINT, remove sign extension (padding 1's) from signed type casts above */ 1319 UNITY_INT mask = 1; 1320 mask = (mask << 8 * length) - 1; 1321 expect_val &= mask; 1322 actual_val &= mask; 1323 } 1324 UnityTestResultsFailBegin(lineNumber); 1325 UnityPrint(UnityStrDelta); 1326 UnityPrintNumberByStyle((UNITY_INT)delta, style); 1327 UnityPrint(UnityStrElement); 1328 UnityPrintNumberUnsigned(num_elements - elements - 1); 1329 UnityPrint(UnityStrExpected); 1330 UnityPrintNumberByStyle(expect_val, style); 1331 UnityPrint(UnityStrWas); 1332 UnityPrintNumberByStyle(actual_val, style); 1333 UnityAddMsgIfSpecified(msg); 1334 UNITY_FAIL_AND_BAIL; 1335 } 1336 /* Walk through array by incrementing the pointers */ 1337 if (flags == UNITY_ARRAY_TO_ARRAY) 1338 { 1339 expected = (UNITY_INTERNAL_PTR)((const char*)expected + increment); 1340 } 1341 actual = (UNITY_INTERNAL_PTR)((const char*)actual + increment); 1342 } 1343 } 1344 1345 /*-----------------------------------------------*/ 1346 void UnityAssertEqualString(const char* expected, 1347 const char* actual, 1348 const char* msg, 1349 const UNITY_LINE_TYPE lineNumber) 1350 { 1351 UNITY_UINT32 i; 1352 1353 RETURN_IF_FAIL_OR_IGNORE; 1354 1355 /* if both pointers not null compare the strings */ 1356 if (expected && actual) 1357 { 1358 for (i = 0; expected[i] || actual[i]; i++) 1359 { 1360 if (expected[i] != actual[i]) 1361 { 1362 Unity.CurrentTestFailed = 1; 1363 break; 1364 } 1365 } 1366 } 1367 else 1368 { /* handle case of one pointers being null (if both null, test should pass) */ 1369 if (expected != actual) 1370 { 1371 Unity.CurrentTestFailed = 1; 1372 } 1373 } 1374 1375 if (Unity.CurrentTestFailed) 1376 { 1377 UnityTestResultsFailBegin(lineNumber); 1378 UnityPrintExpectedAndActualStrings(expected, actual); 1379 UnityAddMsgIfSpecified(msg); 1380 UNITY_FAIL_AND_BAIL; 1381 } 1382 } 1383 1384 /*-----------------------------------------------*/ 1385 void UnityAssertEqualStringLen(const char* expected, 1386 const char* actual, 1387 const UNITY_UINT32 length, 1388 const char* msg, 1389 const UNITY_LINE_TYPE lineNumber) 1390 { 1391 UNITY_UINT32 i; 1392 1393 RETURN_IF_FAIL_OR_IGNORE; 1394 1395 /* if both pointers not null compare the strings */ 1396 if (expected && actual) 1397 { 1398 for (i = 0; (i < length) && (expected[i] || actual[i]); i++) 1399 { 1400 if (expected[i] != actual[i]) 1401 { 1402 Unity.CurrentTestFailed = 1; 1403 break; 1404 } 1405 } 1406 } 1407 else 1408 { /* handle case of one pointers being null (if both null, test should pass) */ 1409 if (expected != actual) 1410 { 1411 Unity.CurrentTestFailed = 1; 1412 } 1413 } 1414 1415 if (Unity.CurrentTestFailed) 1416 { 1417 UnityTestResultsFailBegin(lineNumber); 1418 UnityPrintExpectedAndActualStringsLen(expected, actual, length); 1419 UnityAddMsgIfSpecified(msg); 1420 UNITY_FAIL_AND_BAIL; 1421 } 1422 } 1423 1424 /*-----------------------------------------------*/ 1425 void UnityAssertEqualStringArray(UNITY_INTERNAL_PTR expected, 1426 const char** actual, 1427 const UNITY_UINT32 num_elements, 1428 const char* msg, 1429 const UNITY_LINE_TYPE lineNumber, 1430 const UNITY_FLAGS_T flags) 1431 { 1432 UNITY_UINT32 i = 0; 1433 UNITY_UINT32 j = 0; 1434 const char* expd = NULL; 1435 const char* act = NULL; 1436 1437 RETURN_IF_FAIL_OR_IGNORE; 1438 1439 /* if no elements, it's an error */ 1440 if (num_elements == 0) 1441 { 1442 UnityPrintPointlessAndBail(); 1443 } 1444 1445 if ((const void*)expected == (const void*)actual) 1446 { 1447 return; /* Both are NULL or same pointer */ 1448 } 1449 1450 if (UnityIsOneArrayNull((UNITY_INTERNAL_PTR)expected, (UNITY_INTERNAL_PTR)actual, lineNumber, msg)) 1451 { 1452 UNITY_FAIL_AND_BAIL; 1453 } 1454 1455 if (flags != UNITY_ARRAY_TO_ARRAY) 1456 { 1457 expd = (const char*)expected; 1458 } 1459 1460 do 1461 { 1462 act = actual[j]; 1463 if (flags == UNITY_ARRAY_TO_ARRAY) 1464 { 1465 expd = ((const char* const*)expected)[j]; 1466 } 1467 1468 /* if both pointers not null compare the strings */ 1469 if (expd && act) 1470 { 1471 for (i = 0; expd[i] || act[i]; i++) 1472 { 1473 if (expd[i] != act[i]) 1474 { 1475 Unity.CurrentTestFailed = 1; 1476 break; 1477 } 1478 } 1479 } 1480 else 1481 { /* handle case of one pointers being null (if both null, test should pass) */ 1482 if (expd != act) 1483 { 1484 Unity.CurrentTestFailed = 1; 1485 } 1486 } 1487 1488 if (Unity.CurrentTestFailed) 1489 { 1490 UnityTestResultsFailBegin(lineNumber); 1491 if (num_elements > 1) 1492 { 1493 UnityPrint(UnityStrElement); 1494 UnityPrintNumberUnsigned(j); 1495 } 1496 UnityPrintExpectedAndActualStrings(expd, act); 1497 UnityAddMsgIfSpecified(msg); 1498 UNITY_FAIL_AND_BAIL; 1499 } 1500 } while (++j < num_elements); 1501 } 1502 1503 /*-----------------------------------------------*/ 1504 void UnityAssertEqualMemory(UNITY_INTERNAL_PTR expected, 1505 UNITY_INTERNAL_PTR actual, 1506 const UNITY_UINT32 length, 1507 const UNITY_UINT32 num_elements, 1508 const char* msg, 1509 const UNITY_LINE_TYPE lineNumber, 1510 const UNITY_FLAGS_T flags) 1511 { 1512 UNITY_PTR_ATTRIBUTE const unsigned char* ptr_exp = (UNITY_PTR_ATTRIBUTE const unsigned char*)expected; 1513 UNITY_PTR_ATTRIBUTE const unsigned char* ptr_act = (UNITY_PTR_ATTRIBUTE const unsigned char*)actual; 1514 UNITY_UINT32 elements = num_elements; 1515 UNITY_UINT32 bytes; 1516 1517 RETURN_IF_FAIL_OR_IGNORE; 1518 1519 if ((elements == 0) || (length == 0)) 1520 { 1521 UnityPrintPointlessAndBail(); 1522 } 1523 1524 if (expected == actual) 1525 { 1526 return; /* Both are NULL or same pointer */ 1527 } 1528 1529 if (UnityIsOneArrayNull(expected, actual, lineNumber, msg)) 1530 { 1531 UNITY_FAIL_AND_BAIL; 1532 } 1533 1534 while (elements--) 1535 { 1536 bytes = length; 1537 while (bytes--) 1538 { 1539 if (*ptr_exp != *ptr_act) 1540 { 1541 UnityTestResultsFailBegin(lineNumber); 1542 UnityPrint(UnityStrMemory); 1543 if (num_elements > 1) 1544 { 1545 UnityPrint(UnityStrElement); 1546 UnityPrintNumberUnsigned(num_elements - elements - 1); 1547 } 1548 UnityPrint(UnityStrByte); 1549 UnityPrintNumberUnsigned(length - bytes - 1); 1550 UnityPrint(UnityStrExpected); 1551 UnityPrintNumberByStyle(*ptr_exp, UNITY_DISPLAY_STYLE_HEX8); 1552 UnityPrint(UnityStrWas); 1553 UnityPrintNumberByStyle(*ptr_act, UNITY_DISPLAY_STYLE_HEX8); 1554 UnityAddMsgIfSpecified(msg); 1555 UNITY_FAIL_AND_BAIL; 1556 } 1557 ptr_exp++; 1558 ptr_act++; 1559 } 1560 if (flags == UNITY_ARRAY_TO_VAL) 1561 { 1562 ptr_exp = (UNITY_PTR_ATTRIBUTE const unsigned char*)expected; 1563 } 1564 } 1565 } 1566 1567 /*-----------------------------------------------*/ 1568 1569 static union 1570 { 1571 UNITY_INT8 i8; 1572 UNITY_INT16 i16; 1573 UNITY_INT32 i32; 1574 #ifdef UNITY_SUPPORT_64 1575 UNITY_INT64 i64; 1576 #endif 1577 #ifndef UNITY_EXCLUDE_FLOAT 1578 float f; 1579 #endif 1580 #ifndef UNITY_EXCLUDE_DOUBLE 1581 double d; 1582 #endif 1583 } UnityQuickCompare; 1584 1585 UNITY_INTERNAL_PTR UnityNumToPtr(const UNITY_INT num, const UNITY_UINT8 size) 1586 { 1587 switch(size) 1588 { 1589 case 1: 1590 UnityQuickCompare.i8 = (UNITY_INT8)num; 1591 return (UNITY_INTERNAL_PTR)(&UnityQuickCompare.i8); 1592 1593 case 2: 1594 UnityQuickCompare.i16 = (UNITY_INT16)num; 1595 return (UNITY_INTERNAL_PTR)(&UnityQuickCompare.i16); 1596 1597 #ifdef UNITY_SUPPORT_64 1598 case 8: 1599 UnityQuickCompare.i64 = (UNITY_INT64)num; 1600 return (UNITY_INTERNAL_PTR)(&UnityQuickCompare.i64); 1601 #endif 1602 1603 default: /* 4 bytes */ 1604 UnityQuickCompare.i32 = (UNITY_INT32)num; 1605 return (UNITY_INTERNAL_PTR)(&UnityQuickCompare.i32); 1606 } 1607 } 1608 1609 #ifndef UNITY_EXCLUDE_FLOAT 1610 /*-----------------------------------------------*/ 1611 UNITY_INTERNAL_PTR UnityFloatToPtr(const float num) 1612 { 1613 UnityQuickCompare.f = num; 1614 return (UNITY_INTERNAL_PTR)(&UnityQuickCompare.f); 1615 } 1616 #endif 1617 1618 #ifndef UNITY_EXCLUDE_DOUBLE 1619 /*-----------------------------------------------*/ 1620 UNITY_INTERNAL_PTR UnityDoubleToPtr(const double num) 1621 { 1622 UnityQuickCompare.d = num; 1623 return (UNITY_INTERNAL_PTR)(&UnityQuickCompare.d); 1624 } 1625 #endif 1626 1627 /*----------------------------------------------- 1628 * printf helper function 1629 *-----------------------------------------------*/ 1630 #ifdef UNITY_INCLUDE_PRINT_FORMATTED 1631 static void UnityPrintFVA(const char* format, va_list va) 1632 { 1633 const char* pch = format; 1634 if (pch != NULL) 1635 { 1636 while (*pch) 1637 { 1638 /* format identification character */ 1639 if (*pch == '%') 1640 { 1641 pch++; 1642 1643 if (pch != NULL) 1644 { 1645 switch (*pch) 1646 { 1647 case 'd': 1648 case 'i': 1649 { 1650 const int number = va_arg(va, int); 1651 UnityPrintNumber((UNITY_INT)number); 1652 break; 1653 } 1654 #ifndef UNITY_EXCLUDE_FLOAT_PRINT 1655 case 'f': 1656 case 'g': 1657 { 1658 const double number = va_arg(va, double); 1659 UnityPrintFloat((UNITY_DOUBLE)number); 1660 break; 1661 } 1662 #endif 1663 case 'u': 1664 { 1665 const unsigned int number = va_arg(va, unsigned int); 1666 UnityPrintNumberUnsigned((UNITY_UINT)number); 1667 break; 1668 } 1669 case 'b': 1670 { 1671 const unsigned int number = va_arg(va, unsigned int); 1672 const UNITY_UINT mask = (UNITY_UINT)0 - (UNITY_UINT)1; 1673 UNITY_OUTPUT_CHAR('0'); 1674 UNITY_OUTPUT_CHAR('b'); 1675 UnityPrintMask(mask, (UNITY_UINT)number); 1676 break; 1677 } 1678 case 'x': 1679 case 'X': 1680 case 'p': 1681 { 1682 const unsigned int number = va_arg(va, unsigned int); 1683 UNITY_OUTPUT_CHAR('0'); 1684 UNITY_OUTPUT_CHAR('x'); 1685 UnityPrintNumberHex((UNITY_UINT)number, 8); 1686 break; 1687 } 1688 case 'c': 1689 { 1690 const int ch = va_arg(va, int); 1691 UnityPrintChar((const char *)&ch); 1692 break; 1693 } 1694 case 's': 1695 { 1696 const char * string = va_arg(va, const char *); 1697 UnityPrint(string); 1698 break; 1699 } 1700 case '%': 1701 { 1702 UnityPrintChar(pch); 1703 break; 1704 } 1705 default: 1706 { 1707 /* print the unknown format character */ 1708 UNITY_OUTPUT_CHAR('%'); 1709 UnityPrintChar(pch); 1710 break; 1711 } 1712 } 1713 } 1714 } 1715 #ifdef UNITY_OUTPUT_COLOR 1716 /* print ANSI escape code */ 1717 else if ((*pch == 27) && (*(pch + 1) == '[')) 1718 { 1719 pch += UnityPrintAnsiEscapeString(pch); 1720 continue; 1721 } 1722 #endif 1723 else if (*pch == '\n') 1724 { 1725 UNITY_PRINT_EOL(); 1726 } 1727 else 1728 { 1729 UnityPrintChar(pch); 1730 } 1731 1732 pch++; 1733 } 1734 } 1735 } 1736 1737 void UnityPrintF(const UNITY_LINE_TYPE line, const char* format, ...) 1738 { 1739 UnityTestResultsBegin(Unity.TestFile, line); 1740 UnityPrint("INFO"); 1741 if(format != NULL) 1742 { 1743 UnityPrint(": "); 1744 va_list va; 1745 va_start(va, format); 1746 UnityPrintFVA(format, va); 1747 va_end(va); 1748 } 1749 UNITY_PRINT_EOL(); 1750 } 1751 #endif /* ! UNITY_INCLUDE_PRINT_FORMATTED */ 1752 1753 1754 /*----------------------------------------------- 1755 * Control Functions 1756 *-----------------------------------------------*/ 1757 1758 /*-----------------------------------------------*/ 1759 void UnityFail(const char* msg, const UNITY_LINE_TYPE line) 1760 { 1761 RETURN_IF_FAIL_OR_IGNORE; 1762 1763 UnityTestResultsBegin(Unity.TestFile, line); 1764 UnityPrint(UnityStrFail); 1765 if (msg != NULL) 1766 { 1767 UNITY_OUTPUT_CHAR(':'); 1768 1769 #ifdef UNITY_PRINT_TEST_CONTEXT 1770 UNITY_PRINT_TEST_CONTEXT(); 1771 #endif 1772 #ifndef UNITY_EXCLUDE_DETAILS 1773 if (Unity.CurrentDetail1) 1774 { 1775 UnityPrint(UnityStrDetail1Name); 1776 UnityPrint(Unity.CurrentDetail1); 1777 if (Unity.CurrentDetail2) 1778 { 1779 UnityPrint(UnityStrDetail2Name); 1780 UnityPrint(Unity.CurrentDetail2); 1781 } 1782 UnityPrint(UnityStrSpacer); 1783 } 1784 #endif 1785 if (msg[0] != ' ') 1786 { 1787 UNITY_OUTPUT_CHAR(' '); 1788 } 1789 UnityPrint(msg); 1790 } 1791 1792 UNITY_FAIL_AND_BAIL; 1793 } 1794 1795 /*-----------------------------------------------*/ 1796 void UnityIgnore(const char* msg, const UNITY_LINE_TYPE line) 1797 { 1798 RETURN_IF_FAIL_OR_IGNORE; 1799 1800 UnityTestResultsBegin(Unity.TestFile, line); 1801 UnityPrint(UnityStrIgnore); 1802 if (msg != NULL) 1803 { 1804 UNITY_OUTPUT_CHAR(':'); 1805 UNITY_OUTPUT_CHAR(' '); 1806 UnityPrint(msg); 1807 } 1808 UNITY_IGNORE_AND_BAIL; 1809 } 1810 1811 /*-----------------------------------------------*/ 1812 void UnityMessage(const char* msg, const UNITY_LINE_TYPE line) 1813 { 1814 UnityTestResultsBegin(Unity.TestFile, line); 1815 UnityPrint("INFO"); 1816 if (msg != NULL) 1817 { 1818 UNITY_OUTPUT_CHAR(':'); 1819 UNITY_OUTPUT_CHAR(' '); 1820 UnityPrint(msg); 1821 } 1822 UNITY_PRINT_EOL(); 1823 } 1824 1825 /*-----------------------------------------------*/ 1826 /* If we have not defined our own test runner, then include our default test runner to make life easier */ 1827 #ifndef UNITY_SKIP_DEFAULT_RUNNER 1828 void UnityDefaultTestRun(UnityTestFunction Func, const char* FuncName, const int FuncLineNum) 1829 { 1830 Unity.CurrentTestName = FuncName; 1831 Unity.CurrentTestLineNumber = (UNITY_LINE_TYPE)FuncLineNum; 1832 Unity.NumberOfTests++; 1833 UNITY_CLR_DETAILS(); 1834 UNITY_EXEC_TIME_START(); 1835 if (TEST_PROTECT()) 1836 { 1837 setUp(); 1838 Func(); 1839 } 1840 if (TEST_PROTECT()) 1841 { 1842 tearDown(); 1843 } 1844 UNITY_EXEC_TIME_STOP(); 1845 UnityConcludeTest(); 1846 } 1847 #endif 1848 1849 /*-----------------------------------------------*/ 1850 void UnitySetTestFile(const char* filename) 1851 { 1852 Unity.TestFile = filename; 1853 } 1854 1855 /*-----------------------------------------------*/ 1856 void UnityBegin(const char* filename) 1857 { 1858 Unity.TestFile = filename; 1859 Unity.CurrentTestName = NULL; 1860 Unity.CurrentTestLineNumber = 0; 1861 Unity.NumberOfTests = 0; 1862 Unity.TestFailures = 0; 1863 Unity.TestIgnores = 0; 1864 Unity.CurrentTestFailed = 0; 1865 Unity.CurrentTestIgnored = 0; 1866 1867 UNITY_CLR_DETAILS(); 1868 UNITY_OUTPUT_START(); 1869 } 1870 1871 /*-----------------------------------------------*/ 1872 int UnityEnd(void) 1873 { 1874 UNITY_PRINT_EOL(); 1875 UnityPrint(UnityStrBreaker); 1876 UNITY_PRINT_EOL(); 1877 UnityPrintNumber((UNITY_INT)(Unity.NumberOfTests)); 1878 UnityPrint(UnityStrResultsTests); 1879 UnityPrintNumber((UNITY_INT)(Unity.TestFailures)); 1880 UnityPrint(UnityStrResultsFailures); 1881 UnityPrintNumber((UNITY_INT)(Unity.TestIgnores)); 1882 UnityPrint(UnityStrResultsIgnored); 1883 UNITY_PRINT_EOL(); 1884 if (Unity.TestFailures == 0U) 1885 { 1886 UnityPrint(UnityStrOk); 1887 } 1888 else 1889 { 1890 UnityPrint(UnityStrFail); 1891 #ifdef UNITY_DIFFERENTIATE_FINAL_FAIL 1892 UNITY_OUTPUT_CHAR('E'); UNITY_OUTPUT_CHAR('D'); 1893 #endif 1894 } 1895 UNITY_PRINT_EOL(); 1896 UNITY_FLUSH_CALL(); 1897 UNITY_OUTPUT_COMPLETE(); 1898 return (int)(Unity.TestFailures); 1899 } 1900 1901 /*----------------------------------------------- 1902 * Command Line Argument Support 1903 *-----------------------------------------------*/ 1904 #ifdef UNITY_USE_COMMAND_LINE_ARGS 1905 1906 char* UnityOptionIncludeNamed = NULL; 1907 char* UnityOptionExcludeNamed = NULL; 1908 int UnityVerbosity = 1; 1909 1910 /*-----------------------------------------------*/ 1911 int UnityParseOptions(int argc, char** argv) 1912 { 1913 int i; 1914 UnityOptionIncludeNamed = NULL; 1915 UnityOptionExcludeNamed = NULL; 1916 1917 for (i = 1; i < argc; i++) 1918 { 1919 if (argv[i][0] == '-') 1920 { 1921 switch (argv[i][1]) 1922 { 1923 case 'l': /* list tests */ 1924 return -1; 1925 case 'n': /* include tests with name including this string */ 1926 case 'f': /* an alias for -n */ 1927 if (argv[i][2] == '=') 1928 { 1929 UnityOptionIncludeNamed = &argv[i][3]; 1930 } 1931 else if (++i < argc) 1932 { 1933 UnityOptionIncludeNamed = argv[i]; 1934 } 1935 else 1936 { 1937 UnityPrint("ERROR: No Test String to Include Matches For"); 1938 UNITY_PRINT_EOL(); 1939 return 1; 1940 } 1941 break; 1942 case 'q': /* quiet */ 1943 UnityVerbosity = 0; 1944 break; 1945 case 'v': /* verbose */ 1946 UnityVerbosity = 2; 1947 break; 1948 case 'x': /* exclude tests with name including this string */ 1949 if (argv[i][2] == '=') 1950 { 1951 UnityOptionExcludeNamed = &argv[i][3]; 1952 } 1953 else if (++i < argc) 1954 { 1955 UnityOptionExcludeNamed = argv[i]; 1956 } 1957 else 1958 { 1959 UnityPrint("ERROR: No Test String to Exclude Matches For"); 1960 UNITY_PRINT_EOL(); 1961 return 1; 1962 } 1963 break; 1964 default: 1965 UnityPrint("ERROR: Unknown Option "); 1966 UNITY_OUTPUT_CHAR(argv[i][1]); 1967 UNITY_PRINT_EOL(); 1968 return 1; 1969 } 1970 } 1971 } 1972 1973 return 0; 1974 } 1975 1976 /*-----------------------------------------------*/ 1977 int IsStringInBiggerString(const char* longstring, const char* shortstring) 1978 { 1979 const char* lptr = longstring; 1980 const char* sptr = shortstring; 1981 const char* lnext = lptr; 1982 1983 if (*sptr == '*') 1984 { 1985 return 1; 1986 } 1987 1988 while (*lptr) 1989 { 1990 lnext = lptr + 1; 1991 1992 /* If they current bytes match, go on to the next bytes */ 1993 while (*lptr && *sptr && (*lptr == *sptr)) 1994 { 1995 lptr++; 1996 sptr++; 1997 1998 /* We're done if we match the entire string or up to a wildcard */ 1999 if (*sptr == '*') 2000 return 1; 2001 if (*sptr == ',') 2002 return 1; 2003 if (*sptr == '"') 2004 return 1; 2005 if (*sptr == '\'') 2006 return 1; 2007 if (*sptr == ':') 2008 return 2; 2009 if (*sptr == 0) 2010 return 1; 2011 } 2012 2013 /* Otherwise we start in the long pointer 1 character further and try again */ 2014 lptr = lnext; 2015 sptr = shortstring; 2016 } 2017 2018 return 0; 2019 } 2020 2021 /*-----------------------------------------------*/ 2022 int UnityStringArgumentMatches(const char* str) 2023 { 2024 int retval; 2025 const char* ptr1; 2026 const char* ptr2; 2027 const char* ptrf; 2028 2029 /* Go through the options and get the substrings for matching one at a time */ 2030 ptr1 = str; 2031 while (ptr1[0] != 0) 2032 { 2033 if ((ptr1[0] == '"') || (ptr1[0] == '\'')) 2034 { 2035 ptr1++; 2036 } 2037 2038 /* look for the start of the next partial */ 2039 ptr2 = ptr1; 2040 ptrf = 0; 2041 do 2042 { 2043 ptr2++; 2044 if ((ptr2[0] == ':') && (ptr2[1] != 0) && (ptr2[0] != '\'') && (ptr2[0] != '"') && (ptr2[0] != ',')) 2045 { 2046 ptrf = &ptr2[1]; 2047 } 2048 } while ((ptr2[0] != 0) && (ptr2[0] != '\'') && (ptr2[0] != '"') && (ptr2[0] != ',')); 2049 2050 while ((ptr2[0] != 0) && ((ptr2[0] == ':') || (ptr2[0] == '\'') || (ptr2[0] == '"') || (ptr2[0] == ','))) 2051 { 2052 ptr2++; 2053 } 2054 2055 /* done if complete filename match */ 2056 retval = IsStringInBiggerString(Unity.TestFile, ptr1); 2057 if (retval == 1) 2058 { 2059 return retval; 2060 } 2061 2062 /* done if testname match after filename partial match */ 2063 if ((retval == 2) && (ptrf != 0)) 2064 { 2065 if (IsStringInBiggerString(Unity.CurrentTestName, ptrf)) 2066 { 2067 return 1; 2068 } 2069 } 2070 2071 /* done if complete testname match */ 2072 if (IsStringInBiggerString(Unity.CurrentTestName, ptr1) == 1) 2073 { 2074 return 1; 2075 } 2076 2077 ptr1 = ptr2; 2078 } 2079 2080 /* we couldn't find a match for any substrings */ 2081 return 0; 2082 } 2083 2084 /*-----------------------------------------------*/ 2085 int UnityTestMatches(void) 2086 { 2087 /* Check if this test name matches the included test pattern */ 2088 int retval; 2089 if (UnityOptionIncludeNamed) 2090 { 2091 retval = UnityStringArgumentMatches(UnityOptionIncludeNamed); 2092 } 2093 else 2094 { 2095 retval = 1; 2096 } 2097 2098 /* Check if this test name matches the excluded test pattern */ 2099 if (UnityOptionExcludeNamed) 2100 { 2101 if (UnityStringArgumentMatches(UnityOptionExcludeNamed)) 2102 { 2103 retval = 0; 2104 } 2105 } 2106 2107 return retval; 2108 } 2109 2110 #endif /* UNITY_USE_COMMAND_LINE_ARGS */ 2111 /*-----------------------------------------------*/ 2112 #endif /*LV_BUILD_TEST*/ 2113