Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: FXAS21002 FXOS8700Q
unity.c
00001 /* ========================================================================= 00002 Unity Project - A Test Framework for C 00003 Copyright (c) 2007-14 Mike Karlesky, Mark VanderVoord, Greg Williams 00004 [Released under MIT License. Please refer to license.txt for details] 00005 ============================================================================ */ 00006 00007 #include "unity.h" 00008 #include <stddef.h> 00009 00010 /* If omitted from header, declare overrideable prototypes here so they're ready for use */ 00011 #ifdef UNITY_OMIT_OUTPUT_CHAR_HEADER_DECLARATION 00012 void UNITY_OUTPUT_CHAR(int); 00013 #endif 00014 00015 /* Helpful macros for us to use here */ 00016 #define UNITY_FAIL_AND_BAIL { UNITY_PRINT_EOL(); Unity.CurrentTestFailed = 1; longjmp(Unity.AbortFrame, 1); } 00017 #define UNITY_IGNORE_AND_BAIL { UNITY_PRINT_EOL(); Unity.CurrentTestIgnored = 1; longjmp(Unity.AbortFrame, 1); } 00018 00019 /* return prematurely if we are already in failure or ignore state */ 00020 #define UNITY_SKIP_EXECUTION { if ((Unity.CurrentTestFailed != 0) || (Unity.CurrentTestIgnored != 0)) {return;} } 00021 00022 struct _Unity Unity; 00023 00024 static const char UnityStrOk[] = "OK"; 00025 static const char UnityStrPass[] = "PASS"; 00026 static const char UnityStrFail[] = "FAIL"; 00027 static const char UnityStrIgnore[] = "SKIP"; // Switched "IGNORE" to "SKIP" for direct icetea mapping. 00028 static const char UnityStrNull[] = "NULL"; 00029 static const char UnityStrSpacer[] = ". "; 00030 static const char UnityStrExpected[] = " Expected "; 00031 static const char UnityStrWas[] = " Was "; 00032 static const char UnityStrElement[] = " Element "; 00033 static const char UnityStrByte[] = " Byte "; 00034 static const char UnityStrMemory[] = " Memory Mismatch."; 00035 static const char UnityStrDelta[] = " Values Not Within Delta "; 00036 static const char UnityStrPointless[] = " You Asked Me To Compare Nothing, Which Was Pointless."; 00037 static const char UnityStrNullPointerForExpected[] = " Expected pointer to be NULL"; 00038 static const char UnityStrNullPointerForActual[] = " Actual pointer was NULL"; 00039 static const char UnityStrNot[] = "Not "; 00040 static const char UnityStrInf[] = "Infinity"; 00041 static const char UnityStrNegInf[] = "Negative Infinity"; 00042 static const char UnityStrNaN[] = "NaN"; 00043 static const char UnityStrDet[] = "Determinate"; 00044 static const char UnityStrInvalidFloatTrait[] = "Invalid Float Trait"; 00045 const char UnityStrErrFloat[] = "Unity Floating Point Disabled"; 00046 const char UnityStrErrDouble[] = "Unity Double Precision Disabled"; 00047 const char UnityStrErr64[] = "Unity 64-bit Support Disabled"; 00048 static const char UnityStrBreaker[] = "-----------------------"; 00049 static const char UnityStrResultsTests[] = " Tests "; 00050 static const char UnityStrResultsFailures[] = " Failures "; 00051 static const char UnityStrResultsIgnored[] = " Ignored "; 00052 static const char UnityStrDetail1Name[] = UNITY_DETAIL1_NAME " "; 00053 static const char UnityStrDetail2Name[] = " " UNITY_DETAIL2_NAME " "; 00054 00055 #ifdef UNITY_FLOAT_NEEDS_ZERO 00056 /* Dividing by these constants produces +/- infinity. 00057 * The rationale is given in UnityAssertFloatIsInf's body. */ 00058 static const _UF f_zero = 0.0f; 00059 #endif 00060 00061 /* compiler-generic print formatting masks */ 00062 static const _U_UINT UnitySizeMask[] = 00063 { 00064 255u, /* 0xFF */ 00065 65535u, /* 0xFFFF */ 00066 65535u, 00067 4294967295u, /* 0xFFFFFFFF */ 00068 4294967295u, 00069 4294967295u, 00070 4294967295u 00071 #ifdef UNITY_SUPPORT_64 00072 ,0xFFFFFFFFFFFFFFFF 00073 #endif 00074 }; 00075 00076 /*----------------------------------------------- 00077 * Pretty Printers & Test Result Output Handlers 00078 *-----------------------------------------------*/ 00079 00080 void UnityPrint(const char* string) 00081 { 00082 const char* pch = string; 00083 00084 if (pch != NULL) 00085 { 00086 while (*pch) 00087 { 00088 /* printable characters plus CR & LF are printed */ 00089 if ((*pch <= 126) && (*pch >= 32)) 00090 { 00091 UNITY_OUTPUT_CHAR(*pch); 00092 } 00093 /* write escaped carriage returns */ 00094 else if (*pch == 13) 00095 { 00096 UNITY_OUTPUT_CHAR('\\'); 00097 UNITY_OUTPUT_CHAR('r'); 00098 } 00099 /* write escaped line feeds */ 00100 else if (*pch == 10) 00101 { 00102 UNITY_OUTPUT_CHAR('\\'); 00103 UNITY_OUTPUT_CHAR('n'); 00104 } 00105 /* unprintable characters are shown as codes */ 00106 else 00107 { 00108 UNITY_OUTPUT_CHAR('\\'); 00109 UnityPrintNumberHex((_U_UINT)*pch, 2); 00110 } 00111 pch++; 00112 } 00113 } 00114 } 00115 00116 void UnityPrintLen(const char* string, const _UU32 length); 00117 void UnityPrintLen(const char* string, const _UU32 length) 00118 { 00119 const char* pch = string; 00120 00121 if (pch != NULL) 00122 { 00123 while (*pch && (_UU32)(pch - string) < length) 00124 { 00125 /* printable characters plus CR & LF are printed */ 00126 if ((*pch <= 126) && (*pch >= 32)) 00127 { 00128 UNITY_OUTPUT_CHAR(*pch); 00129 } 00130 /* write escaped carriage returns */ 00131 else if (*pch == 13) 00132 { 00133 UNITY_OUTPUT_CHAR('\\'); 00134 UNITY_OUTPUT_CHAR('r'); 00135 } 00136 /* write escaped line feeds */ 00137 else if (*pch == 10) 00138 { 00139 UNITY_OUTPUT_CHAR('\\'); 00140 UNITY_OUTPUT_CHAR('n'); 00141 } 00142 /* unprintable characters are shown as codes */ 00143 else 00144 { 00145 UNITY_OUTPUT_CHAR('\\'); 00146 UnityPrintNumberHex((_U_UINT)*pch, 2); 00147 } 00148 pch++; 00149 } 00150 } 00151 } 00152 00153 /*-----------------------------------------------*/ 00154 void UnityPrintNumberByStyle(const _U_SINT number, const UNITY_DISPLAY_STYLE_T style) 00155 { 00156 if ((style & UNITY_DISPLAY_RANGE_INT) == UNITY_DISPLAY_RANGE_INT) 00157 { 00158 UnityPrintNumber(number); 00159 } 00160 else if ((style & UNITY_DISPLAY_RANGE_UINT) == UNITY_DISPLAY_RANGE_UINT) 00161 { 00162 UnityPrintNumberUnsigned( (_U_UINT)number & UnitySizeMask[((_U_UINT)style & (_U_UINT)0x0F) - 1] ); 00163 } 00164 else 00165 { 00166 UnityPrintNumberHex((_U_UINT)number, (char)((style & 0x000F) << 1)); 00167 } 00168 } 00169 00170 /*-----------------------------------------------*/ 00171 void UnityPrintNumber(const _U_SINT number_to_print) 00172 { 00173 _U_UINT number = (_U_UINT)number_to_print; 00174 00175 if (number_to_print < 0) 00176 { 00177 /* A negative number, including MIN negative */ 00178 UNITY_OUTPUT_CHAR('-'); 00179 number = (_U_UINT)(-number_to_print); 00180 } 00181 UnityPrintNumberUnsigned(number); 00182 } 00183 00184 /*----------------------------------------------- 00185 * basically do an itoa using as little ram as possible */ 00186 void UnityPrintNumberUnsigned(const _U_UINT number) 00187 { 00188 _U_UINT divisor = 1; 00189 00190 /* figure out initial divisor */ 00191 while (number / divisor > 9) 00192 { 00193 divisor *= 10; 00194 } 00195 00196 /* now mod and print, then divide divisor */ 00197 do 00198 { 00199 UNITY_OUTPUT_CHAR((char)('0' + (number / divisor % 10))); 00200 divisor /= 10; 00201 } 00202 while (divisor > 0); 00203 } 00204 00205 /*-----------------------------------------------*/ 00206 void UnityPrintNumberHex(const _U_UINT number, const char nibbles_to_print) 00207 { 00208 _U_UINT nibble; 00209 char nibbles = nibbles_to_print; 00210 UNITY_OUTPUT_CHAR('0'); 00211 UNITY_OUTPUT_CHAR('x'); 00212 00213 while (nibbles > 0) 00214 { 00215 nibble = (number >> (--nibbles << 2)) & 0x0000000F; 00216 if (nibble <= 9) 00217 { 00218 UNITY_OUTPUT_CHAR((char)('0' + nibble)); 00219 } 00220 else 00221 { 00222 UNITY_OUTPUT_CHAR((char)('A' - 10 + nibble)); 00223 } 00224 } 00225 } 00226 00227 /*-----------------------------------------------*/ 00228 void UnityPrintMask(const _U_UINT mask, const _U_UINT number) 00229 { 00230 _U_UINT current_bit = (_U_UINT)1 << (UNITY_INT_WIDTH - 1); 00231 _US32 i; 00232 00233 for (i = 0; i < UNITY_INT_WIDTH; i++) 00234 { 00235 if (current_bit & mask) 00236 { 00237 if (current_bit & number) 00238 { 00239 UNITY_OUTPUT_CHAR('1'); 00240 } 00241 else 00242 { 00243 UNITY_OUTPUT_CHAR('0'); 00244 } 00245 } 00246 else 00247 { 00248 UNITY_OUTPUT_CHAR('X'); 00249 } 00250 current_bit = current_bit >> 1; 00251 } 00252 } 00253 00254 /*-----------------------------------------------*/ 00255 #ifdef UNITY_FLOAT_VERBOSE 00256 #include <stdio.h> 00257 00258 #ifndef UNITY_VERBOSE_NUMBER_MAX_LENGTH 00259 # ifdef UNITY_DOUBLE_VERBOSE 00260 # define UNITY_VERBOSE_NUMBER_MAX_LENGTH 317 00261 # else 00262 # define UNITY_VERBOSE_NUMBER_MAX_LENGTH 47 00263 # endif 00264 #endif 00265 00266 void UnityPrintFloat(_UF number) 00267 { 00268 char TempBuffer[UNITY_VERBOSE_NUMBER_MAX_LENGTH + 1]; 00269 snprintf(TempBuffer, sizeof(TempBuffer), "%.6f", number); 00270 UnityPrint(TempBuffer); 00271 } 00272 #endif 00273 00274 /*-----------------------------------------------*/ 00275 00276 void UnityPrintFail(void); 00277 void UnityPrintFail(void) 00278 { 00279 UnityPrint(UnityStrFail); 00280 } 00281 00282 void UnityPrintOk(void); 00283 void UnityPrintOk(void) 00284 { 00285 UnityPrint(UnityStrOk); 00286 } 00287 00288 /*-----------------------------------------------*/ 00289 static void UnityTestResultsBegin(const char* file, const UNITY_LINE_TYPE line); 00290 static void UnityTestResultsBegin(const char* file, const UNITY_LINE_TYPE line) 00291 { 00292 #ifndef UNITY_FIXTURES 00293 UnityPrint(file); 00294 UNITY_OUTPUT_CHAR(':'); 00295 UnityPrintNumber((_U_SINT)line); 00296 UNITY_OUTPUT_CHAR(':'); 00297 UnityPrint(Unity.CurrentTestName); 00298 UNITY_OUTPUT_CHAR(':'); 00299 #else 00300 UNITY_UNUSED(file); 00301 UNITY_UNUSED(line); 00302 #endif 00303 } 00304 00305 /* SA_PATCH: Make failures more noticable. */ 00306 static void UnityPrintVisibleFailure(void); 00307 static void UnityPrintVisibleFailure(void) 00308 { 00309 UnityPrint(UNITY_RESULTS_TAGS_RESULT_START); 00310 UnityPrint(UnityStrFail); 00311 UnityPrint(UNITY_RESULTS_TAGS_RESULT_END); 00312 } 00313 /*-----------------------------------------------*/ 00314 static void UnityTestResultsFailBegin(const UNITY_LINE_TYPE line); 00315 static void UnityTestResultsFailBegin(const UNITY_LINE_TYPE line) 00316 { 00317 #ifndef UNITY_FIXTURES 00318 UnityTestResultsBegin(Unity.TestFile, line); 00319 #else 00320 UNITY_UNUSED(line); 00321 #endif 00322 /* SA_PATCH: Make failures more noticable. */ 00323 UnityPrintVisibleFailure(); 00324 //UnityPrint(UnityStrFail); 00325 UNITY_OUTPUT_CHAR(':'); 00326 } 00327 00328 /*-----------------------------------------------*/ 00329 void UnityConcludeTest(void) 00330 { 00331 if (Unity.CurrentTestIgnored) 00332 { 00333 Unity.TestIgnores++; 00334 } 00335 else if (!Unity.CurrentTestFailed) 00336 { 00337 UnityTestResultsBegin(Unity.TestFile, Unity.CurrentTestLineNumber); 00338 UnityPrint(UnityStrPass); 00339 } 00340 else 00341 { 00342 Unity.TestFailures++; 00343 } 00344 00345 Unity.CurrentTestFailed = 0; 00346 Unity.CurrentTestIgnored = 0; 00347 UNITY_PRINT_EOL(); 00348 UNITY_FLUSH_CALL(); 00349 } 00350 00351 /*-----------------------------------------------*/ 00352 static void UnityAddMsgIfSpecified(const char* msg); 00353 static void UnityAddMsgIfSpecified(const char* msg) 00354 { 00355 if (msg) 00356 { 00357 UnityPrint(UnityStrSpacer); 00358 #ifndef UNITY_EXCLUDE_DETAILS 00359 if (Unity.CurrentDetail1) 00360 { 00361 UnityPrint(UnityStrDetail1Name); 00362 UnityPrint(Unity.CurrentDetail1); 00363 if (Unity.CurrentDetail2) 00364 { 00365 UnityPrint(UnityStrDetail2Name); 00366 UnityPrint(Unity.CurrentDetail2); 00367 } 00368 UnityPrint(UnityStrSpacer); 00369 } 00370 #endif 00371 UnityPrint(msg); 00372 } 00373 } 00374 00375 /*-----------------------------------------------*/ 00376 static void UnityPrintExpectedAndActualStrings(const char* expected, const char* actual); 00377 static void UnityPrintExpectedAndActualStrings(const char* expected, const char* actual) 00378 { 00379 UnityPrint(UnityStrExpected); 00380 if (expected != NULL) 00381 { 00382 UNITY_OUTPUT_CHAR('\''); 00383 UnityPrint(expected); 00384 UNITY_OUTPUT_CHAR('\''); 00385 } 00386 else 00387 { 00388 UnityPrint(UnityStrNull); 00389 } 00390 UnityPrint(UnityStrWas); 00391 if (actual != NULL) 00392 { 00393 UNITY_OUTPUT_CHAR('\''); 00394 UnityPrint(actual); 00395 UNITY_OUTPUT_CHAR('\''); 00396 } 00397 else 00398 { 00399 UnityPrint(UnityStrNull); 00400 } 00401 } 00402 00403 /*-----------------------------------------------*/ 00404 static void UnityPrintExpectedAndActualStringsLen(const char* expected, const char* actual, const _UU32 length) 00405 { 00406 UnityPrint(UnityStrExpected); 00407 if (expected != NULL) 00408 { 00409 UNITY_OUTPUT_CHAR('\''); 00410 UnityPrintLen(expected, length); 00411 UNITY_OUTPUT_CHAR('\''); 00412 } 00413 else 00414 { 00415 UnityPrint(UnityStrNull); 00416 } 00417 UnityPrint(UnityStrWas); 00418 if (actual != NULL) 00419 { 00420 UNITY_OUTPUT_CHAR('\''); 00421 UnityPrintLen(actual, length); 00422 UNITY_OUTPUT_CHAR('\''); 00423 } 00424 else 00425 { 00426 UnityPrint(UnityStrNull); 00427 } 00428 } 00429 00430 00431 00432 /*----------------------------------------------- 00433 * Assertion & Control Helpers 00434 *-----------------------------------------------*/ 00435 00436 static int UnityCheckArraysForNull(UNITY_INTERNAL_PTR expected, UNITY_INTERNAL_PTR actual, const UNITY_LINE_TYPE lineNumber, const char* msg) 00437 { 00438 /* return true if they are both NULL */ 00439 if ((expected == NULL) && (actual == NULL)) 00440 return 1; 00441 00442 /* throw error if just expected is NULL */ 00443 if (expected == NULL) 00444 { 00445 UnityTestResultsFailBegin(lineNumber); 00446 UnityPrint(UnityStrNullPointerForExpected); 00447 UnityAddMsgIfSpecified(msg); 00448 UNITY_FAIL_AND_BAIL; 00449 } 00450 00451 /* throw error if just actual is NULL */ 00452 if (actual == NULL) 00453 { 00454 UnityTestResultsFailBegin(lineNumber); 00455 UnityPrint(UnityStrNullPointerForActual); 00456 UnityAddMsgIfSpecified(msg); 00457 UNITY_FAIL_AND_BAIL; 00458 } 00459 00460 /* return false if neither is NULL */ 00461 return 0; 00462 } 00463 00464 /*----------------------------------------------- 00465 * Assertion Functions 00466 *-----------------------------------------------*/ 00467 00468 void UnityAssertBits(const _U_SINT mask, 00469 const _U_SINT expected, 00470 const _U_SINT actual, 00471 const char* msg, 00472 const UNITY_LINE_TYPE lineNumber) 00473 { 00474 UNITY_SKIP_EXECUTION; 00475 00476 if ((mask & expected) != (mask & actual)) 00477 { 00478 UnityTestResultsFailBegin(lineNumber); 00479 UnityPrint(UnityStrExpected); 00480 UnityPrintMask((_U_UINT)mask, (_U_UINT)expected); 00481 UnityPrint(UnityStrWas); 00482 UnityPrintMask((_U_UINT)mask, (_U_UINT)actual); 00483 UnityAddMsgIfSpecified(msg); 00484 UNITY_FAIL_AND_BAIL; 00485 } 00486 } 00487 00488 /*-----------------------------------------------*/ 00489 void UnityAssertEqualNumber(const _U_SINT expected, 00490 const _U_SINT actual, 00491 const char* msg, 00492 const UNITY_LINE_TYPE lineNumber, 00493 const UNITY_DISPLAY_STYLE_T style) 00494 { 00495 UNITY_SKIP_EXECUTION; 00496 00497 if (expected != actual) 00498 { 00499 UnityTestResultsFailBegin(lineNumber); 00500 UnityPrint(UnityStrExpected); 00501 UnityPrintNumberByStyle(expected, style); 00502 UnityPrint(UnityStrWas); 00503 UnityPrintNumberByStyle(actual, style); 00504 UnityAddMsgIfSpecified(msg); 00505 UNITY_FAIL_AND_BAIL; 00506 } 00507 } 00508 00509 #define UnityPrintPointlessAndBail() \ 00510 { \ 00511 UnityTestResultsFailBegin(lineNumber); \ 00512 UnityPrint(UnityStrPointless); \ 00513 UnityAddMsgIfSpecified(msg); \ 00514 UNITY_FAIL_AND_BAIL; } 00515 00516 /*-----------------------------------------------*/ 00517 void UnityAssertEqualIntArray(UNITY_INTERNAL_PTR expected, 00518 UNITY_INTERNAL_PTR actual, 00519 const _UU32 num_elements, 00520 const char* msg, 00521 const UNITY_LINE_TYPE lineNumber, 00522 const UNITY_DISPLAY_STYLE_T style) 00523 { 00524 _UU32 elements = num_elements; 00525 UNITY_INTERNAL_PTR ptr_exp = (UNITY_INTERNAL_PTR)expected; 00526 UNITY_INTERNAL_PTR ptr_act = (UNITY_INTERNAL_PTR)actual; 00527 00528 UNITY_SKIP_EXECUTION; 00529 00530 if (elements == 0) 00531 { 00532 UnityPrintPointlessAndBail(); 00533 } 00534 00535 if (UnityCheckArraysForNull((UNITY_INTERNAL_PTR)expected, (UNITY_INTERNAL_PTR)actual, lineNumber, msg) == 1) 00536 return; 00537 00538 /* If style is UNITY_DISPLAY_STYLE_INT, we'll fall into the default case rather than the INT16 or INT32 (etc) case 00539 * as UNITY_DISPLAY_STYLE_INT includes a flag for UNITY_DISPLAY_RANGE_AUTO, which the width-specific 00540 * variants do not. Therefore remove this flag. */ 00541 switch(style & (UNITY_DISPLAY_STYLE_T)(~UNITY_DISPLAY_RANGE_AUTO)) 00542 { 00543 case UNITY_DISPLAY_STYLE_HEX8: 00544 case UNITY_DISPLAY_STYLE_INT8: 00545 case UNITY_DISPLAY_STYLE_UINT8: 00546 while (elements--) 00547 { 00548 if (*(UNITY_PTR_ATTRIBUTE const _US8*)ptr_exp != *(UNITY_PTR_ATTRIBUTE const _US8*)ptr_act) 00549 { 00550 UnityTestResultsFailBegin(lineNumber); 00551 UnityPrint(UnityStrElement); 00552 UnityPrintNumberUnsigned(num_elements - elements - 1); 00553 UnityPrint(UnityStrExpected); 00554 UnityPrintNumberByStyle(*(UNITY_PTR_ATTRIBUTE const _US8*)ptr_exp, style); 00555 UnityPrint(UnityStrWas); 00556 UnityPrintNumberByStyle(*(UNITY_PTR_ATTRIBUTE const _US8*)ptr_act, style); 00557 UnityAddMsgIfSpecified(msg); 00558 UNITY_FAIL_AND_BAIL; 00559 } 00560 ptr_exp = (UNITY_INTERNAL_PTR)((_UP)ptr_exp + 1); 00561 ptr_act = (UNITY_INTERNAL_PTR)((_UP)ptr_act + 1); 00562 } 00563 break; 00564 case UNITY_DISPLAY_STYLE_HEX16: 00565 case UNITY_DISPLAY_STYLE_INT16: 00566 case UNITY_DISPLAY_STYLE_UINT16: 00567 while (elements--) 00568 { 00569 if (*(UNITY_PTR_ATTRIBUTE const _US16*)ptr_exp != *(UNITY_PTR_ATTRIBUTE const _US16*)ptr_act) 00570 { 00571 UnityTestResultsFailBegin(lineNumber); 00572 UnityPrint(UnityStrElement); 00573 UnityPrintNumberUnsigned(num_elements - elements - 1); 00574 UnityPrint(UnityStrExpected); 00575 UnityPrintNumberByStyle(*(UNITY_PTR_ATTRIBUTE const _US16*)ptr_exp, style); 00576 UnityPrint(UnityStrWas); 00577 UnityPrintNumberByStyle(*(UNITY_PTR_ATTRIBUTE const _US16*)ptr_act, style); 00578 UnityAddMsgIfSpecified(msg); 00579 UNITY_FAIL_AND_BAIL; 00580 } 00581 ptr_exp = (UNITY_INTERNAL_PTR)((_UP)ptr_exp + 2); 00582 ptr_act = (UNITY_INTERNAL_PTR)((_UP)ptr_act + 2); 00583 } 00584 break; 00585 #ifdef UNITY_SUPPORT_64 00586 case UNITY_DISPLAY_STYLE_HEX64: 00587 case UNITY_DISPLAY_STYLE_INT64: 00588 case UNITY_DISPLAY_STYLE_UINT64: 00589 while (elements--) 00590 { 00591 if (*(UNITY_PTR_ATTRIBUTE const _US64*)ptr_exp != *(UNITY_PTR_ATTRIBUTE const _US64*)ptr_act) 00592 { 00593 UnityTestResultsFailBegin(lineNumber); 00594 UnityPrint(UnityStrElement); 00595 UnityPrintNumberUnsigned(num_elements - elements - 1); 00596 UnityPrint(UnityStrExpected); 00597 UnityPrintNumberByStyle(*(UNITY_PTR_ATTRIBUTE const _US64*)ptr_exp, style); 00598 UnityPrint(UnityStrWas); 00599 UnityPrintNumberByStyle(*(UNITY_PTR_ATTRIBUTE const _US64*)ptr_act, style); 00600 UnityAddMsgIfSpecified(msg); 00601 UNITY_FAIL_AND_BAIL; 00602 } 00603 ptr_exp = (UNITY_INTERNAL_PTR)((_UP)ptr_exp + 8); 00604 ptr_act = (UNITY_INTERNAL_PTR)((_UP)ptr_act + 8); 00605 } 00606 break; 00607 #endif 00608 default: 00609 while (elements--) 00610 { 00611 if (*(UNITY_PTR_ATTRIBUTE const _US32*)ptr_exp != *(UNITY_PTR_ATTRIBUTE const _US32*)ptr_act) 00612 { 00613 UnityTestResultsFailBegin(lineNumber); 00614 UnityPrint(UnityStrElement); 00615 UnityPrintNumberUnsigned(num_elements - elements - 1); 00616 UnityPrint(UnityStrExpected); 00617 UnityPrintNumberByStyle(*(UNITY_PTR_ATTRIBUTE const _US32*)ptr_exp, style); 00618 UnityPrint(UnityStrWas); 00619 UnityPrintNumberByStyle(*(UNITY_PTR_ATTRIBUTE const _US32*)ptr_act, style); 00620 UnityAddMsgIfSpecified(msg); 00621 UNITY_FAIL_AND_BAIL; 00622 } 00623 ptr_exp = (UNITY_INTERNAL_PTR)((_UP)ptr_exp + 4); 00624 ptr_act = (UNITY_INTERNAL_PTR)((_UP)ptr_act + 4); 00625 } 00626 break; 00627 } 00628 } 00629 00630 /*-----------------------------------------------*/ 00631 #ifndef UNITY_EXCLUDE_FLOAT 00632 void UnityAssertEqualFloatArray(UNITY_PTR_ATTRIBUTE const _UF* expected, 00633 UNITY_PTR_ATTRIBUTE const _UF* actual, 00634 const _UU32 num_elements, 00635 const char* msg, 00636 const UNITY_LINE_TYPE lineNumber) 00637 { 00638 _UU32 elements = num_elements; 00639 UNITY_PTR_ATTRIBUTE const _UF* ptr_expected = expected; 00640 UNITY_PTR_ATTRIBUTE const _UF* ptr_actual = actual; 00641 _UF diff, tol; 00642 00643 UNITY_SKIP_EXECUTION; 00644 00645 if (elements == 0) 00646 { 00647 UnityPrintPointlessAndBail(); 00648 } 00649 00650 if (UnityCheckArraysForNull((UNITY_INTERNAL_PTR)expected, (UNITY_INTERNAL_PTR)actual, lineNumber, msg) == 1) 00651 return; 00652 00653 while (elements--) 00654 { 00655 diff = *ptr_expected - *ptr_actual; 00656 if (diff < 0.0f) 00657 diff = 0.0f - diff; 00658 tol = UNITY_FLOAT_PRECISION * *ptr_expected; 00659 if (tol < 0.0f) 00660 tol = 0.0f - tol; 00661 00662 /* This first part of this condition will catch any NaN or Infinite values */ 00663 if (isnan(diff) || isinf(diff) || (diff > tol)) 00664 { 00665 UnityTestResultsFailBegin(lineNumber); 00666 UnityPrint(UnityStrElement); 00667 UnityPrintNumberUnsigned(num_elements - elements - 1); 00668 #ifdef UNITY_FLOAT_VERBOSE 00669 UnityPrint(UnityStrExpected); 00670 UnityPrintFloat(*ptr_expected); 00671 UnityPrint(UnityStrWas); 00672 UnityPrintFloat(*ptr_actual); 00673 #else 00674 UnityPrint(UnityStrDelta); 00675 #endif 00676 UnityAddMsgIfSpecified(msg); 00677 UNITY_FAIL_AND_BAIL; 00678 } 00679 ptr_expected++; 00680 ptr_actual++; 00681 } 00682 } 00683 00684 /*-----------------------------------------------*/ 00685 void UnityAssertFloatsWithin(const _UF delta, 00686 const _UF expected, 00687 const _UF actual, 00688 const char* msg, 00689 const UNITY_LINE_TYPE lineNumber) 00690 { 00691 _UF diff = actual - expected; 00692 _UF pos_delta = delta; 00693 00694 UNITY_SKIP_EXECUTION; 00695 00696 if (diff < 0.0f) 00697 { 00698 diff = 0.0f - diff; 00699 } 00700 if (pos_delta < 0.0f) 00701 { 00702 pos_delta = 0.0f - pos_delta; 00703 } 00704 00705 /* This first part of this condition will catch any NaN or Infinite values */ 00706 if (isnan(diff) || isinf(diff) || (pos_delta < diff)) 00707 { 00708 UnityTestResultsFailBegin(lineNumber); 00709 #ifdef UNITY_FLOAT_VERBOSE 00710 UnityPrint(UnityStrExpected); 00711 UnityPrintFloat(expected); 00712 UnityPrint(UnityStrWas); 00713 UnityPrintFloat(actual); 00714 #else 00715 UnityPrint(UnityStrDelta); 00716 #endif 00717 UnityAddMsgIfSpecified(msg); 00718 UNITY_FAIL_AND_BAIL; 00719 } 00720 } 00721 00722 /*-----------------------------------------------*/ 00723 void UnityAssertFloatSpecial(const _UF actual, 00724 const char* msg, 00725 const UNITY_LINE_TYPE lineNumber, 00726 const UNITY_FLOAT_TRAIT_T style) 00727 { 00728 const char* trait_names[] = { UnityStrInf, UnityStrNegInf, UnityStrNaN, UnityStrDet }; 00729 _U_SINT should_be_trait = ((_U_SINT)style & 1); 00730 _U_SINT is_trait = !should_be_trait; 00731 _U_SINT trait_index = (_U_SINT)(style >> 1); 00732 00733 UNITY_SKIP_EXECUTION; 00734 00735 switch(style) 00736 { 00737 /* To determine Inf / Neg Inf, we compare to an Inf / Neg Inf value we create on the fly 00738 * We are using a variable to hold the zero value because some compilers complain about dividing by zero otherwise */ 00739 case UNITY_FLOAT_IS_INF: 00740 case UNITY_FLOAT_IS_NOT_INF: 00741 is_trait = isinf(actual) & ispos(actual); 00742 break; 00743 case UNITY_FLOAT_IS_NEG_INF: 00744 case UNITY_FLOAT_IS_NOT_NEG_INF: 00745 is_trait = isinf(actual) & isneg(actual); 00746 break; 00747 00748 /* NaN is the only floating point value that does NOT equal itself. Therefore if Actual == Actual, then it is NOT NaN. */ 00749 case UNITY_FLOAT_IS_NAN: 00750 case UNITY_FLOAT_IS_NOT_NAN: 00751 is_trait = isnan(actual); 00752 break; 00753 00754 /* A determinate number is non infinite and not NaN. (therefore the opposite of the two above) */ 00755 case UNITY_FLOAT_IS_DET: 00756 case UNITY_FLOAT_IS_NOT_DET: 00757 if (isinf(actual) | isnan(actual)) 00758 is_trait = 0; 00759 else 00760 is_trait = 1; 00761 break; 00762 00763 default: 00764 trait_index = 0; 00765 trait_names[0] = UnityStrInvalidFloatTrait; 00766 break; 00767 } 00768 00769 if (is_trait != should_be_trait) 00770 { 00771 UnityTestResultsFailBegin(lineNumber); 00772 UnityPrint(UnityStrExpected); 00773 if (!should_be_trait) 00774 UnityPrint(UnityStrNot); 00775 UnityPrint(trait_names[trait_index]); 00776 UnityPrint(UnityStrWas); 00777 #ifdef UNITY_FLOAT_VERBOSE 00778 UnityPrintFloat(actual); 00779 #else 00780 if (should_be_trait) 00781 UnityPrint(UnityStrNot); 00782 UnityPrint(trait_names[trait_index]); 00783 #endif 00784 UnityAddMsgIfSpecified(msg); 00785 UNITY_FAIL_AND_BAIL; 00786 } 00787 } 00788 00789 #endif /* not UNITY_EXCLUDE_FLOAT */ 00790 00791 /*-----------------------------------------------*/ 00792 #ifndef UNITY_EXCLUDE_DOUBLE 00793 void UnityAssertEqualDoubleArray(UNITY_PTR_ATTRIBUTE const _UD* expected, 00794 UNITY_PTR_ATTRIBUTE const _UD* actual, 00795 const _UU32 num_elements, 00796 const char* msg, 00797 const UNITY_LINE_TYPE lineNumber) 00798 { 00799 _UU32 elements = num_elements; 00800 UNITY_PTR_ATTRIBUTE const _UD* ptr_expected = expected; 00801 UNITY_PTR_ATTRIBUTE const _UD* ptr_actual = actual; 00802 _UD diff, tol; 00803 00804 UNITY_SKIP_EXECUTION; 00805 00806 if (elements == 0) 00807 { 00808 UnityPrintPointlessAndBail(); 00809 } 00810 00811 if (UnityCheckArraysForNull((UNITY_INTERNAL_PTR)expected, (UNITY_INTERNAL_PTR)actual, lineNumber, msg) == 1) 00812 return; 00813 00814 while (elements--) 00815 { 00816 diff = *ptr_expected - *ptr_actual; 00817 if (diff < 0.0) 00818 diff = 0.0 - diff; 00819 tol = UNITY_DOUBLE_PRECISION * *ptr_expected; 00820 if (tol < 0.0) 00821 tol = 0.0 - tol; 00822 00823 /* This first part of this condition will catch any NaN or Infinite values */ 00824 if (isnan(diff) || isinf(diff) || (diff > tol)) 00825 { 00826 UnityTestResultsFailBegin(lineNumber); 00827 UnityPrint(UnityStrElement); 00828 UnityPrintNumberUnsigned(num_elements - elements - 1); 00829 #ifdef UNITY_DOUBLE_VERBOSE 00830 UnityPrint(UnityStrExpected); 00831 UnityPrintFloat((float)(*ptr_expected)); 00832 UnityPrint(UnityStrWas); 00833 UnityPrintFloat((float)(*ptr_actual)); 00834 #else 00835 UnityPrint(UnityStrDelta); 00836 #endif 00837 UnityAddMsgIfSpecified(msg); 00838 UNITY_FAIL_AND_BAIL; 00839 } 00840 ptr_expected++; 00841 ptr_actual++; 00842 } 00843 } 00844 00845 /*-----------------------------------------------*/ 00846 void UnityAssertDoublesWithin(const _UD delta, 00847 const _UD expected, 00848 const _UD actual, 00849 const char* msg, 00850 const UNITY_LINE_TYPE lineNumber) 00851 { 00852 _UD diff = actual - expected; 00853 _UD pos_delta = delta; 00854 00855 UNITY_SKIP_EXECUTION; 00856 00857 if (diff < 0.0) 00858 { 00859 diff = 0.0 - diff; 00860 } 00861 if (pos_delta < 0.0) 00862 { 00863 pos_delta = 0.0 - pos_delta; 00864 } 00865 00866 /* This first part of this condition will catch any NaN or Infinite values */ 00867 if (isnan(diff) || isinf(diff) || (pos_delta < diff)) 00868 { 00869 UnityTestResultsFailBegin(lineNumber); 00870 #ifdef UNITY_DOUBLE_VERBOSE 00871 UnityPrint(UnityStrExpected); 00872 UnityPrintFloat((float)expected); 00873 UnityPrint(UnityStrWas); 00874 UnityPrintFloat((float)actual); 00875 #else 00876 UnityPrint(UnityStrDelta); 00877 #endif 00878 UnityAddMsgIfSpecified(msg); 00879 UNITY_FAIL_AND_BAIL; 00880 } 00881 } 00882 00883 /*-----------------------------------------------*/ 00884 00885 void UnityAssertDoubleSpecial(const _UD actual, 00886 const char* msg, 00887 const UNITY_LINE_TYPE lineNumber, 00888 const UNITY_FLOAT_TRAIT_T style) 00889 { 00890 const char* trait_names[] = { UnityStrInf, UnityStrNegInf, UnityStrNaN, UnityStrDet }; 00891 _U_SINT should_be_trait = ((_U_SINT)style & 1); 00892 _U_SINT is_trait = !should_be_trait; 00893 _U_SINT trait_index = (_U_SINT)(style >> 1); 00894 00895 UNITY_SKIP_EXECUTION; 00896 00897 switch(style) 00898 { 00899 /* To determine Inf / Neg Inf, we compare to an Inf / Neg Inf value we create on the fly 00900 * We are using a variable to hold the zero value because some compilers complain about dividing by zero otherwise */ 00901 case UNITY_FLOAT_IS_INF: 00902 case UNITY_FLOAT_IS_NOT_INF: 00903 is_trait = isinf(actual) & ispos(actual); 00904 break; 00905 case UNITY_FLOAT_IS_NEG_INF: 00906 case UNITY_FLOAT_IS_NOT_NEG_INF: 00907 is_trait = isinf(actual) & isneg(actual); 00908 break; 00909 00910 /* NaN is the only floating point value that does NOT equal itself. Therefore if Actual == Actual, then it is NOT NaN. */ 00911 case UNITY_FLOAT_IS_NAN: 00912 case UNITY_FLOAT_IS_NOT_NAN: 00913 is_trait = isnan(actual); 00914 break; 00915 00916 /* A determinate number is non infinite and not NaN. (therefore the opposite of the two above) */ 00917 case UNITY_FLOAT_IS_DET: 00918 case UNITY_FLOAT_IS_NOT_DET: 00919 if (isinf(actual) | isnan(actual)) 00920 is_trait = 0; 00921 else 00922 is_trait = 1; 00923 break; 00924 00925 default: 00926 trait_index = 0; 00927 trait_names[0] = UnityStrInvalidFloatTrait; 00928 break; 00929 } 00930 00931 if (is_trait != should_be_trait) 00932 { 00933 UnityTestResultsFailBegin(lineNumber); 00934 UnityPrint(UnityStrExpected); 00935 if (!should_be_trait) 00936 UnityPrint(UnityStrNot); 00937 UnityPrint(trait_names[trait_index]); 00938 UnityPrint(UnityStrWas); 00939 #ifdef UNITY_DOUBLE_VERBOSE 00940 UnityPrintFloat(actual); 00941 #else 00942 if (should_be_trait) 00943 UnityPrint(UnityStrNot); 00944 UnityPrint(trait_names[trait_index]); 00945 #endif 00946 UnityAddMsgIfSpecified(msg); 00947 UNITY_FAIL_AND_BAIL; 00948 } 00949 } 00950 00951 00952 #endif /* not UNITY_EXCLUDE_DOUBLE */ 00953 00954 /*-----------------------------------------------*/ 00955 void UnityAssertNumbersWithin( const _U_UINT delta, 00956 const _U_SINT expected, 00957 const _U_SINT actual, 00958 const char* msg, 00959 const UNITY_LINE_TYPE lineNumber, 00960 const UNITY_DISPLAY_STYLE_T style) 00961 { 00962 UNITY_SKIP_EXECUTION; 00963 00964 if ((style & UNITY_DISPLAY_RANGE_INT) == UNITY_DISPLAY_RANGE_INT) 00965 { 00966 if (actual > expected) 00967 Unity.CurrentTestFailed = ((_U_UINT)(actual - expected) > delta); 00968 else 00969 Unity.CurrentTestFailed = ((_U_UINT)(expected - actual) > delta); 00970 } 00971 else 00972 { 00973 if ((_U_UINT)actual > (_U_UINT)expected) 00974 Unity.CurrentTestFailed = ((_U_UINT)(actual - expected) > delta); 00975 else 00976 Unity.CurrentTestFailed = ((_U_UINT)(expected - actual) > delta); 00977 } 00978 00979 if (Unity.CurrentTestFailed) 00980 { 00981 UnityTestResultsFailBegin(lineNumber); 00982 UnityPrint(UnityStrDelta); 00983 UnityPrintNumberByStyle((_U_SINT)delta, style); 00984 UnityPrint(UnityStrExpected); 00985 UnityPrintNumberByStyle(expected, style); 00986 UnityPrint(UnityStrWas); 00987 UnityPrintNumberByStyle(actual, style); 00988 UnityAddMsgIfSpecified(msg); 00989 UNITY_FAIL_AND_BAIL; 00990 } 00991 } 00992 00993 /*-----------------------------------------------*/ 00994 void UnityAssertEqualString(const char* expected, 00995 const char* actual, 00996 const char* msg, 00997 const UNITY_LINE_TYPE lineNumber) 00998 { 00999 _UU32 i; 01000 01001 UNITY_SKIP_EXECUTION; 01002 01003 /* if both pointers not null compare the strings */ 01004 if (expected && actual) 01005 { 01006 for (i = 0; expected[i] || actual[i]; i++) 01007 { 01008 if (expected[i] != actual[i]) 01009 { 01010 Unity.CurrentTestFailed = 1; 01011 break; 01012 } 01013 } 01014 } 01015 else 01016 { /* handle case of one pointers being null (if both null, test should pass) */ 01017 if (expected != actual) 01018 { 01019 Unity.CurrentTestFailed = 1; 01020 } 01021 } 01022 01023 if (Unity.CurrentTestFailed) 01024 { 01025 UnityTestResultsFailBegin(lineNumber); 01026 UnityPrintExpectedAndActualStrings(expected, actual); 01027 UnityAddMsgIfSpecified(msg); 01028 UNITY_FAIL_AND_BAIL; 01029 } 01030 } 01031 01032 /*-----------------------------------------------*/ 01033 void UnityAssertEqualStringLen(const char* expected, 01034 const char* actual, 01035 const _UU32 length, 01036 const char* msg, 01037 const UNITY_LINE_TYPE lineNumber) 01038 { 01039 _UU32 i; 01040 01041 UNITY_SKIP_EXECUTION; 01042 01043 /* if both pointers not null compare the strings */ 01044 if (expected && actual) 01045 { 01046 for (i = 0; (expected[i] || actual[i]) && i < length; i++) 01047 { 01048 if (expected[i] != actual[i]) 01049 { 01050 Unity.CurrentTestFailed = 1; 01051 break; 01052 } 01053 } 01054 } 01055 else 01056 { /* handle case of one pointers being null (if both null, test should pass) */ 01057 if (expected != actual) 01058 { 01059 Unity.CurrentTestFailed = 1; 01060 } 01061 } 01062 01063 if (Unity.CurrentTestFailed) 01064 { 01065 UnityTestResultsFailBegin(lineNumber); 01066 UnityPrintExpectedAndActualStringsLen(expected, actual, length); 01067 UnityAddMsgIfSpecified(msg); 01068 UNITY_FAIL_AND_BAIL; 01069 } 01070 } 01071 01072 01073 /*-----------------------------------------------*/ 01074 void UnityAssertEqualStringArray( const char** expected, 01075 const char** actual, 01076 const _UU32 num_elements, 01077 const char* msg, 01078 const UNITY_LINE_TYPE lineNumber) 01079 { 01080 _UU32 i, j = 0; 01081 01082 UNITY_SKIP_EXECUTION; 01083 01084 /* if no elements, it's an error */ 01085 if (num_elements == 0) 01086 { 01087 UnityPrintPointlessAndBail(); 01088 } 01089 01090 if (UnityCheckArraysForNull((UNITY_INTERNAL_PTR)expected, (UNITY_INTERNAL_PTR)actual, lineNumber, msg) == 1) 01091 return; 01092 01093 do 01094 { 01095 /* if both pointers not null compare the strings */ 01096 if (expected[j] && actual[j]) 01097 { 01098 for (i = 0; expected[j][i] || actual[j][i]; i++) 01099 { 01100 if (expected[j][i] != actual[j][i]) 01101 { 01102 Unity.CurrentTestFailed = 1; 01103 break; 01104 } 01105 } 01106 } 01107 else 01108 { /* handle case of one pointers being null (if both null, test should pass) */ 01109 if (expected[j] != actual[j]) 01110 { 01111 Unity.CurrentTestFailed = 1; 01112 } 01113 } 01114 01115 if (Unity.CurrentTestFailed) 01116 { 01117 UnityTestResultsFailBegin(lineNumber); 01118 if (num_elements > 1) 01119 { 01120 UnityPrint(UnityStrElement); 01121 UnityPrintNumberUnsigned(j); 01122 } 01123 UnityPrintExpectedAndActualStrings((const char*)(expected[j]), (const char*)(actual[j])); 01124 UnityAddMsgIfSpecified(msg); 01125 UNITY_FAIL_AND_BAIL; 01126 } 01127 } while (++j < num_elements); 01128 } 01129 01130 /*-----------------------------------------------*/ 01131 void UnityAssertEqualMemory( UNITY_INTERNAL_PTR expected, 01132 UNITY_INTERNAL_PTR actual, 01133 const _UU32 length, 01134 const _UU32 num_elements, 01135 const char* msg, 01136 const UNITY_LINE_TYPE lineNumber) 01137 { 01138 UNITY_PTR_ATTRIBUTE const unsigned char* ptr_exp = (UNITY_PTR_ATTRIBUTE const unsigned char*)expected; 01139 UNITY_PTR_ATTRIBUTE const unsigned char* ptr_act = (UNITY_PTR_ATTRIBUTE const unsigned char*)actual; 01140 _UU32 elements = num_elements; 01141 _UU32 bytes; 01142 01143 UNITY_SKIP_EXECUTION; 01144 01145 if ((elements == 0) || (length == 0)) 01146 { 01147 UnityPrintPointlessAndBail(); 01148 } 01149 01150 if (UnityCheckArraysForNull((UNITY_INTERNAL_PTR)expected, (UNITY_INTERNAL_PTR)actual, lineNumber, msg) == 1) 01151 return; 01152 01153 while (elements--) 01154 { 01155 /* /////////////////////////////////// */ 01156 bytes = length; 01157 while (bytes--) 01158 { 01159 if (*ptr_exp != *ptr_act) 01160 { 01161 UnityTestResultsFailBegin(lineNumber); 01162 UnityPrint(UnityStrMemory); 01163 if (num_elements > 1) 01164 { 01165 UnityPrint(UnityStrElement); 01166 UnityPrintNumberUnsigned(num_elements - elements - 1); 01167 } 01168 UnityPrint(UnityStrByte); 01169 UnityPrintNumberUnsigned(length - bytes - 1); 01170 UnityPrint(UnityStrExpected); 01171 UnityPrintNumberByStyle(*ptr_exp, UNITY_DISPLAY_STYLE_HEX8); 01172 UnityPrint(UnityStrWas); 01173 UnityPrintNumberByStyle(*ptr_act, UNITY_DISPLAY_STYLE_HEX8); 01174 UnityAddMsgIfSpecified(msg); 01175 UNITY_FAIL_AND_BAIL; 01176 } 01177 ptr_exp = (UNITY_INTERNAL_PTR)((_UP)ptr_exp + 1); 01178 ptr_act = (UNITY_INTERNAL_PTR)((_UP)ptr_act + 1); 01179 } 01180 /* /////////////////////////////////// */ 01181 01182 } 01183 } 01184 01185 /*----------------------------------------------- 01186 * Control Functions 01187 *-----------------------------------------------*/ 01188 01189 void UnityFail(const char* msg, const UNITY_LINE_TYPE line) 01190 { 01191 UNITY_SKIP_EXECUTION; 01192 01193 UnityTestResultsBegin(Unity.TestFile, line); 01194 /* SA_PATCH: Make failures more noticable. */ 01195 UnityPrintVisibleFailure(); 01196 //UnityPrintFail(); 01197 if (msg != NULL) 01198 { 01199 UNITY_OUTPUT_CHAR(':'); 01200 01201 #ifndef UNITY_EXCLUDE_DETAILS 01202 if (Unity.CurrentDetail1) 01203 { 01204 UnityPrint(UnityStrDetail1Name); 01205 UnityPrint(Unity.CurrentDetail1); 01206 if (Unity.CurrentDetail2) 01207 { 01208 UnityPrint(UnityStrDetail2Name); 01209 UnityPrint(Unity.CurrentDetail2); 01210 } 01211 UnityPrint(UnityStrSpacer); 01212 } 01213 #endif 01214 if (msg[0] != ' ') 01215 { 01216 UNITY_OUTPUT_CHAR(' '); 01217 } 01218 UnityPrint(msg); 01219 } 01220 01221 UNITY_FAIL_AND_BAIL; 01222 } 01223 01224 /*-----------------------------------------------*/ 01225 void UnityIgnore(const char* msg, const UNITY_LINE_TYPE line) 01226 { 01227 UNITY_SKIP_EXECUTION; 01228 01229 UnityTestResultsBegin(Unity.TestFile, line); 01230 // SA_PATCH 01231 UnityPrint(UNITY_RESULTS_TAGS_RESULT_START); 01232 UnityPrint(UnityStrIgnore); 01233 UnityPrint(UNITY_RESULTS_TAGS_RESULT_END); 01234 if (msg != NULL) 01235 { 01236 UNITY_OUTPUT_CHAR(':'); 01237 UNITY_OUTPUT_CHAR(' '); 01238 UnityPrint(msg); 01239 } 01240 UNITY_IGNORE_AND_BAIL; 01241 } 01242 01243 /*-----------------------------------------------*/ 01244 #if defined(UNITY_WEAK_ATTRIBUTE) 01245 UNITY_WEAK_ATTRIBUTE void setUp(void) { } 01246 UNITY_WEAK_ATTRIBUTE void tearDown(void) { } 01247 #elif defined(UNITY_WEAK_PRAGMA) 01248 # pragma weak setUp 01249 void setUp(void) { } 01250 # pragma weak tearDown 01251 void tearDown(void) { } 01252 #endif 01253 /*-----------------------------------------------*/ 01254 void UnityDefaultTestRun(UnityTestFunction Func, const char* FuncName, const int FuncLineNum) 01255 { 01256 Unity.CurrentTestName = FuncName; 01257 Unity.CurrentTestLineNumber = (UNITY_LINE_TYPE)FuncLineNum; 01258 Unity.NumberOfTests++; 01259 UNITY_CLR_DETAILS(); 01260 if (TEST_PROTECT()) 01261 { 01262 setUp(); 01263 Func(); 01264 } 01265 if (TEST_PROTECT() && !(Unity.CurrentTestIgnored)) 01266 { 01267 tearDown(); 01268 } 01269 UnityConcludeTest(); 01270 } 01271 01272 /*-----------------------------------------------*/ 01273 void UnityBegin(const char* filename) 01274 { 01275 Unity.TestFile = filename; 01276 Unity.CurrentTestName = NULL; 01277 Unity.CurrentTestLineNumber = 0; 01278 Unity.NumberOfTests = 0; 01279 Unity.TestFailures = 0; 01280 Unity.TestIgnores = 0; 01281 Unity.CurrentTestFailed = 0; 01282 Unity.CurrentTestIgnored = 0; 01283 01284 UNITY_CLR_DETAILS(); 01285 UNITY_OUTPUT_START(); 01286 } 01287 01288 /*-----------------------------------------------*/ 01289 int UnityEnd(void) 01290 { 01291 UNITY_PRINT_EOL(); 01292 UnityPrint(UnityStrBreaker); 01293 UNITY_PRINT_EOL(); 01294 UnityPrintNumber((_U_SINT)(Unity.NumberOfTests)); 01295 UnityPrint(UnityStrResultsTests); 01296 UnityPrintNumber((_U_SINT)(Unity.TestFailures)); 01297 UnityPrint(UnityStrResultsFailures); 01298 UnityPrintNumber((_U_SINT)(Unity.TestIgnores)); 01299 UnityPrint(UnityStrResultsIgnored); 01300 UNITY_PRINT_EOL(); 01301 if (Unity.TestFailures == 0U) 01302 { 01303 UnityPrintOk(); 01304 } 01305 else 01306 { 01307 UnityPrintFail(); 01308 #ifdef UNITY_DIFFERENTIATE_FINAL_FAIL 01309 UNITY_OUTPUT_CHAR('E'); UNITY_OUTPUT_CHAR('D'); 01310 #endif 01311 } 01312 UNITY_PRINT_EOL(); 01313 UNITY_FLUSH_CALL(); 01314 UNITY_OUTPUT_COMPLETE(); 01315 return (int)(Unity.TestFailures); 01316 } 01317 01318 /*-----------------------------------------------*/
Generated on Tue Jul 12 2022 20:21:03 by
