1 /* ==========================================
2 Unity Project - A Test Framework for C
3 Copyright (c) 2007 Mike Karlesky, Mark VanderVoord, Greg Williams
4 [Released under MIT License. Please refer to license.txt for details]
5 ========================================== */
9 #include "self_assessment_utils.h"
11 static int SetToOneToFailInTearDown;
12 static int SetToOneMeanWeAlreadyCheckedThisGuy;
16 SetToOneToFailInTearDown = 0;
17 SetToOneMeanWeAlreadyCheckedThisGuy = 0;
22 endPutcharSpy(); /* Stop suppressing test output */
23 if (SetToOneToFailInTearDown == 1)
25 /* These will be skipped internally if already failed/ignored */
26 TEST_FAIL_MESSAGE("<= Failed in tearDown");
27 TEST_IGNORE_MESSAGE("<= Ignored in tearDown");
29 if ((SetToOneMeanWeAlreadyCheckedThisGuy == 0) && (Unity.CurrentTestFailed > 0))
31 UnityPrint(": [[[[ Test Should Have Passed But Did Not ]]]]");
32 UNITY_OUTPUT_CHAR('\n');
36 void testFloatsWithinDelta(void)
38 #ifdef UNITY_EXCLUDE_FLOAT
41 TEST_ASSERT_FLOAT_WITHIN(0.00003f, 187245.03485f, 187245.03488f);
42 TEST_ASSERT_FLOAT_WITHIN(1.0f, 187245.0f, 187246.0f);
43 TEST_ASSERT_FLOAT_WITHIN(0.05f, 9273.2549f, 9273.2049f);
44 TEST_ASSERT_FLOAT_WITHIN(0.007f, -726.93724f, -726.94424f);
48 void testFloatsNotWithinDelta(void)
50 #ifdef UNITY_EXCLUDE_FLOAT
54 TEST_ASSERT_FLOAT_WITHIN(0.05f, 9273.2649f, 9273.2049f);
59 void testFloatsEqual(void)
61 #ifdef UNITY_EXCLUDE_FLOAT
64 TEST_ASSERT_EQUAL_FLOAT(187245.0f, 187246.0f);
65 TEST_ASSERT_EQUAL_FLOAT(18724.5f, 18724.6f);
66 TEST_ASSERT_EQUAL_FLOAT(9273.2549f, 9273.2599f);
67 TEST_ASSERT_EQUAL_FLOAT(-726.93724f, -726.9374f);
71 void testFloatsNotEqual(void)
73 #ifdef UNITY_EXCLUDE_FLOAT
77 TEST_ASSERT_EQUAL_FLOAT(9273.9649f, 9273.0049f);
82 void testFloatsNotEqualNegative1(void)
84 #ifdef UNITY_EXCLUDE_FLOAT
88 TEST_ASSERT_EQUAL_FLOAT(-9273.9649f, -9273.0049f);
93 void testFloatsNotEqualNegative2(void)
95 #ifdef UNITY_EXCLUDE_FLOAT
99 TEST_ASSERT_EQUAL_FLOAT(-9273.0049f, -9273.9649f);
104 void testFloatsNotEqualActualNaN(void)
106 #ifdef UNITY_EXCLUDE_FLOAT
110 TEST_ASSERT_EQUAL_FLOAT(85.963f, 0.0f / f_zero);
115 void testFloatsNotEqualExpectedNaN(void)
117 #ifdef UNITY_EXCLUDE_FLOAT
121 TEST_ASSERT_EQUAL_FLOAT(0.0f / f_zero, 85.963f);
126 void testFloatsEqualBothNaN(void)
128 #ifdef UNITY_EXCLUDE_FLOAT
131 TEST_ASSERT_EQUAL_FLOAT(0.0f / f_zero, 0.0f / f_zero);
135 void testFloatsNotEqualInfNaN(void)
137 #ifdef UNITY_EXCLUDE_FLOAT
141 TEST_ASSERT_EQUAL_FLOAT(1.0f / f_zero, 0.0f / f_zero);
146 void testFloatsNotEqualNaNInf(void)
148 #ifdef UNITY_EXCLUDE_FLOAT
152 TEST_ASSERT_EQUAL_FLOAT(0.0f / f_zero, 1.0f / f_zero);
157 void testFloatsNotEqualActualInf(void)
159 #ifdef UNITY_EXCLUDE_FLOAT
163 TEST_ASSERT_EQUAL_FLOAT(321.642f, 1.0f / f_zero);
168 void testFloatsNotEqualExpectedInf(void)
170 #ifdef UNITY_EXCLUDE_FLOAT
174 TEST_ASSERT_EQUAL_FLOAT(1.0f / f_zero, 321.642f);
179 void testFloatsEqualBothInf(void)
181 #ifdef UNITY_EXCLUDE_FLOAT
184 TEST_ASSERT_EQUAL_FLOAT(1.0f / f_zero, 1.0f / f_zero);
188 void testFloatsNotEqualPlusMinusInf(void)
190 #ifdef UNITY_EXCLUDE_FLOAT
194 TEST_ASSERT_EQUAL_FLOAT(1.0f / f_zero, -1.0f / f_zero);
199 void testFloatIsPosInf1(void)
201 #ifdef UNITY_EXCLUDE_FLOAT
204 TEST_ASSERT_FLOAT_IS_INF(2.0f / f_zero);
208 void testFloatIsPosInf2(void)
210 #ifdef UNITY_EXCLUDE_FLOAT
214 TEST_ASSERT_FLOAT_IS_NOT_INF(2.0f / f_zero);
219 void testFloatIsNegInf1(void)
221 #ifdef UNITY_EXCLUDE_FLOAT
224 TEST_ASSERT_FLOAT_IS_NEG_INF(-3.0f / f_zero);
228 void testFloatIsNegInf2(void)
230 #ifdef UNITY_EXCLUDE_FLOAT
234 TEST_ASSERT_FLOAT_IS_NOT_NEG_INF(-3.0f / f_zero);
239 void testFloatIsNotPosInf1(void)
241 #ifdef UNITY_EXCLUDE_FLOAT
245 TEST_ASSERT_FLOAT_IS_INF(2.0f);
250 void testFloatIsNotPosInf2(void)
252 #ifdef UNITY_EXCLUDE_FLOAT
255 TEST_ASSERT_FLOAT_IS_NOT_INF(2.0f);
259 void testFloatIsNotNegInf(void)
261 #ifdef UNITY_EXCLUDE_FLOAT
265 TEST_ASSERT_FLOAT_IS_NEG_INF(-999.876f);
270 void testFloatIsNan1(void)
272 #ifdef UNITY_EXCLUDE_FLOAT
275 TEST_ASSERT_FLOAT_IS_NAN(0.0f / f_zero);
279 void testFloatIsNan2(void)
281 #ifdef UNITY_EXCLUDE_FLOAT
285 TEST_ASSERT_FLOAT_IS_NOT_NAN(0.0f / f_zero);
290 void testFloatIsNotNan1(void)
292 #ifdef UNITY_EXCLUDE_FLOAT
296 TEST_ASSERT_FLOAT_IS_NAN(234.9f);
301 void testFloatIsNotNan2(void)
303 #ifdef UNITY_EXCLUDE_FLOAT
306 TEST_ASSERT_FLOAT_IS_NOT_NAN(234.9f);
310 void testFloatInfIsNotNan(void)
312 #ifdef UNITY_EXCLUDE_FLOAT
316 TEST_ASSERT_FLOAT_IS_NAN(1.0f / f_zero);
321 void testFloatNanIsNotInf(void)
323 #ifdef UNITY_EXCLUDE_FLOAT
327 TEST_ASSERT_FLOAT_IS_INF(0.0f / f_zero);
332 void testFloatIsDeterminate1(void)
334 #ifdef UNITY_EXCLUDE_FLOAT
337 TEST_ASSERT_FLOAT_IS_DETERMINATE(0.0f);
338 TEST_ASSERT_FLOAT_IS_DETERMINATE(123.3f);
339 TEST_ASSERT_FLOAT_IS_DETERMINATE(-88.3f);
343 void testFloatIsDeterminate2(void)
345 #ifdef UNITY_EXCLUDE_FLOAT
349 TEST_ASSERT_FLOAT_IS_NOT_DETERMINATE(-88.3f);
354 void testFloatIsNotDeterminate1(void)
356 #ifdef UNITY_EXCLUDE_FLOAT
359 TEST_ASSERT_FLOAT_IS_NOT_DETERMINATE(1.0f / f_zero);
360 TEST_ASSERT_FLOAT_IS_NOT_DETERMINATE(-1.0f / f_zero);
361 TEST_ASSERT_FLOAT_IS_NOT_DETERMINATE(0.0f / f_zero);
365 void testFloatIsNotDeterminate2(void)
367 #ifdef UNITY_EXCLUDE_FLOAT
371 TEST_ASSERT_FLOAT_IS_DETERMINATE(-1.0f / f_zero);
376 void testFloatTraitFailsOnInvalidTrait(void)
378 #ifdef UNITY_EXCLUDE_FLOAT
382 UnityAssertFloatSpecial(1.0f, NULL, __LINE__, UNITY_FLOAT_INVALID_TRAIT);
387 void testEqualFloatArrays(void)
389 #ifdef UNITY_EXCLUDE_FLOAT
392 float p0[] = {1.0f, -8.0f, 25.4f, -0.123f};
393 float p1[] = {1.0f, -8.0f, 25.4f, -0.123f};
394 float p2[] = {1.0f, -8.0f, 25.4f, -0.2f};
395 float p3[] = {1.0f, -23.0f, 25.0f, -0.26f};
397 TEST_ASSERT_EQUAL_FLOAT_ARRAY(p0, p0, 1);
398 TEST_ASSERT_EQUAL_FLOAT_ARRAY(p0, p0, 4);
399 TEST_ASSERT_EQUAL_FLOAT_ARRAY(p0, p1, 4);
400 TEST_ASSERT_EQUAL_FLOAT_ARRAY(p0, p2, 3);
401 TEST_ASSERT_EQUAL_FLOAT_ARRAY(p0, p3, 1);
402 TEST_ASSERT_EQUAL_FLOAT_ARRAY(NULL, NULL, 1);
406 void testNotEqualFloatArraysExpectedNull(void)
408 #ifdef UNITY_EXCLUDE_FLOAT
412 float p1[] = {1.0f, 8.0f, 25.4f, 0.252f};
415 TEST_ASSERT_EQUAL_FLOAT_ARRAY(p0, p1, 4);
420 void testNotEqualFloatArraysActualNull(void)
422 #ifdef UNITY_EXCLUDE_FLOAT
425 float p0[] = {1.0f, 8.0f, 25.4f, 0.253f};
429 TEST_ASSERT_EQUAL_FLOAT_ARRAY(p0, p1, 4);
434 void testNotEqualFloatArrays1(void)
436 #ifdef UNITY_EXCLUDE_FLOAT
439 float p0[] = {1.0f, 8.0f, 25.4f, 0.253f};
440 float p1[] = {1.0f, 8.0f, 25.4f, 0.252f};
443 TEST_ASSERT_EQUAL_FLOAT_ARRAY(p0, p1, 4);
448 void testNotEqualFloatArrays2(void)
450 #ifdef UNITY_EXCLUDE_FLOAT
453 float p0[] = {1.0f, 8.0f, 25.4f, 0.253f};
454 float p1[] = {2.0f, 8.0f, 25.4f, 0.253f};
457 TEST_ASSERT_EQUAL_FLOAT_ARRAY(p0, p1, 4);
462 void testNotEqualFloatArrays3(void)
464 #ifdef UNITY_EXCLUDE_FLOAT
467 float p0[] = {1.0f, 8.0f, 25.4f, 0.253f};
468 float p1[] = {1.0f, 8.0f, 25.5f, 0.253f};
471 TEST_ASSERT_EQUAL_FLOAT_ARRAY(p0, p1, 4);
476 void testNotEqualFloatArraysNegative1(void)
478 #ifdef UNITY_EXCLUDE_FLOAT
481 float p0[] = {-1.0f, -8.0f, -25.4f, -0.253f};
482 float p1[] = {-1.0f, -8.0f, -25.4f, -0.252f};
485 TEST_ASSERT_EQUAL_FLOAT_ARRAY(p0, p1, 4);
490 void testNotEqualFloatArraysNegative2(void)
492 #ifdef UNITY_EXCLUDE_FLOAT
495 float p0[] = {-1.0f, -8.0f, -25.4f, -0.253f};
496 float p1[] = {-2.0f, -8.0f, -25.4f, -0.253f};
499 TEST_ASSERT_EQUAL_FLOAT_ARRAY(p0, p1, 4);
504 void testNotEqualFloatArraysNegative3(void)
506 #ifdef UNITY_EXCLUDE_FLOAT
509 float p0[] = {-1.0f, -8.0f, -25.4f, -0.253f};
510 float p1[] = {-1.0f, -8.0f, -25.5f, -0.253f};
513 TEST_ASSERT_EQUAL_FLOAT_ARRAY(p0, p1, 4);
518 void testEqualFloatArraysNaN(void)
520 #ifdef UNITY_EXCLUDE_FLOAT
523 float p0[] = {1.0f, 0.0f / f_zero, 25.4f, 0.253f};
524 float p1[] = {1.0f, 0.0f / f_zero, 25.4f, 0.253f};
526 TEST_ASSERT_EQUAL_FLOAT_ARRAY(p0, p1, 4);
530 void testEqualFloatArraysInf(void)
532 #ifdef UNITY_EXCLUDE_FLOAT
535 float p0[] = {1.0f, 1.0f / f_zero, 25.4f, 0.253f};
536 float p1[] = {1.0f, 1.0f / f_zero, 25.4f, 0.253f};
538 TEST_ASSERT_EQUAL_FLOAT_ARRAY(p0, p1, 4);
542 void testNotEqualFloatArraysLengthZero(void)
544 #ifdef UNITY_EXCLUDE_FLOAT
547 float p0[1] = {0.0f};
548 float p1[1] = {0.0f};
551 TEST_ASSERT_EQUAL_FLOAT_ARRAY(p0, p1, 0);
556 void testEqualFloatEachEqual(void)
558 #ifdef UNITY_EXCLUDE_FLOAT
561 float p0[] = {1.0f, 1.0f, 1.0f, 1.0f};
562 float p1[] = {-0.123f, -0.123f, -0.123f, -0.123f};
563 float p2[] = {25.4f, 25.4f, 25.4f, -0.2f};
564 float p3[] = {1.0f, -23.0f, 25.0f, -0.26f};
566 TEST_ASSERT_EACH_EQUAL_FLOAT(1.0f, p0, 1);
567 TEST_ASSERT_EACH_EQUAL_FLOAT(1.0f, p0, 4);
568 TEST_ASSERT_EACH_EQUAL_FLOAT(-0.123f, p1, 4);
569 TEST_ASSERT_EACH_EQUAL_FLOAT(25.4f, p2, 3);
570 TEST_ASSERT_EACH_EQUAL_FLOAT(1.0f, p3, 1);
574 void testNotEqualFloatEachEqualActualNull(void)
576 #ifdef UNITY_EXCLUDE_FLOAT
582 TEST_ASSERT_EACH_EQUAL_FLOAT(5, p0, 4);
587 void testNotEqualFloatEachEqual1(void)
589 #ifdef UNITY_EXCLUDE_FLOAT
592 float p0[] = {0.253f, 8.0f, 0.253f, 0.253f};
595 TEST_ASSERT_EACH_EQUAL_FLOAT(0.253f, p0, 4);
600 void testNotEqualFloatEachEqual2(void)
602 #ifdef UNITY_EXCLUDE_FLOAT
605 float p0[] = {8.0f, 8.0f, 8.0f, 0.253f};
608 TEST_ASSERT_EACH_EQUAL_FLOAT(8.0f, p0, 4);
613 void testNotEqualFloatEachEqual3(void)
615 #ifdef UNITY_EXCLUDE_FLOAT
618 float p0[] = {1.0f, 1.0f, 1.0f, 0.253f};
621 TEST_ASSERT_EACH_EQUAL_FLOAT(1.0f, p0, 4);
626 void testNotEqualFloatEachEqualNegative1(void)
628 #ifdef UNITY_EXCLUDE_FLOAT
631 float p0[] = {-1.0f, -0.253f, -0.253f, -0.253f};
634 TEST_ASSERT_EACH_EQUAL_FLOAT(-0.253f, p0, 4);
639 void testNotEqualFloatEachEqualNegative2(void)
641 #ifdef UNITY_EXCLUDE_FLOAT
644 float p0[] = {-25.4f, -8.0f, -25.4f, -25.4f};
647 TEST_ASSERT_EACH_EQUAL_FLOAT(-25.4f, p0, 4);
652 void testNotEqualFloatEachEqualNegative3(void)
654 #ifdef UNITY_EXCLUDE_FLOAT
657 float p0[] = {-8.0f, -8.0f, -8.0f, -0.253f};
660 TEST_ASSERT_EACH_EQUAL_FLOAT(-8.0f, p0, 4);
665 void testEqualFloatEachEqualNaN(void)
667 #ifdef UNITY_EXCLUDE_FLOAT
670 float p0[] = {0.0f / f_zero, 0.0f / f_zero, 0.0f / f_zero, 0.0f / f_zero};
672 TEST_ASSERT_EACH_EQUAL_FLOAT(0.0f / f_zero, p0, 4);
676 void testEqualFloatEachEqualInf(void)
678 #ifdef UNITY_EXCLUDE_FLOAT
681 float p0[] = {1.0f / f_zero, 1.0f / f_zero, 25.4f, 0.253f};
683 TEST_ASSERT_EACH_EQUAL_FLOAT(1.0f / f_zero, p0, 2);
687 void testNotEqualFloatEachEqualLengthZero(void)
689 #ifdef UNITY_EXCLUDE_FLOAT
692 float p0[1] = {0.0f};
695 TEST_ASSERT_EACH_EQUAL_FLOAT(0.0f, p0, 0);
700 void testFloatPrinting(void)
702 #if defined(UNITY_EXCLUDE_FLOAT_PRINT) || defined(UNITY_INCLUDE_DOUBLE) || !defined(USING_OUTPUT_SPY)
705 TEST_ASSERT_EQUAL_PRINT_FLOATING("0", 0.0f);
706 TEST_ASSERT_EQUAL_PRINT_FLOATING("4.99e-07", 0.000000499f);
707 TEST_ASSERT_EQUAL_PRINT_FLOATING("0.1004695", 0.100469499f);
708 TEST_ASSERT_EQUAL_PRINT_FLOATING("2", 1.9999995f); /*Rounding to int place*/
709 TEST_ASSERT_EQUAL_PRINT_FLOATING("1", 1.0f);
710 TEST_ASSERT_EQUAL_PRINT_FLOATING("1.25", 1.25f);
711 TEST_ASSERT_EQUAL_PRINT_FLOATING("7.999999", 7.999999f); /*Not rounding*/
712 TEST_ASSERT_EQUAL_PRINT_FLOATING("16.00002", 16.00002f);
713 TEST_ASSERT_EQUAL_PRINT_FLOATING("16.00004", 16.00004f);
714 TEST_ASSERT_EQUAL_PRINT_FLOATING("16.00006", 16.00006f);
715 TEST_ASSERT_EQUAL_PRINT_FLOATING("9999999", 9999999.0f); /*Last full print integer*/
717 TEST_ASSERT_EQUAL_PRINT_FLOATING("-0", -0.0f);
718 TEST_ASSERT_EQUAL_PRINT_FLOATING("-4.99e-07", -0.000000499f);
719 TEST_ASSERT_EQUAL_PRINT_FLOATING("-0.1004695", -0.100469499f);
720 TEST_ASSERT_EQUAL_PRINT_FLOATING("-2", -1.9999995f); /*Rounding to int place*/
721 TEST_ASSERT_EQUAL_PRINT_FLOATING("-1", -1.0f);
722 TEST_ASSERT_EQUAL_PRINT_FLOATING("-1.25", -1.25f);
723 TEST_ASSERT_EQUAL_PRINT_FLOATING("-7.999999", -7.999999f); /*Not rounding*/
724 TEST_ASSERT_EQUAL_PRINT_FLOATING("-16.00002", -16.00002f);
725 TEST_ASSERT_EQUAL_PRINT_FLOATING("-16.00004", -16.00004f);
726 TEST_ASSERT_EQUAL_PRINT_FLOATING("-16.00006", -16.00006f);
727 TEST_ASSERT_EQUAL_PRINT_FLOATING("-9999999", -9999999.0f); /*Last full print integer*/
729 /* Fails, prints "4.294968e+09" due to FP math imprecision
730 * TEST_ASSERT_EQUAL_PRINT_FLOATING("4.294967e+09", 4294967296.0f); */
731 TEST_ASSERT_EQUAL_PRINT_FLOATING("5e+09", 5000000000.0f);
732 TEST_ASSERT_EQUAL_PRINT_FLOATING("8e+09", 8.0e+09f);
733 TEST_ASSERT_EQUAL_PRINT_FLOATING("8.309999e+09", 8309999104.0f);
734 TEST_ASSERT_EQUAL_PRINT_FLOATING("1e+10", 1.0e+10f);
735 TEST_ASSERT_EQUAL_PRINT_FLOATING("1e+10", 10000000000.0f);
736 /* Some compilers have trouble with inexact float constants, a float cast works generally */
737 TEST_ASSERT_EQUAL_PRINT_FLOATING("1.000055e+10", (float)1.000055e+10f);
738 TEST_ASSERT_EQUAL_PRINT_FLOATING("1.1e+38", (float)1.10000005e+38f);
739 TEST_ASSERT_EQUAL_PRINT_FLOATING("1.635299e+10", 1.63529943e+10f);
740 /* Fails, prints "3.402824e+38" due to FP math imprecision
741 * TEST_ASSERT_EQUAL_PRINT_FLOATING("3.402823e+38", 3.40282346638e38f); */
743 TEST_ASSERT_EQUAL_PRINT_FLOATING("-1e+10", -1.0e+10f);
744 /* Fails, prints "-3.402824e+38" due to FP math imprecision
745 * TEST_ASSERT_EQUAL_PRINT_FLOATING("-3.402823e+38", -3.40282346638e38f); */
749 void testFloatPrintingRoundTiesToEven(void)
751 #if defined(UNITY_EXCLUDE_FLOAT_PRINT) || defined(UNITY_INCLUDE_DOUBLE) || !defined(USING_OUTPUT_SPY)
754 #ifdef UNITY_ROUND_TIES_AWAY_FROM_ZERO
755 TEST_ASSERT_EQUAL_PRINT_FLOATING("0.0004882813", 0.00048828125f);
756 TEST_ASSERT_EQUAL_PRINT_FLOATING("488281.3", 488281.25f);
757 TEST_ASSERT_EQUAL_PRINT_FLOATING("5.000001e-07", 0.00000050000005f);
758 TEST_ASSERT_EQUAL_PRINT_FLOATING("-5.000001e-07", -0.00000050000005f);
759 #else /* Default to Round ties to even */
760 TEST_ASSERT_EQUAL_PRINT_FLOATING("0.0004882812", 0.00048828125f);
761 TEST_ASSERT_EQUAL_PRINT_FLOATING("488281.2", 488281.25f);
762 TEST_ASSERT_EQUAL_PRINT_FLOATING("5e-07", 0.00000050000005f);
763 TEST_ASSERT_EQUAL_PRINT_FLOATING("-5e-07", -0.00000050000005f);
768 void testFloatPrintingInfinityAndNaN(void)
770 #if defined(UNITY_EXCLUDE_FLOAT_PRINT) || !defined(USING_OUTPUT_SPY)
773 TEST_ASSERT_EQUAL_PRINT_FLOATING("inf", 1.0f / f_zero);
774 TEST_ASSERT_EQUAL_PRINT_FLOATING("-inf", -1.0f / f_zero);
776 TEST_ASSERT_EQUAL_PRINT_FLOATING("nan", 0.0f / f_zero);
780 #if defined(UNITY_TEST_ALL_FLOATS_PRINT_OK) && defined(USING_OUTPUT_SPY)
781 #ifdef UNITY_INCLUDE_DOUBLE
782 static void printFloatValue(float f)
789 sprintf(expected, "%.9g", f);
790 /* We print all NaN's as "nan", not "-nan" */
791 if (strcmp(expected, "-nan") == 0) strcpy(expected, "nan");
793 if (strcmp(expected, getBufferPutcharSpy()))
795 /* Fail with diagnostic printing */
796 TEST_ASSERT_EQUAL_PRINT_FLOATING(expected, f);
800 static void printFloatValue(float f)
803 char expected_lower[18];
804 char expected_lower2[18];
805 char expected_lower3[18];
806 char expected_higher[18];
807 char expected_higher2[18];
808 char expected_higher3[18];
813 sprintf(expected, "%.7g", f);
814 /* We print all NaN's as "nan", not "-nan" */
815 if (strcmp(expected, "-nan") == 0) strcpy(expected, "nan");
817 strcpy(expected_lower, expected);
818 strcpy(expected_lower2, expected);
819 strcpy(expected_lower3, expected);
820 strcpy(expected_higher, expected);
821 strcpy(expected_higher2, expected);
822 strcpy(expected_higher3, expected);
824 /* Allow for rounding differences in the last digit */
825 double lower = (double)f * 0.99999995;
826 double higher = (double)f * 1.00000005;
828 if(isfinite(lower)) sprintf(expected_lower, "%.7g", lower);
829 if(isfinite(higher)) sprintf(expected_higher, "%.7g", higher);
831 /* Outside [1,10000000] allow for relative error of +/-2.5e-7 */
832 if (f < 1.0 || f > 10000000)
834 double lower2 = (double)f * 0.99999985;
835 double lower3 = (double)f * 0.99999975;
836 double higher2 = (double)f * 1.00000015;
837 double higher3 = (double)f * 1.00000025;
839 if (isfinite(lower2)) sprintf(expected_lower2, "%.7g", lower2);
840 if (isfinite(lower3)) sprintf(expected_lower3, "%.7g", lower3);
841 if (isfinite(higher2)) sprintf(expected_higher2, "%.7g", higher2);
842 if (isfinite(higher3)) sprintf(expected_higher3, "%.7g", higher3);
845 if (strcmp(expected, getBufferPutcharSpy()) != 0 &&
846 strcmp(expected_lower, getBufferPutcharSpy()) != 0 &&
847 strcmp(expected_lower2, getBufferPutcharSpy()) != 0 &&
848 strcmp(expected_lower3, getBufferPutcharSpy()) != 0 &&
849 strcmp(expected_higher, getBufferPutcharSpy()) != 0 &&
850 strcmp(expected_higher2, getBufferPutcharSpy()) != 0 &&
851 strcmp(expected_higher3, getBufferPutcharSpy()) != 0)
853 /* Fail with diagnostic printing */
854 TEST_ASSERT_EQUAL_PRINT_FLOATING(expected, f);
860 void testFloatPrintingRandomSamples(void)
862 #if !defined(UNITY_TEST_ALL_FLOATS_PRINT_OK) || !defined(USING_OUTPUT_SPY)
865 union { float f_value; uint32_t int_value; } u;
867 /* These values are not covered by the MINSTD generator */
868 u.int_value = 0x00000000; printFloatValue(u.f_value);
869 u.int_value = 0x80000000; printFloatValue(u.f_value);
870 u.int_value = 0x7fffffff; printFloatValue(u.f_value);
871 u.int_value = 0xffffffff; printFloatValue(u.f_value);
874 for(int num_tested = 0; num_tested < 1000000; num_tested++)
876 /* MINSTD pseudo-random number generator */
877 a = (uint32_t)(((uint64_t)a * 48271u) % 2147483647u);
879 /* MINSTD does not set the highest bit; test both possibilities */
880 u.int_value = a; printFloatValue(u.f_value);
881 u.int_value = a | 0x80000000; printFloatValue(u.f_value);