1 1.2 christos /* $NetBSD: unity.c,v 1.2 2020/05/25 20:47:35 christos Exp $ */ 2 1.2 christos 3 1.1 christos /* ========================================================================= 4 1.1 christos Unity Project - A Test Framework for C 5 1.1 christos Copyright (c) 2007-14 Mike Karlesky, Mark VanderVoord, Greg Williams 6 1.1 christos [Released under MIT License. Please refer to license.txt for details] 7 1.1 christos ============================================================================ */ 8 1.1 christos 9 1.1 christos #include "unity.h" 10 1.1 christos 11 1.1 christos #define UNITY_FAIL_AND_BAIL { Unity.CurrentTestFailed = 1; longjmp(Unity.AbortFrame, 1); } 12 1.1 christos #define UNITY_IGNORE_AND_BAIL { Unity.CurrentTestIgnored = 1; longjmp(Unity.AbortFrame, 1); } 13 1.1 christos /// return prematurely if we are already in failure or ignore state 14 1.1 christos #define UNITY_SKIP_EXECUTION { if ((Unity.CurrentTestFailed != 0) || (Unity.CurrentTestIgnored != 0)) {return;} } 15 1.1 christos #define UNITY_PRINT_EOL { UNITY_OUTPUT_CHAR('\n'); } 16 1.1 christos 17 1.1 christos struct _Unity Unity; 18 1.1 christos 19 1.1 christos const char UnityStrOk[] = "OK"; 20 1.1 christos const char UnityStrPass[] = "PASS"; 21 1.1 christos const char UnityStrFail[] = "FAIL"; 22 1.1 christos const char UnityStrIgnore[] = "IGNORE"; 23 1.1 christos const char UnityStrXPASS[] = "XPASS"; 24 1.1 christos const char UnityStrXFAIL[] = "XFAIL"; 25 1.1 christos const char UnityStrNull[] = "NULL"; 26 1.1 christos const char UnityStrSpacer[] = ". "; 27 1.1 christos const char UnityStrExpected[] = " Expected "; 28 1.1 christos const char UnityStrWas[] = " Was "; 29 1.1 christos const char UnityStrTo[] = " To "; 30 1.1 christos const char UnityStrElement[] = " Element "; 31 1.1 christos const char UnityStrByte[] = " Byte "; 32 1.1 christos const char UnityStrMemory[] = " Memory Mismatch."; 33 1.1 christos const char UnityStrDelta[] = " Values Not Within Delta "; 34 1.1 christos const char UnityStrPointless[] = " You Asked Me To Compare Nothing, Which Was Pointless."; 35 1.1 christos const char UnityStrNullPointerForExpected[] = " Expected pointer to be NULL"; 36 1.1 christos const char UnityStrNullPointerForActual[] = " Actual pointer was NULL"; 37 1.1 christos const char UnityStrNot[] = "Not "; 38 1.1 christos const char UnityStrInf[] = "Infinity"; 39 1.1 christos const char UnityStrNegInf[] = "Negative Infinity"; 40 1.1 christos const char UnityStrNaN[] = "NaN"; 41 1.1 christos const char UnityStrDet[] = "Determinate"; 42 1.1 christos const char UnityStrErrFloat[] = "Unity Floating Point Disabled"; 43 1.1 christos const char UnityStrErrDouble[] = "Unity Double Precision Disabled"; 44 1.1 christos const char UnityStrErr64[] = "Unity 64-bit Support Disabled"; 45 1.1 christos const char UnityStrBreaker[] = "-----------------------"; 46 1.1 christos const char UnityStrResultsTests[] = " Tests: "; 47 1.1 christos const char UnityStrResultsFailures[] = " Failures "; 48 1.1 christos const char UnityStrResultsIgnored[] = " Ignored "; 49 1.1 christos const char UnityStrResultsXFAIL[] = " XFAIL "; 50 1.1 christos const char UnityStrResultsXPASS[] = " XPASS "; 51 1.1 christos const char UnityStrResultsPass[] = " PASS "; 52 1.1 christos 53 1.1 christos 54 1.1 christos #ifndef UNITY_EXCLUDE_FLOAT 55 1.1 christos // Dividing by these constants produces +/- infinity. 56 1.1 christos // The rationale is given in UnityAssertFloatIsInf's body. 57 1.1 christos static const _UF f_zero = 0.0f; 58 1.1 christos #ifndef UNITY_EXCLUDE_DOUBLE 59 1.1 christos static const _UD d_zero = 0.0; 60 1.1 christos #endif 61 1.1 christos #endif 62 1.1 christos 63 1.1 christos // compiler-generic print formatting masks 64 1.1 christos const _U_UINT UnitySizeMask[] = 65 1.1 christos { 66 1.1 christos 255u, // 0xFF 67 1.1 christos 65535u, // 0xFFFF 68 1.1 christos 65535u, 69 1.1 christos 4294967295u, // 0xFFFFFFFF 70 1.1 christos 4294967295u, 71 1.1 christos 4294967295u, 72 1.1 christos 4294967295u 73 1.1 christos #ifdef UNITY_SUPPORT_64 74 1.1 christos ,0xFFFFFFFFFFFFFFFF 75 1.1 christos #endif 76 1.1 christos }; 77 1.1 christos 78 1.1 christos void UnityPrintFail(void); 79 1.1 christos void UnityPrintOk(void); 80 1.1 christos 81 1.1 christos //----------------------------------------------- 82 1.1 christos // Pretty Printers & Test Result Output Handlers 83 1.1 christos //----------------------------------------------- 84 1.1 christos 85 1.1 christos void UnityPrint(const char* string) 86 1.1 christos { 87 1.1 christos const char* pch = string; 88 1.1 christos 89 1.1 christos if (pch != NULL) 90 1.1 christos { 91 1.1 christos while (*pch) 92 1.1 christos { 93 1.1 christos // printable characters plus CR & LF are printed 94 1.1 christos if ((*pch <= 126) && (*pch >= 32)) 95 1.1 christos { 96 1.1 christos UNITY_OUTPUT_CHAR(*pch); 97 1.1 christos } 98 1.1 christos //write escaped carriage returns 99 1.1 christos else if (*pch == 13) 100 1.1 christos { 101 1.1 christos UNITY_OUTPUT_CHAR('\\'); 102 1.1 christos UNITY_OUTPUT_CHAR('r'); 103 1.1 christos } 104 1.1 christos //write escaped line feeds 105 1.1 christos else if (*pch == 10) 106 1.1 christos { 107 1.1 christos UNITY_OUTPUT_CHAR('\\'); 108 1.1 christos UNITY_OUTPUT_CHAR('n'); 109 1.1 christos } 110 1.1 christos // unprintable characters are shown as codes 111 1.1 christos else 112 1.1 christos { 113 1.1 christos UNITY_OUTPUT_CHAR('\\'); 114 1.1 christos UnityPrintNumberHex((_U_UINT)*pch, 2); 115 1.1 christos } 116 1.1 christos pch++; 117 1.1 christos } 118 1.1 christos } 119 1.1 christos } 120 1.1 christos 121 1.1 christos //----------------------------------------------- 122 1.1 christos void UnityPrintNumberByStyle(const _U_SINT number, const UNITY_DISPLAY_STYLE_T style) 123 1.1 christos { 124 1.1 christos if ((style & UNITY_DISPLAY_RANGE_INT) == UNITY_DISPLAY_RANGE_INT) 125 1.1 christos { 126 1.1 christos UnityPrintNumber(number); 127 1.1 christos } 128 1.1 christos else if ((style & UNITY_DISPLAY_RANGE_UINT) == UNITY_DISPLAY_RANGE_UINT) 129 1.1 christos { 130 1.1 christos UnityPrintNumberUnsigned( (_U_UINT)number & UnitySizeMask[((_U_UINT)style & (_U_UINT)0x0F) - 1] ); 131 1.1 christos } 132 1.1 christos else 133 1.1 christos { 134 1.1 christos UnityPrintNumberHex((_U_UINT)number, (char)((style & 0x000F) << 1)); 135 1.1 christos } 136 1.1 christos } 137 1.1 christos 138 1.1 christos //----------------------------------------------- 139 1.1 christos /// basically do an itoa using as little ram as possible 140 1.1 christos void UnityPrintNumber(const _U_SINT number_to_print) 141 1.1 christos { 142 1.1 christos _U_SINT divisor = 1; 143 1.1 christos _U_SINT next_divisor; 144 1.1 christos _U_UINT number; 145 1.1 christos 146 1.1 christos if (number_to_print == (1l << (UNITY_LONG_WIDTH-1))) 147 1.1 christos { 148 1.1 christos //The largest representable negative number 149 1.1 christos UNITY_OUTPUT_CHAR('-'); 150 1.1 christos number = (1ul << (UNITY_LONG_WIDTH-1)); 151 1.1 christos } 152 1.1 christos else if (number_to_print < 0) 153 1.1 christos { 154 1.1 christos //Some other negative number 155 1.1 christos UNITY_OUTPUT_CHAR('-'); 156 1.1 christos number = (_U_UINT)(-number_to_print); 157 1.1 christos } 158 1.1 christos else 159 1.1 christos { 160 1.1 christos //Positive number 161 1.1 christos number = (_U_UINT)number_to_print; 162 1.1 christos } 163 1.1 christos 164 1.1 christos // figure out initial divisor 165 1.1 christos while (number / divisor > 9) 166 1.1 christos { 167 1.1 christos next_divisor = divisor * 10; 168 1.1 christos if (next_divisor > divisor) 169 1.1 christos divisor = next_divisor; 170 1.1 christos else 171 1.1 christos break; 172 1.1 christos } 173 1.1 christos 174 1.1 christos // now mod and print, then divide divisor 175 1.1 christos do 176 1.1 christos { 177 1.1 christos UNITY_OUTPUT_CHAR((char)('0' + (number / divisor % 10))); 178 1.1 christos divisor /= 10; 179 1.1 christos } 180 1.1 christos while (divisor > 0); 181 1.1 christos } 182 1.1 christos 183 1.1 christos //----------------------------------------------- 184 1.1 christos /// basically do an itoa using as little ram as possible 185 1.1 christos void UnityPrintNumberUnsigned(const _U_UINT number) 186 1.1 christos { 187 1.1 christos _U_UINT divisor = 1; 188 1.1 christos _U_UINT next_divisor; 189 1.1 christos 190 1.1 christos // figure out initial divisor 191 1.1 christos while (number / divisor > 9) 192 1.1 christos { 193 1.1 christos next_divisor = divisor * 10; 194 1.1 christos if (next_divisor > divisor) 195 1.1 christos divisor = next_divisor; 196 1.1 christos else 197 1.1 christos break; 198 1.1 christos } 199 1.1 christos 200 1.1 christos // now mod and print, then divide divisor 201 1.1 christos do 202 1.1 christos { 203 1.1 christos UNITY_OUTPUT_CHAR((char)('0' + (number / divisor % 10))); 204 1.1 christos divisor /= 10; 205 1.1 christos } 206 1.1 christos while (divisor > 0); 207 1.1 christos } 208 1.1 christos 209 1.1 christos //----------------------------------------------- 210 1.1 christos void UnityPrintNumberHex(const _U_UINT number, const char nibbles_to_print) 211 1.1 christos { 212 1.1 christos _U_UINT nibble; 213 1.1 christos char nibbles = nibbles_to_print; 214 1.1 christos UNITY_OUTPUT_CHAR('0'); 215 1.1 christos UNITY_OUTPUT_CHAR('x'); 216 1.1 christos 217 1.1 christos while (nibbles > 0) 218 1.1 christos { 219 1.1 christos nibble = (number >> (--nibbles << 2)) & 0x0000000F; 220 1.1 christos if (nibble <= 9) 221 1.1 christos { 222 1.1 christos UNITY_OUTPUT_CHAR((char)('0' + nibble)); 223 1.1 christos } 224 1.1 christos else 225 1.1 christos { 226 1.1 christos UNITY_OUTPUT_CHAR((char)('A' - 10 + nibble)); 227 1.1 christos } 228 1.1 christos } 229 1.1 christos } 230 1.1 christos 231 1.1 christos //----------------------------------------------- 232 1.1 christos void UnityPrintMask(const _U_UINT mask, const _U_UINT number) 233 1.1 christos { 234 1.1 christos _U_UINT current_bit = (_U_UINT)1 << (UNITY_INT_WIDTH - 1); 235 1.1 christos _US32 i; 236 1.1 christos 237 1.1 christos for (i = 0; i < UNITY_INT_WIDTH; i++) 238 1.1 christos { 239 1.1 christos if (current_bit & mask) 240 1.1 christos { 241 1.1 christos if (current_bit & number) 242 1.1 christos { 243 1.1 christos UNITY_OUTPUT_CHAR('1'); 244 1.1 christos } 245 1.1 christos else 246 1.1 christos { 247 1.1 christos UNITY_OUTPUT_CHAR('0'); 248 1.1 christos } 249 1.1 christos } 250 1.1 christos else 251 1.1 christos { 252 1.1 christos UNITY_OUTPUT_CHAR('X'); 253 1.1 christos } 254 1.1 christos current_bit = current_bit >> 1; 255 1.1 christos } 256 1.1 christos } 257 1.1 christos 258 1.1 christos //----------------------------------------------- 259 1.1 christos #ifdef UNITY_FLOAT_VERBOSE 260 1.1 christos #include <string.h> 261 1.1 christos void UnityPrintFloat(_UF number) 262 1.1 christos { 263 1.1 christos char TempBuffer[32]; 264 1.1 christos sprintf(TempBuffer, "%.6f", number); 265 1.1 christos UnityPrint(TempBuffer); 266 1.1 christos } 267 1.1 christos #endif 268 1.1 christos 269 1.1 christos //----------------------------------------------- 270 1.1 christos 271 1.1 christos void UnityPrintFail(void) 272 1.1 christos { 273 1.1 christos UnityPrint(UnityStrFail); 274 1.1 christos } 275 1.1 christos 276 1.1 christos void UnityPrintOk(void) 277 1.1 christos { 278 1.1 christos UnityPrint(UnityStrOk); 279 1.1 christos } 280 1.1 christos 281 1.1 christos //----------------------------------------------- 282 1.1 christos static void UnityTestResultsBegin(const char* file, const UNITY_LINE_TYPE line) 283 1.1 christos { 284 1.1 christos UnityPrint(file); 285 1.1 christos UNITY_OUTPUT_CHAR(':'); 286 1.1 christos UnityPrintNumber((_U_SINT)line); 287 1.1 christos UNITY_OUTPUT_CHAR(':'); 288 1.1 christos UnityPrint(Unity.CurrentTestName); 289 1.1 christos UNITY_OUTPUT_CHAR(':'); 290 1.1 christos } 291 1.1 christos 292 1.1 christos //----------------------------------------------- 293 1.1 christos static void UnityTestResultsFailBegin(const UNITY_LINE_TYPE line) 294 1.1 christos { 295 1.1 christos UnityTestResultsBegin(Unity.TestFile, line); 296 1.1 christos if (Unity.isExpectingFail) 297 1.1 christos { 298 1.1 christos UnityPrint(UnityStrXFAIL); 299 1.1 christos } 300 1.1 christos else 301 1.1 christos { 302 1.1 christos UnityPrint(UnityStrFail); 303 1.1 christos } 304 1.1 christos 305 1.1 christos UNITY_OUTPUT_CHAR(':'); 306 1.1 christos } 307 1.1 christos 308 1.1 christos //----------------------------------------------- 309 1.1 christos void UnityConcludeTest(void) 310 1.1 christos { 311 1.1 christos #if 0 312 1.1 christos if (Unity.isExpectingFail == 1 && Unity.CurrentTestFailed == 0) 313 1.1 christos { 314 1.1 christos printf("FAIL WAS EXPECTED, BUT IT DIDN'T HAPPEN?!"); 315 1.1 christos Unity.TestXPASSES++; 316 1.1 christos } 317 1.1 christos 318 1.1 christos else 319 1.1 christos #endif 320 1.1 christos //cant be ignored and accepting fail at the same time! 321 1.1 christos if (Unity.isExpectingFail == 1 && Unity.CurrentTestFailed == 1) 322 1.1 christos { 323 1.1 christos Unity.TestXFAILS++; //error message?! 324 1.1 christos if (Unity.XFAILMessage != NULL) 325 1.1 christos { 326 1.1 christos if (Unity.XFAILMessage[0] != ' ') 327 1.1 christos { 328 1.1 christos printf(" "); 329 1.1 christos } 330 1.1 christos 331 1.1 christos printf("| "); 332 1.2 christos printf("%s", Unity.XFAILMessage); 333 1.1 christos Unity.XFAILMessage = NULL; 334 1.1 christos } 335 1.1 christos else 336 1.1 christos { 337 1.1 christos printf(" - EXPECTED FAIL!"); 338 1.1 christos } 339 1.1 christos } 340 1.1 christos else 341 1.1 christos 342 1.1 christos if (Unity.CurrentTestIgnored) 343 1.1 christos { 344 1.1 christos Unity.TestIgnores++; 345 1.1 christos } 346 1.1 christos else if (!Unity.CurrentTestFailed) 347 1.1 christos { 348 1.1 christos if(Unity.isExpectingFail == 0) { 349 1.1 christos UnityTestResultsBegin(Unity.TestFile, Unity.CurrentTestLineNumber); 350 1.1 christos UnityPrint(UnityStrPass); 351 1.1 christos Unity.TestPasses++; 352 1.1 christos } 353 1.1 christos 354 1.1 christos //probably should remove the if... part 355 1.1 christos else if (Unity.isExpectingFail == 1 && Unity.CurrentTestFailed == 0) 356 1.1 christos { 357 1.1 christos 358 1.1 christos UnityTestResultsBegin(Unity.TestFile, Unity.CurrentTestLineNumber); 359 1.1 christos UnityPrint(UnityStrXPASS); 360 1.1 christos Unity.TestXPASSES++; 361 1.1 christos 362 1.1 christos printf(" - FAIL WAS EXPECTED, BUT DIDN'T HAPPEN?!"); 363 1.1 christos //if (Unity.TestPasses > 0) { Unity.TestPasses--; } 364 1.1 christos } 365 1.1 christos } 366 1.1 christos else 367 1.1 christos { 368 1.1 christos Unity.TestFailures++; 369 1.1 christos } 370 1.1 christos 371 1.1 christos Unity.CurrentTestFailed = 0; 372 1.1 christos Unity.CurrentTestIgnored = 0; 373 1.1 christos Unity.isExpectingFail = 0; 374 1.1 christos 375 1.1 christos UNITY_PRINT_EOL; 376 1.1 christos } 377 1.1 christos 378 1.1 christos //----------------------------------------------- 379 1.1 christos static void UnityAddMsgIfSpecified(const char* msg) 380 1.1 christos { 381 1.1 christos if (msg) 382 1.1 christos { 383 1.1 christos UnityPrint(UnityStrSpacer); 384 1.1 christos UnityPrint(msg); 385 1.1 christos } 386 1.1 christos } 387 1.1 christos 388 1.1 christos //----------------------------------------------- 389 1.1 christos static void UnityPrintExpectedAndActualStrings(const char* expected, const char* actual) 390 1.1 christos { 391 1.1 christos UnityPrint(UnityStrExpected); 392 1.1 christos if (expected != NULL) 393 1.1 christos { 394 1.1 christos UNITY_OUTPUT_CHAR('\''); 395 1.1 christos UnityPrint(expected); 396 1.1 christos UNITY_OUTPUT_CHAR('\''); 397 1.1 christos } 398 1.1 christos else 399 1.1 christos { 400 1.1 christos UnityPrint(UnityStrNull); 401 1.1 christos } 402 1.1 christos UnityPrint(UnityStrWas); 403 1.1 christos if (actual != NULL) 404 1.1 christos { 405 1.1 christos UNITY_OUTPUT_CHAR('\''); 406 1.1 christos UnityPrint(actual); 407 1.1 christos UNITY_OUTPUT_CHAR('\''); 408 1.1 christos } 409 1.1 christos else 410 1.1 christos { 411 1.1 christos UnityPrint(UnityStrNull); 412 1.1 christos } 413 1.1 christos } 414 1.1 christos 415 1.1 christos //----------------------------------------------- 416 1.1 christos // Assertion & Control Helpers 417 1.1 christos //----------------------------------------------- 418 1.1 christos 419 1.1 christos static int UnityCheckArraysForNull(UNITY_PTR_ATTRIBUTE const void* expected, UNITY_PTR_ATTRIBUTE const void* actual, const UNITY_LINE_TYPE lineNumber, const char* msg) 420 1.1 christos { 421 1.1 christos //return true if they are both NULL 422 1.1 christos if ((expected == NULL) && (actual == NULL)) 423 1.1 christos return 1; 424 1.1 christos 425 1.1 christos //throw error if just expected is NULL 426 1.1 christos if (expected == NULL) 427 1.1 christos { 428 1.1 christos UnityTestResultsFailBegin(lineNumber); 429 1.1 christos UnityPrint(UnityStrNullPointerForExpected); 430 1.1 christos UnityAddMsgIfSpecified(msg); 431 1.1 christos UNITY_FAIL_AND_BAIL; 432 1.1 christos } 433 1.1 christos 434 1.1 christos //throw error if just actual is NULL 435 1.1 christos if (actual == NULL) 436 1.1 christos { 437 1.1 christos UnityTestResultsFailBegin(lineNumber); 438 1.1 christos UnityPrint(UnityStrNullPointerForActual); 439 1.1 christos UnityAddMsgIfSpecified(msg); 440 1.1 christos UNITY_FAIL_AND_BAIL; 441 1.1 christos } 442 1.1 christos 443 1.1 christos //return false if neither is NULL 444 1.1 christos return 0; 445 1.1 christos } 446 1.1 christos 447 1.1 christos //----------------------------------------------- 448 1.1 christos // Assertion Functions 449 1.1 christos //----------------------------------------------- 450 1.1 christos 451 1.1 christos void UnityAssertBits(const _U_SINT mask, 452 1.1 christos const _U_SINT expected, 453 1.1 christos const _U_SINT actual, 454 1.1 christos const char* msg, 455 1.1 christos const UNITY_LINE_TYPE lineNumber) 456 1.1 christos { 457 1.1 christos UNITY_SKIP_EXECUTION; 458 1.1 christos 459 1.1 christos if ((mask & expected) != (mask & actual)) 460 1.1 christos { 461 1.1 christos UnityTestResultsFailBegin(lineNumber); 462 1.1 christos UnityPrint(UnityStrExpected); 463 1.1 christos UnityPrintMask((_U_UINT)mask, (_U_UINT)expected); 464 1.1 christos UnityPrint(UnityStrWas); 465 1.1 christos UnityPrintMask((_U_UINT)mask, (_U_UINT)actual); 466 1.1 christos UnityAddMsgIfSpecified(msg); 467 1.1 christos UNITY_FAIL_AND_BAIL; 468 1.1 christos } 469 1.1 christos } 470 1.1 christos 471 1.1 christos //----------------------------------------------- 472 1.1 christos void UnityAssertEqualNumber(const _U_SINT expected, 473 1.1 christos const _U_SINT actual, 474 1.1 christos const char* msg, 475 1.1 christos const UNITY_LINE_TYPE lineNumber, 476 1.1 christos const UNITY_DISPLAY_STYLE_T style) 477 1.1 christos { 478 1.1 christos UNITY_SKIP_EXECUTION; 479 1.1 christos 480 1.1 christos if (expected != actual) 481 1.1 christos { 482 1.1 christos UnityTestResultsFailBegin(lineNumber); 483 1.1 christos UnityPrint(UnityStrExpected); 484 1.1 christos UnityPrintNumberByStyle(expected, style); 485 1.1 christos UnityPrint(UnityStrWas); 486 1.1 christos UnityPrintNumberByStyle(actual, style); 487 1.1 christos UnityAddMsgIfSpecified(msg); 488 1.1 christos UNITY_FAIL_AND_BAIL; 489 1.1 christos } 490 1.1 christos } 491 1.1 christos 492 1.1 christos //----------------------------------------------- 493 1.1 christos void UnityAssertEqualIntArray(UNITY_PTR_ATTRIBUTE const void* expected, 494 1.1 christos UNITY_PTR_ATTRIBUTE const void* actual, 495 1.1 christos const _UU32 num_elements, 496 1.1 christos const char* msg, 497 1.1 christos const UNITY_LINE_TYPE lineNumber, 498 1.1 christos const UNITY_DISPLAY_STYLE_T style) 499 1.1 christos { 500 1.1 christos _UU32 elements = num_elements; 501 1.1 christos UNITY_PTR_ATTRIBUTE const _US8* ptr_exp = (UNITY_PTR_ATTRIBUTE const _US8*)expected; 502 1.1 christos UNITY_PTR_ATTRIBUTE const _US8* ptr_act = (UNITY_PTR_ATTRIBUTE const _US8*)actual; 503 1.1 christos 504 1.1 christos UNITY_SKIP_EXECUTION; 505 1.1 christos 506 1.1 christos if (elements == 0) 507 1.1 christos { 508 1.1 christos UnityTestResultsFailBegin(lineNumber); 509 1.1 christos UnityPrint(UnityStrPointless); 510 1.1 christos UnityAddMsgIfSpecified(msg); 511 1.1 christos UNITY_FAIL_AND_BAIL; 512 1.1 christos } 513 1.1 christos 514 1.1 christos if (UnityCheckArraysForNull((UNITY_PTR_ATTRIBUTE const void*)expected, (UNITY_PTR_ATTRIBUTE const void*)actual, lineNumber, msg) == 1) 515 1.1 christos return; 516 1.1 christos 517 1.1 christos // If style is UNITY_DISPLAY_STYLE_INT, we'll fall into the default case rather than the INT16 or INT32 (etc) case 518 1.1 christos // as UNITY_DISPLAY_STYLE_INT includes a flag for UNITY_DISPLAY_RANGE_AUTO, which the width-specific 519 1.1 christos // variants do not. Therefore remove this flag. 520 1.1 christos switch(style & (UNITY_DISPLAY_STYLE_T)(~UNITY_DISPLAY_RANGE_AUTO)) 521 1.1 christos { 522 1.1 christos case UNITY_DISPLAY_STYLE_HEX8: 523 1.1 christos case UNITY_DISPLAY_STYLE_INT8: 524 1.1 christos case UNITY_DISPLAY_STYLE_UINT8: 525 1.1 christos while (elements--) 526 1.1 christos { 527 1.1 christos if (*ptr_exp != *ptr_act) 528 1.1 christos { 529 1.1 christos UnityTestResultsFailBegin(lineNumber); 530 1.1 christos UnityPrint(UnityStrElement); 531 1.1 christos UnityPrintNumberByStyle((num_elements - elements - 1), UNITY_DISPLAY_STYLE_UINT); 532 1.1 christos UnityPrint(UnityStrExpected); 533 1.1 christos UnityPrintNumberByStyle(*ptr_exp, style); 534 1.1 christos UnityPrint(UnityStrWas); 535 1.1 christos UnityPrintNumberByStyle(*ptr_act, style); 536 1.1 christos UnityAddMsgIfSpecified(msg); 537 1.1 christos UNITY_FAIL_AND_BAIL; 538 1.1 christos } 539 1.1 christos ptr_exp += 1; 540 1.1 christos ptr_act += 1; 541 1.1 christos } 542 1.1 christos break; 543 1.1 christos case UNITY_DISPLAY_STYLE_HEX16: 544 1.1 christos case UNITY_DISPLAY_STYLE_INT16: 545 1.1 christos case UNITY_DISPLAY_STYLE_UINT16: 546 1.1 christos while (elements--) 547 1.1 christos { 548 1.1 christos if (*(UNITY_PTR_ATTRIBUTE const _US16*)(void*)ptr_exp != *(UNITY_PTR_ATTRIBUTE const _US16*)(void*)ptr_act) 549 1.1 christos { 550 1.1 christos UnityTestResultsFailBegin(lineNumber); 551 1.1 christos UnityPrint(UnityStrElement); 552 1.1 christos UnityPrintNumberByStyle((num_elements - elements - 1), UNITY_DISPLAY_STYLE_UINT); 553 1.1 christos UnityPrint(UnityStrExpected); 554 1.1 christos UnityPrintNumberByStyle(*(UNITY_PTR_ATTRIBUTE const _US16*)(void*)ptr_exp, style); 555 1.1 christos UnityPrint(UnityStrWas); 556 1.1 christos UnityPrintNumberByStyle(*(UNITY_PTR_ATTRIBUTE const _US16*)(void*)ptr_act, style); 557 1.1 christos UnityAddMsgIfSpecified(msg); 558 1.1 christos UNITY_FAIL_AND_BAIL; 559 1.1 christos } 560 1.1 christos ptr_exp += 2; 561 1.1 christos ptr_act += 2; 562 1.1 christos } 563 1.1 christos break; 564 1.1 christos #ifdef UNITY_SUPPORT_64 565 1.1 christos case UNITY_DISPLAY_STYLE_HEX64: 566 1.1 christos case UNITY_DISPLAY_STYLE_INT64: 567 1.1 christos case UNITY_DISPLAY_STYLE_UINT64: 568 1.1 christos while (elements--) 569 1.1 christos { 570 1.1 christos if (*(UNITY_PTR_ATTRIBUTE const _US64*)(void*)ptr_exp != *(UNITY_PTR_ATTRIBUTE const _US64*)(void*)ptr_act) 571 1.1 christos { 572 1.1 christos UnityTestResultsFailBegin(lineNumber); 573 1.1 christos UnityPrint(UnityStrElement); 574 1.1 christos UnityPrintNumberByStyle((num_elements - elements - 1), UNITY_DISPLAY_STYLE_UINT); 575 1.1 christos UnityPrint(UnityStrExpected); 576 1.1 christos UnityPrintNumberByStyle(*(UNITY_PTR_ATTRIBUTE const _US64*)(void*)ptr_exp, style); 577 1.1 christos UnityPrint(UnityStrWas); 578 1.1 christos UnityPrintNumberByStyle(*(UNITY_PTR_ATTRIBUTE const _US64*)(void*)ptr_act, style); 579 1.1 christos UnityAddMsgIfSpecified(msg); 580 1.1 christos UNITY_FAIL_AND_BAIL; 581 1.1 christos } 582 1.1 christos ptr_exp += 8; 583 1.1 christos ptr_act += 8; 584 1.1 christos } 585 1.1 christos break; 586 1.1 christos #endif 587 1.1 christos default: 588 1.1 christos while (elements--) 589 1.1 christos { 590 1.1 christos if (*(UNITY_PTR_ATTRIBUTE const _US32*)(void*)ptr_exp != *(UNITY_PTR_ATTRIBUTE const _US32*)(void*)ptr_act) 591 1.1 christos { 592 1.1 christos UnityTestResultsFailBegin(lineNumber); 593 1.1 christos UnityPrint(UnityStrElement); 594 1.1 christos UnityPrintNumberByStyle((num_elements - elements - 1), UNITY_DISPLAY_STYLE_UINT); 595 1.1 christos UnityPrint(UnityStrExpected); 596 1.1 christos UnityPrintNumberByStyle(*(UNITY_PTR_ATTRIBUTE const _US32*)(void*)ptr_exp, style); 597 1.1 christos UnityPrint(UnityStrWas); 598 1.1 christos UnityPrintNumberByStyle(*(UNITY_PTR_ATTRIBUTE const _US32*)(void*)ptr_act, style); 599 1.1 christos UnityAddMsgIfSpecified(msg); 600 1.1 christos UNITY_FAIL_AND_BAIL; 601 1.1 christos } 602 1.1 christos ptr_exp += 4; 603 1.1 christos ptr_act += 4; 604 1.1 christos } 605 1.1 christos break; 606 1.1 christos } 607 1.1 christos } 608 1.1 christos 609 1.1 christos //----------------------------------------------- 610 1.1 christos #ifndef UNITY_EXCLUDE_FLOAT 611 1.1 christos void UnityAssertEqualFloatArray(UNITY_PTR_ATTRIBUTE const _UF* expected, 612 1.1 christos UNITY_PTR_ATTRIBUTE const _UF* actual, 613 1.1 christos const _UU32 num_elements, 614 1.1 christos const char* msg, 615 1.1 christos const UNITY_LINE_TYPE lineNumber) 616 1.1 christos { 617 1.1 christos _UU32 elements = num_elements; 618 1.1 christos UNITY_PTR_ATTRIBUTE const _UF* ptr_expected = expected; 619 1.1 christos UNITY_PTR_ATTRIBUTE const _UF* ptr_actual = actual; 620 1.1 christos _UF diff, tol; 621 1.1 christos 622 1.1 christos UNITY_SKIP_EXECUTION; 623 1.1 christos 624 1.1 christos if (elements == 0) 625 1.1 christos { 626 1.1 christos UnityTestResultsFailBegin(lineNumber); 627 1.1 christos UnityPrint(UnityStrPointless); 628 1.1 christos UnityAddMsgIfSpecified(msg); 629 1.1 christos UNITY_FAIL_AND_BAIL; 630 1.1 christos } 631 1.1 christos 632 1.1 christos if (UnityCheckArraysForNull((UNITY_PTR_ATTRIBUTE const void*)expected, (UNITY_PTR_ATTRIBUTE const void*)actual, lineNumber, msg) == 1) 633 1.1 christos return; 634 1.1 christos 635 1.1 christos while (elements--) 636 1.1 christos { 637 1.1 christos diff = *ptr_expected - *ptr_actual; 638 1.1 christos if (diff < 0.0f) 639 1.1 christos diff = 0.0f - diff; 640 1.1 christos tol = UNITY_FLOAT_PRECISION * *ptr_expected; 641 1.1 christos if (tol < 0.0f) 642 1.1 christos tol = 0.0f - tol; 643 1.1 christos 644 1.1 christos //This first part of this condition will catch any NaN or Infinite values 645 1.1 christos if ((diff * 0.0f != 0.0f) || (diff > tol)) 646 1.1 christos { 647 1.1 christos UnityTestResultsFailBegin(lineNumber); 648 1.1 christos UnityPrint(UnityStrElement); 649 1.1 christos UnityPrintNumberByStyle((num_elements - elements - 1), UNITY_DISPLAY_STYLE_UINT); 650 1.1 christos #ifdef UNITY_FLOAT_VERBOSE 651 1.1 christos UnityPrint(UnityStrExpected); 652 1.1 christos UnityPrintFloat(*ptr_expected); 653 1.1 christos UnityPrint(UnityStrWas); 654 1.1 christos UnityPrintFloat(*ptr_actual); 655 1.1 christos #else 656 1.1 christos UnityPrint(UnityStrDelta); 657 1.1 christos #endif 658 1.1 christos UnityAddMsgIfSpecified(msg); 659 1.1 christos UNITY_FAIL_AND_BAIL; 660 1.1 christos } 661 1.1 christos ptr_expected++; 662 1.1 christos ptr_actual++; 663 1.1 christos } 664 1.1 christos } 665 1.1 christos 666 1.1 christos //----------------------------------------------- 667 1.1 christos void UnityAssertFloatsWithin(const _UF delta, 668 1.1 christos const _UF expected, 669 1.1 christos const _UF actual, 670 1.1 christos const char* msg, 671 1.1 christos const UNITY_LINE_TYPE lineNumber) 672 1.1 christos { 673 1.1 christos _UF diff = actual - expected; 674 1.1 christos _UF pos_delta = delta; 675 1.1 christos 676 1.1 christos UNITY_SKIP_EXECUTION; 677 1.1 christos 678 1.1 christos if (diff < 0.0f) 679 1.1 christos { 680 1.1 christos diff = 0.0f - diff; 681 1.1 christos } 682 1.1 christos if (pos_delta < 0.0f) 683 1.1 christos { 684 1.1 christos pos_delta = 0.0f - pos_delta; 685 1.1 christos } 686 1.1 christos 687 1.1 christos //This first part of this condition will catch any NaN or Infinite values 688 1.1 christos if ((diff * 0.0f != 0.0f) || (pos_delta < diff)) 689 1.1 christos { 690 1.1 christos UnityTestResultsFailBegin(lineNumber); 691 1.1 christos #ifdef UNITY_FLOAT_VERBOSE 692 1.1 christos UnityPrint(UnityStrExpected); 693 1.1 christos UnityPrintFloat(expected); 694 1.1 christos UnityPrint(UnityStrWas); 695 1.1 christos UnityPrintFloat(actual); 696 1.1 christos #else 697 1.1 christos UnityPrint(UnityStrDelta); 698 1.1 christos #endif 699 1.1 christos UnityAddMsgIfSpecified(msg); 700 1.1 christos UNITY_FAIL_AND_BAIL; 701 1.1 christos } 702 1.1 christos } 703 1.1 christos 704 1.1 christos //----------------------------------------------- 705 1.1 christos void UnityAssertFloatSpecial(const _UF actual, 706 1.1 christos const char* msg, 707 1.1 christos const UNITY_LINE_TYPE lineNumber, 708 1.1 christos const UNITY_FLOAT_TRAIT_T style) 709 1.1 christos { 710 1.1 christos const char* trait_names[] = { UnityStrInf, UnityStrNegInf, UnityStrNaN, UnityStrDet }; 711 1.1 christos _U_SINT should_be_trait = ((_U_SINT)style & 1); 712 1.1 christos _U_SINT is_trait = !should_be_trait; 713 1.1 christos _U_SINT trait_index = style >> 1; 714 1.1 christos 715 1.1 christos UNITY_SKIP_EXECUTION; 716 1.1 christos 717 1.1 christos switch(style) 718 1.1 christos { 719 1.1 christos //To determine Inf / Neg Inf, we compare to an Inf / Neg Inf value we create on the fly 720 1.1 christos //We are using a variable to hold the zero value because some compilers complain about dividing by zero otherwise 721 1.1 christos case UNITY_FLOAT_IS_INF: 722 1.1 christos case UNITY_FLOAT_IS_NOT_INF: 723 1.1 christos is_trait = ((1.0f / f_zero) == actual) ? 1 : 0; 724 1.1 christos break; 725 1.1 christos case UNITY_FLOAT_IS_NEG_INF: 726 1.1 christos case UNITY_FLOAT_IS_NOT_NEG_INF: 727 1.1 christos is_trait = ((-1.0f / f_zero) == actual) ? 1 : 0; 728 1.1 christos break; 729 1.1 christos 730 1.1 christos //NaN is the only floating point value that does NOT equal itself. Therefore if Actual == Actual, then it is NOT NaN. 731 1.1 christos case UNITY_FLOAT_IS_NAN: 732 1.1 christos case UNITY_FLOAT_IS_NOT_NAN: 733 1.1 christos is_trait = (actual == actual) ? 0 : 1; 734 1.1 christos break; 735 1.1 christos 736 1.1 christos //A determinate number is non infinite and not NaN. (therefore the opposite of the two above) 737 1.1 christos case UNITY_FLOAT_IS_DET: 738 1.1 christos case UNITY_FLOAT_IS_NOT_DET: 739 1.1 christos if ( (actual != actual) || ((1.0f / f_zero) == actual) || ((-1.0f / f_zero) == actual) ) 740 1.1 christos is_trait = 0; 741 1.1 christos else 742 1.1 christos is_trait = 1; 743 1.1 christos break; 744 1.1 christos default: 745 1.1 christos ; 746 1.1 christos } 747 1.1 christos 748 1.1 christos if (is_trait != should_be_trait) 749 1.1 christos { 750 1.1 christos UnityTestResultsFailBegin(lineNumber); 751 1.1 christos UnityPrint(UnityStrExpected); 752 1.1 christos if (!should_be_trait) 753 1.1 christos UnityPrint(UnityStrNot); 754 1.1 christos UnityPrint(trait_names[trait_index]); 755 1.1 christos UnityPrint(UnityStrWas); 756 1.1 christos #ifdef UNITY_FLOAT_VERBOSE 757 1.1 christos UnityPrintFloat(actual); 758 1.1 christos #else 759 1.1 christos if (should_be_trait) 760 1.1 christos UnityPrint(UnityStrNot); 761 1.1 christos UnityPrint(trait_names[trait_index]); 762 1.1 christos #endif 763 1.1 christos UnityAddMsgIfSpecified(msg); 764 1.1 christos UNITY_FAIL_AND_BAIL; 765 1.1 christos } 766 1.1 christos } 767 1.1 christos 768 1.1 christos #endif //not UNITY_EXCLUDE_FLOAT 769 1.1 christos 770 1.1 christos //----------------------------------------------- 771 1.1 christos #ifndef UNITY_EXCLUDE_DOUBLE 772 1.1 christos void UnityAssertEqualDoubleArray(UNITY_PTR_ATTRIBUTE const _UD* expected, 773 1.1 christos UNITY_PTR_ATTRIBUTE const _UD* actual, 774 1.1 christos const _UU32 num_elements, 775 1.1 christos const char* msg, 776 1.1 christos const UNITY_LINE_TYPE lineNumber) 777 1.1 christos { 778 1.1 christos _UU32 elements = num_elements; 779 1.1 christos UNITY_PTR_ATTRIBUTE const _UD* ptr_expected = expected; 780 1.1 christos UNITY_PTR_ATTRIBUTE const _UD* ptr_actual = actual; 781 1.1 christos _UD diff, tol; 782 1.1 christos 783 1.1 christos UNITY_SKIP_EXECUTION; 784 1.1 christos 785 1.1 christos if (elements == 0) 786 1.1 christos { 787 1.1 christos UnityTestResultsFailBegin(lineNumber); 788 1.1 christos UnityPrint(UnityStrPointless); 789 1.1 christos UnityAddMsgIfSpecified(msg); 790 1.1 christos UNITY_FAIL_AND_BAIL; 791 1.1 christos } 792 1.1 christos 793 1.1 christos if (UnityCheckArraysForNull((UNITY_PTR_ATTRIBUTE void*)expected, (UNITY_PTR_ATTRIBUTE void*)actual, lineNumber, msg) == 1) 794 1.1 christos return; 795 1.1 christos 796 1.1 christos while (elements--) 797 1.1 christos { 798 1.1 christos diff = *ptr_expected - *ptr_actual; 799 1.1 christos if (diff < 0.0) 800 1.1 christos diff = 0.0 - diff; 801 1.1 christos tol = UNITY_DOUBLE_PRECISION * *ptr_expected; 802 1.1 christos if (tol < 0.0) 803 1.1 christos tol = 0.0 - tol; 804 1.1 christos 805 1.1 christos //This first part of this condition will catch any NaN or Infinite values 806 1.1 christos if ((diff * 0.0 != 0.0) || (diff > tol)) 807 1.1 christos { 808 1.1 christos UnityTestResultsFailBegin(lineNumber); 809 1.1 christos UnityPrint(UnityStrElement); 810 1.1 christos UnityPrintNumberByStyle((num_elements - elements - 1), UNITY_DISPLAY_STYLE_UINT); 811 1.1 christos #ifdef UNITY_DOUBLE_VERBOSE 812 1.1 christos UnityPrint(UnityStrExpected); 813 1.1 christos UnityPrintFloat((float)(*ptr_expected)); 814 1.1 christos UnityPrint(UnityStrWas); 815 1.1 christos UnityPrintFloat((float)(*ptr_actual)); 816 1.1 christos #else 817 1.1 christos UnityPrint(UnityStrDelta); 818 1.1 christos #endif 819 1.1 christos UnityAddMsgIfSpecified(msg); 820 1.1 christos UNITY_FAIL_AND_BAIL; 821 1.1 christos } 822 1.1 christos ptr_expected++; 823 1.1 christos ptr_actual++; 824 1.1 christos } 825 1.1 christos } 826 1.1 christos 827 1.1 christos //----------------------------------------------- 828 1.1 christos void UnityAssertDoublesWithin(const _UD delta, 829 1.1 christos const _UD expected, 830 1.1 christos const _UD actual, 831 1.1 christos const char* msg, 832 1.1 christos const UNITY_LINE_TYPE lineNumber) 833 1.1 christos { 834 1.1 christos _UD diff = actual - expected; 835 1.1 christos _UD pos_delta = delta; 836 1.1 christos 837 1.1 christos UNITY_SKIP_EXECUTION; 838 1.1 christos 839 1.1 christos if (diff < 0.0) 840 1.1 christos { 841 1.1 christos diff = 0.0 - diff; 842 1.1 christos } 843 1.1 christos if (pos_delta < 0.0) 844 1.1 christos { 845 1.1 christos pos_delta = 0.0 - pos_delta; 846 1.1 christos } 847 1.1 christos 848 1.1 christos //This first part of this condition will catch any NaN or Infinite values 849 1.1 christos if ((diff * 0.0 != 0.0) || (pos_delta < diff)) 850 1.1 christos { 851 1.1 christos UnityTestResultsFailBegin(lineNumber); 852 1.1 christos #ifdef UNITY_DOUBLE_VERBOSE 853 1.1 christos UnityPrint(UnityStrExpected); 854 1.1 christos UnityPrintFloat((float)expected); 855 1.1 christos UnityPrint(UnityStrWas); 856 1.1 christos UnityPrintFloat((float)actual); 857 1.1 christos #else 858 1.1 christos UnityPrint(UnityStrDelta); 859 1.1 christos #endif 860 1.1 christos UnityAddMsgIfSpecified(msg); 861 1.1 christos UNITY_FAIL_AND_BAIL; 862 1.1 christos } 863 1.1 christos } 864 1.1 christos 865 1.1 christos //----------------------------------------------- 866 1.1 christos 867 1.1 christos void UnityAssertDoubleSpecial(const _UD actual, 868 1.1 christos const char* msg, 869 1.1 christos const UNITY_LINE_TYPE lineNumber, 870 1.1 christos const UNITY_FLOAT_TRAIT_T style) 871 1.1 christos { 872 1.1 christos const char* trait_names[] = { UnityStrInf, UnityStrNegInf, UnityStrNaN, UnityStrDet }; 873 1.1 christos _U_SINT should_be_trait = ((_U_SINT)style & 1); 874 1.1 christos _U_SINT is_trait = !should_be_trait; 875 1.1 christos _U_SINT trait_index = style >> 1; 876 1.1 christos 877 1.1 christos UNITY_SKIP_EXECUTION; 878 1.1 christos 879 1.1 christos switch(style) 880 1.1 christos { 881 1.1 christos //To determine Inf / Neg Inf, we compare to an Inf / Neg Inf value we create on the fly 882 1.1 christos //We are using a variable to hold the zero value because some compilers complain about dividing by zero otherwise 883 1.1 christos case UNITY_FLOAT_IS_INF: 884 1.1 christos case UNITY_FLOAT_IS_NOT_INF: 885 1.1 christos is_trait = ((1.0 / d_zero) == actual) ? 1 : 0; 886 1.1 christos break; 887 1.1 christos case UNITY_FLOAT_IS_NEG_INF: 888 1.1 christos case UNITY_FLOAT_IS_NOT_NEG_INF: 889 1.1 christos is_trait = ((-1.0 / d_zero) == actual) ? 1 : 0; 890 1.1 christos break; 891 1.1 christos 892 1.1 christos //NaN is the only floating point value that does NOT equal itself. Therefore if Actual == Actual, then it is NOT NaN. 893 1.1 christos case UNITY_FLOAT_IS_NAN: 894 1.1 christos case UNITY_FLOAT_IS_NOT_NAN: 895 1.1 christos is_trait = (actual == actual) ? 0 : 1; 896 1.1 christos break; 897 1.1 christos 898 1.1 christos //A determinate number is non infinite and not NaN. (therefore the opposite of the two above) 899 1.1 christos case UNITY_FLOAT_IS_DET: 900 1.1 christos case UNITY_FLOAT_IS_NOT_DET: 901 1.1 christos if ( (actual != actual) || ((1.0 / d_zero) == actual) || ((-1.0 / d_zero) == actual) ) 902 1.1 christos is_trait = 0; 903 1.1 christos else 904 1.1 christos is_trait = 1; 905 1.1 christos break; 906 1.1 christos default: 907 1.1 christos ; 908 1.1 christos } 909 1.1 christos 910 1.1 christos if (is_trait != should_be_trait) 911 1.1 christos { 912 1.1 christos UnityTestResultsFailBegin(lineNumber); 913 1.1 christos UnityPrint(UnityStrExpected); 914 1.1 christos if (!should_be_trait) 915 1.1 christos UnityPrint(UnityStrNot); 916 1.1 christos UnityPrint(trait_names[trait_index]); 917 1.1 christos UnityPrint(UnityStrWas); 918 1.1 christos #ifdef UNITY_DOUBLE_VERBOSE 919 1.1 christos UnityPrintFloat(actual); 920 1.1 christos #else 921 1.1 christos if (should_be_trait) 922 1.1 christos UnityPrint(UnityStrNot); 923 1.1 christos UnityPrint(trait_names[trait_index]); 924 1.1 christos #endif 925 1.1 christos UnityAddMsgIfSpecified(msg); 926 1.1 christos UNITY_FAIL_AND_BAIL; 927 1.1 christos } 928 1.1 christos } 929 1.1 christos 930 1.1 christos 931 1.1 christos #endif // not UNITY_EXCLUDE_DOUBLE 932 1.1 christos 933 1.1 christos //----------------------------------------------- 934 1.1 christos void UnityAssertNumbersWithin( const _U_SINT delta, 935 1.1 christos const _U_SINT expected, 936 1.1 christos const _U_SINT actual, 937 1.1 christos const char* msg, 938 1.1 christos const UNITY_LINE_TYPE lineNumber, 939 1.1 christos const UNITY_DISPLAY_STYLE_T style) 940 1.1 christos { 941 1.1 christos UNITY_SKIP_EXECUTION; 942 1.1 christos 943 1.1 christos if ((style & UNITY_DISPLAY_RANGE_INT) == UNITY_DISPLAY_RANGE_INT) 944 1.1 christos { 945 1.1 christos if (actual > expected) 946 1.1 christos Unity.CurrentTestFailed = ((actual - expected) > delta); 947 1.1 christos else 948 1.1 christos Unity.CurrentTestFailed = ((expected - actual) > delta); 949 1.1 christos } 950 1.1 christos else 951 1.1 christos { 952 1.1 christos if ((_U_UINT)actual > (_U_UINT)expected) 953 1.1 christos Unity.CurrentTestFailed = ((_U_UINT)(actual - expected) > (_U_UINT)delta); 954 1.1 christos else 955 1.1 christos Unity.CurrentTestFailed = ((_U_UINT)(expected - actual) > (_U_UINT)delta); 956 1.1 christos } 957 1.1 christos 958 1.1 christos if (Unity.CurrentTestFailed) 959 1.1 christos { 960 1.1 christos UnityTestResultsFailBegin(lineNumber); 961 1.1 christos UnityPrint(UnityStrDelta); 962 1.1 christos UnityPrintNumberByStyle(delta, style); 963 1.1 christos UnityPrint(UnityStrExpected); 964 1.1 christos UnityPrintNumberByStyle(expected, style); 965 1.1 christos UnityPrint(UnityStrWas); 966 1.1 christos UnityPrintNumberByStyle(actual, style); 967 1.1 christos UnityAddMsgIfSpecified(msg); 968 1.1 christos UNITY_FAIL_AND_BAIL; 969 1.1 christos } 970 1.1 christos } 971 1.1 christos 972 1.1 christos //----------------------------------------------- 973 1.1 christos void UnityAssertEqualString(const char* expected, 974 1.1 christos const char* actual, 975 1.1 christos const char* msg, 976 1.1 christos const UNITY_LINE_TYPE lineNumber) 977 1.1 christos { 978 1.1 christos _UU32 i; 979 1.1 christos 980 1.1 christos UNITY_SKIP_EXECUTION; 981 1.1 christos 982 1.1 christos // if both pointers not null compare the strings 983 1.1 christos if (expected && actual) 984 1.1 christos { 985 1.1 christos for (i = 0; expected[i] || actual[i]; i++) 986 1.1 christos { 987 1.1 christos if (expected[i] != actual[i]) 988 1.1 christos { 989 1.1 christos Unity.CurrentTestFailed = 1; 990 1.1 christos break; 991 1.1 christos } 992 1.1 christos } 993 1.1 christos } 994 1.1 christos else 995 1.1 christos { // handle case of one pointers being null (if both null, test should pass) 996 1.1 christos if (expected != actual) 997 1.1 christos { 998 1.1 christos Unity.CurrentTestFailed = 1; 999 1.1 christos } 1000 1.1 christos } 1001 1.1 christos 1002 1.1 christos if (Unity.CurrentTestFailed) 1003 1.1 christos { 1004 1.1 christos UnityTestResultsFailBegin(lineNumber); 1005 1.1 christos UnityPrintExpectedAndActualStrings(expected, actual); 1006 1.1 christos UnityAddMsgIfSpecified(msg); 1007 1.1 christos UNITY_FAIL_AND_BAIL; 1008 1.1 christos } 1009 1.1 christos } 1010 1.1 christos 1011 1.1 christos //----------------------------------------------- 1012 1.1 christos void UnityAssertEqualStringArray( const char** expected, 1013 1.1 christos const char** actual, 1014 1.1 christos const _UU32 num_elements, 1015 1.1 christos const char* msg, 1016 1.1 christos const UNITY_LINE_TYPE lineNumber) 1017 1.1 christos { 1018 1.1 christos _UU32 i, j = 0; 1019 1.1 christos 1020 1.1 christos UNITY_SKIP_EXECUTION; 1021 1.1 christos 1022 1.1 christos // if no elements, it's an error 1023 1.1 christos if (num_elements == 0) 1024 1.1 christos { 1025 1.1 christos UnityTestResultsFailBegin(lineNumber); 1026 1.1 christos UnityPrint(UnityStrPointless); 1027 1.1 christos UnityAddMsgIfSpecified(msg); 1028 1.1 christos UNITY_FAIL_AND_BAIL; 1029 1.1 christos } 1030 1.1 christos 1031 1.1 christos if (UnityCheckArraysForNull((UNITY_PTR_ATTRIBUTE void*)expected, (UNITY_PTR_ATTRIBUTE void*)actual, lineNumber, msg) == 1) 1032 1.1 christos return; 1033 1.1 christos 1034 1.1 christos do 1035 1.1 christos { 1036 1.1 christos // if both pointers not null compare the strings 1037 1.1 christos if (expected[j] && actual[j]) 1038 1.1 christos { 1039 1.1 christos for (i = 0; expected[j][i] || actual[j][i]; i++) 1040 1.1 christos { 1041 1.1 christos if (expected[j][i] != actual[j][i]) 1042 1.1 christos { 1043 1.1 christos Unity.CurrentTestFailed = 1; 1044 1.1 christos break; 1045 1.1 christos } 1046 1.1 christos } 1047 1.1 christos } 1048 1.1 christos else 1049 1.1 christos { // handle case of one pointers being null (if both null, test should pass) 1050 1.1 christos if (expected[j] != actual[j]) 1051 1.1 christos { 1052 1.1 christos Unity.CurrentTestFailed = 1; 1053 1.1 christos } 1054 1.1 christos } 1055 1.1 christos 1056 1.1 christos if (Unity.CurrentTestFailed) 1057 1.1 christos { 1058 1.1 christos UnityTestResultsFailBegin(lineNumber); 1059 1.1 christos if (num_elements > 1) 1060 1.1 christos { 1061 1.1 christos UnityPrint(UnityStrElement); 1062 1.1 christos UnityPrintNumberByStyle((j), UNITY_DISPLAY_STYLE_UINT); 1063 1.1 christos } 1064 1.1 christos UnityPrintExpectedAndActualStrings((const char*)(expected[j]), (const char*)(actual[j])); 1065 1.1 christos UnityAddMsgIfSpecified(msg); 1066 1.1 christos UNITY_FAIL_AND_BAIL; 1067 1.1 christos } 1068 1.1 christos } while (++j < num_elements); 1069 1.1 christos } 1070 1.1 christos 1071 1.1 christos //----------------------------------------------- 1072 1.1 christos void UnityAssertEqualMemory( UNITY_PTR_ATTRIBUTE const void* expected, 1073 1.1 christos UNITY_PTR_ATTRIBUTE const void* actual, 1074 1.1 christos const _UU32 length, 1075 1.1 christos const _UU32 num_elements, 1076 1.1 christos const char* msg, 1077 1.1 christos const UNITY_LINE_TYPE lineNumber) 1078 1.1 christos { 1079 1.1 christos UNITY_PTR_ATTRIBUTE const unsigned char* ptr_exp = (UNITY_PTR_ATTRIBUTE const unsigned char*)expected; 1080 1.1 christos UNITY_PTR_ATTRIBUTE const unsigned char* ptr_act = (UNITY_PTR_ATTRIBUTE const unsigned char*)actual; 1081 1.1 christos _UU32 elements = num_elements; 1082 1.1 christos _UU32 bytes; 1083 1.1 christos 1084 1.1 christos UNITY_SKIP_EXECUTION; 1085 1.1 christos 1086 1.1 christos if ((elements == 0) || (length == 0)) 1087 1.1 christos { 1088 1.1 christos UnityTestResultsFailBegin(lineNumber); 1089 1.1 christos UnityPrint(UnityStrPointless); 1090 1.1 christos UnityAddMsgIfSpecified(msg); 1091 1.1 christos UNITY_FAIL_AND_BAIL; 1092 1.1 christos } 1093 1.1 christos 1094 1.1 christos if (UnityCheckArraysForNull((UNITY_PTR_ATTRIBUTE const void*)expected, (UNITY_PTR_ATTRIBUTE const void*)actual, lineNumber, msg) == 1) 1095 1.1 christos return; 1096 1.1 christos 1097 1.1 christos while (elements--) 1098 1.1 christos { 1099 1.1 christos ///////////////////////////////////// 1100 1.1 christos bytes = length; 1101 1.1 christos while (bytes--) 1102 1.1 christos { 1103 1.1 christos if (*ptr_exp != *ptr_act) 1104 1.1 christos { 1105 1.1 christos UnityTestResultsFailBegin(lineNumber); 1106 1.1 christos UnityPrint(UnityStrMemory); 1107 1.1 christos if (num_elements > 1) 1108 1.1 christos { 1109 1.1 christos UnityPrint(UnityStrElement); 1110 1.1 christos UnityPrintNumberByStyle((num_elements - elements - 1), UNITY_DISPLAY_STYLE_UINT); 1111 1.1 christos } 1112 1.1 christos UnityPrint(UnityStrByte); 1113 1.1 christos UnityPrintNumberByStyle((length - bytes - 1), UNITY_DISPLAY_STYLE_UINT); 1114 1.1 christos UnityPrint(UnityStrExpected); 1115 1.1 christos UnityPrintNumberByStyle(*ptr_exp, UNITY_DISPLAY_STYLE_HEX8); 1116 1.1 christos UnityPrint(UnityStrWas); 1117 1.1 christos UnityPrintNumberByStyle(*ptr_act, UNITY_DISPLAY_STYLE_HEX8); 1118 1.1 christos UnityAddMsgIfSpecified(msg); 1119 1.1 christos UNITY_FAIL_AND_BAIL; 1120 1.1 christos } 1121 1.1 christos ptr_exp += 1; 1122 1.1 christos ptr_act += 1; 1123 1.1 christos } 1124 1.1 christos ///////////////////////////////////// 1125 1.1 christos 1126 1.1 christos } 1127 1.1 christos } 1128 1.1 christos 1129 1.1 christos //----------------------------------------------- 1130 1.1 christos // Control Functions 1131 1.1 christos //----------------------------------------------- 1132 1.1 christos 1133 1.1 christos void UnityFail(const char* msg, const UNITY_LINE_TYPE line) 1134 1.1 christos { 1135 1.1 christos UNITY_SKIP_EXECUTION; 1136 1.1 christos 1137 1.1 christos UnityTestResultsBegin(Unity.TestFile, line); 1138 1.1 christos UnityPrintFail(); 1139 1.1 christos if (msg != NULL) 1140 1.1 christos { 1141 1.1 christos UNITY_OUTPUT_CHAR(':'); 1142 1.1 christos if (msg[0] != ' ') 1143 1.1 christos { 1144 1.1 christos UNITY_OUTPUT_CHAR(' '); 1145 1.1 christos } 1146 1.1 christos UnityPrint(msg); 1147 1.1 christos } 1148 1.1 christos UNITY_FAIL_AND_BAIL; 1149 1.1 christos } 1150 1.1 christos 1151 1.1 christos //----------------------------------------------- 1152 1.1 christos void UnityIgnore(const char* msg, const UNITY_LINE_TYPE line) 1153 1.1 christos { 1154 1.1 christos UNITY_SKIP_EXECUTION; 1155 1.1 christos 1156 1.1 christos UnityTestResultsBegin(Unity.TestFile, line); 1157 1.1 christos UnityPrint(UnityStrIgnore); 1158 1.1 christos if (msg != NULL) 1159 1.1 christos { 1160 1.1 christos UNITY_OUTPUT_CHAR(':'); 1161 1.1 christos UNITY_OUTPUT_CHAR(' '); 1162 1.1 christos UnityPrint(msg); 1163 1.1 christos } 1164 1.1 christos UNITY_IGNORE_AND_BAIL; 1165 1.1 christos } 1166 1.1 christos 1167 1.1 christos //---------------------------------------------- 1168 1.1 christos 1169 1.1 christos void UnityExpectFail(){ 1170 1.1 christos 1171 1.1 christos Unity.isExpectingFail = 1; 1172 1.1 christos 1173 1.1 christos } 1174 1.1 christos 1175 1.1 christos void UnityExpectFailMessage(const char* msg, const UNITY_LINE_TYPE line ){ 1176 1.1 christos 1177 1.1 christos Unity.isExpectingFail = 1; 1178 1.1 christos if (msg != NULL) 1179 1.1 christos { 1180 1.1 christos Unity.XFAILMessage = msg; 1181 1.1 christos } 1182 1.1 christos } 1183 1.1 christos 1184 1.1 christos //----------------------------------------------- 1185 1.1 christos #if defined(UNITY_WEAK_ATTRIBUTE) 1186 1.1 christos void setUp(void); 1187 1.1 christos void tearDown(void); 1188 1.1 christos UNITY_WEAK_ATTRIBUTE void setUp(void) { } 1189 1.1 christos UNITY_WEAK_ATTRIBUTE void tearDown(void) { } 1190 1.1 christos #elif defined(UNITY_WEAK_PRAGMA) 1191 1.1 christos # pragma weak setUp 1192 1.1 christos void setUp(void); 1193 1.1 christos # pragma weak tearDown 1194 1.1 christos void tearDown(void); 1195 1.1 christos #else 1196 1.1 christos void setUp(void); 1197 1.1 christos void tearDown(void); 1198 1.1 christos #endif 1199 1.1 christos 1200 1.1 christos //----------------------------------------------- 1201 1.1 christos void UnityDefaultTestRun(UnityTestFunction Func, const char* FuncName, const int FuncLineNum) 1202 1.1 christos { 1203 1.1 christos Unity.CurrentTestName = FuncName; 1204 1.1 christos Unity.CurrentTestLineNumber = (UNITY_LINE_TYPE)FuncLineNum; 1205 1.1 christos Unity.NumberOfTests++; 1206 1.1 christos 1207 1.1 christos if (TEST_PROTECT()) 1208 1.1 christos { 1209 1.1 christos setUp(); 1210 1.1 christos Func(); 1211 1.1 christos } 1212 1.1 christos if (TEST_PROTECT() && !(Unity.CurrentTestIgnored)) 1213 1.1 christos { 1214 1.1 christos tearDown(); 1215 1.1 christos } 1216 1.1 christos 1217 1.1 christos UnityConcludeTest(); 1218 1.1 christos } 1219 1.1 christos 1220 1.1 christos 1221 1.1 christos //----------------------------------------------- 1222 1.1 christos void UnityBegin(const char* filename) 1223 1.1 christos { 1224 1.1 christos Unity.TestFile = filename; 1225 1.1 christos Unity.CurrentTestName = NULL; 1226 1.1 christos Unity.CurrentTestLineNumber = 0; 1227 1.1 christos Unity.NumberOfTests = 0; 1228 1.1 christos Unity.TestFailures = 0; 1229 1.1 christos Unity.TestIgnores = 0; 1230 1.1 christos Unity.CurrentTestFailed = 0; 1231 1.1 christos Unity.CurrentTestIgnored = 0; 1232 1.1 christos Unity.TestXFAILS = 0; 1233 1.1 christos Unity.isExpectingFail = 0; 1234 1.1 christos Unity.TestPasses = 0; 1235 1.1 christos Unity.TestXPASSES = 0; 1236 1.1 christos Unity.XFAILMessage = NULL; 1237 1.1 christos 1238 1.1 christos UNITY_OUTPUT_START(); 1239 1.1 christos } 1240 1.1 christos 1241 1.1 christos 1242 1.1 christos //----------------------------------------------- 1243 1.1 christos int UnityEnd(void) 1244 1.1 christos { 1245 1.1 christos UNITY_PRINT_EOL; 1246 1.1 christos UnityPrint(UnityStrBreaker); 1247 1.1 christos UNITY_PRINT_EOL; 1248 1.1 christos UnityPrintNumber((_U_SINT)(Unity.NumberOfTests)); 1249 1.1 christos UnityPrint(UnityStrResultsTests); 1250 1.1 christos UNITY_PRINT_EOL; 1251 1.1 christos UnityPrintNumber((_U_SINT)(Unity.TestPasses)); 1252 1.1 christos UnityPrint(UnityStrResultsPass); 1253 1.1 christos UNITY_PRINT_EOL; 1254 1.1 christos UnityPrintNumber((_U_SINT)(Unity.TestXFAILS)); 1255 1.1 christos UnityPrint(UnityStrResultsXFAIL); 1256 1.1 christos UNITY_PRINT_EOL; 1257 1.1 christos UnityPrintNumber((_U_SINT)(Unity.TestFailures)); 1258 1.1 christos UnityPrint(UnityStrResultsFailures); 1259 1.1 christos UNITY_PRINT_EOL; 1260 1.1 christos UnityPrintNumber((_U_SINT)(Unity.TestXPASSES)); 1261 1.1 christos UnityPrint(UnityStrResultsXPASS); 1262 1.1 christos UNITY_PRINT_EOL; 1263 1.1 christos UnityPrintNumber((_U_SINT)(Unity.TestIgnores)); 1264 1.1 christos UnityPrint(UnityStrResultsIgnored); 1265 1.1 christos UNITY_PRINT_EOL; 1266 1.1 christos 1267 1.1 christos UNITY_PRINT_EOL; 1268 1.1 christos if (Unity.TestFailures == 0U && Unity.TestXPASSES == 0U) 1269 1.1 christos { 1270 1.1 christos UnityPrintOk(); 1271 1.1 christos } 1272 1.1 christos else 1273 1.1 christos { 1274 1.1 christos UnityPrintFail(); 1275 1.1 christos } 1276 1.1 christos UNITY_PRINT_EOL; 1277 1.1 christos UNITY_OUTPUT_COMPLETE(); 1278 1.1 christos return (int)(Unity.TestFailures); 1279 1.1 christos } 1280 1.1 christos 1281 1.1 christos 1282 1.1 christos //----------------------------------------------- 1283