1*eabc0478Schristos /* $NetBSD: strtolfp.c,v 1.3 2024/08/18 20:47:27 christos Exp $ */ 2067f5680Schristos 3f17b710fSchristos #include "config.h" 4f17b710fSchristos 5f17b710fSchristos #include "ntp_stdlib.h" 6f17b710fSchristos #include "ntp_calendar.h" 7f17b710fSchristos 8f17b710fSchristos #include "unity.h" 9f17b710fSchristos #include "lfptest.h" 10f17b710fSchristos 11f17b710fSchristos /* This file tests both atolfp and mstolfp */ 12f17b710fSchristos 134c290c01Schristos void setUp(void); 14a6f3f22fSchristos void test_PositiveInteger(void); 15a6f3f22fSchristos void test_NegativeInteger(void); 16a6f3f22fSchristos void test_PositiveFraction(void); 17a6f3f22fSchristos void test_NegativeFraction(void); 18a6f3f22fSchristos void test_PositiveMsFraction(void); 19a6f3f22fSchristos void test_NegativeMsFraction(void); 20a6f3f22fSchristos void test_InvalidChars(void); 21a6f3f22fSchristos 22a6f3f22fSchristos 234c290c01Schristos void 244c290c01Schristos setUp(void) 254c290c01Schristos { 264c290c01Schristos init_lib(); 274c290c01Schristos 284c290c01Schristos return; 294c290c01Schristos } 304c290c01Schristos 31*eabc0478Schristos static const char* fmtLFP(const l_fp *e, const l_fp *a) 32*eabc0478Schristos { 33*eabc0478Schristos static char buf[100]; 34*eabc0478Schristos snprintf(buf, sizeof(buf), "e=$%08x.%08x, a=$%08x.%08x", 35*eabc0478Schristos e->l_ui, e->l_uf, a->l_ui, a->l_uf); 36*eabc0478Schristos return buf; 37*eabc0478Schristos } 384c290c01Schristos 39f17b710fSchristos void test_PositiveInteger(void) { 40f17b710fSchristos const char *str = "500"; 41f17b710fSchristos const char *str_ms = "500000"; 42f17b710fSchristos 43a6f3f22fSchristos l_fp expected = {{500},0}; 44f17b710fSchristos l_fp actual, actual_ms; 45f17b710fSchristos 46f17b710fSchristos TEST_ASSERT_TRUE(atolfp(str, &actual)); 47f17b710fSchristos TEST_ASSERT_TRUE(mstolfp(str_ms, &actual_ms)); 48f17b710fSchristos 49*eabc0478Schristos TEST_ASSERT_TRUE_MESSAGE(IsEqual(expected, actual), fmtLFP(&expected, &actual)); 50*eabc0478Schristos TEST_ASSERT_TRUE_MESSAGE(IsEqual(expected, actual_ms), fmtLFP(&expected, &actual_ms)); 51f17b710fSchristos } 52f17b710fSchristos 53f17b710fSchristos void test_NegativeInteger(void) { 54f17b710fSchristos const char *str = "-300"; 55f17b710fSchristos const char *str_ms = "-300000"; 56f17b710fSchristos 57f17b710fSchristos l_fp expected; 58f17b710fSchristos expected.l_i = -300; 59f17b710fSchristos expected.l_uf = 0; 60f17b710fSchristos 61f17b710fSchristos l_fp actual, actual_ms; 62f17b710fSchristos 63f17b710fSchristos TEST_ASSERT_TRUE(atolfp(str, &actual)); 64f17b710fSchristos TEST_ASSERT_TRUE(mstolfp(str_ms, &actual_ms)); 65f17b710fSchristos 66*eabc0478Schristos TEST_ASSERT_TRUE_MESSAGE(IsEqual(expected, actual), fmtLFP(&expected, &actual)); 67*eabc0478Schristos TEST_ASSERT_TRUE_MESSAGE(IsEqual(expected, actual_ms), fmtLFP(&expected, &actual_ms)); 68f17b710fSchristos } 69f17b710fSchristos 70f17b710fSchristos void test_PositiveFraction(void) { 71f17b710fSchristos const char *str = "+500.5"; 72f17b710fSchristos const char *str_ms = "500500.0"; 73f17b710fSchristos 74a6f3f22fSchristos l_fp expected = {{500}, HALF}; 75f17b710fSchristos l_fp actual, actual_ms; 76f17b710fSchristos 77f17b710fSchristos TEST_ASSERT_TRUE(atolfp(str, &actual)); 78f17b710fSchristos TEST_ASSERT_TRUE(mstolfp(str_ms, &actual_ms)); 79f17b710fSchristos 80*eabc0478Schristos TEST_ASSERT_TRUE_MESSAGE(IsEqual(expected, actual), fmtLFP(&expected, &actual)); 81*eabc0478Schristos TEST_ASSERT_TRUE_MESSAGE(IsEqual(expected, actual_ms), fmtLFP(&expected, &actual_ms)); 82f17b710fSchristos } 83f17b710fSchristos 84f17b710fSchristos void test_NegativeFraction(void) { 85f17b710fSchristos const char *str = "-300.75"; 86f17b710fSchristos const char *str_ms = "-300750"; 87f17b710fSchristos 88f17b710fSchristos l_fp expected; 89f17b710fSchristos expected.l_i = -301; 90f17b710fSchristos expected.l_uf = QUARTER; 91f17b710fSchristos 92f17b710fSchristos l_fp actual, actual_ms; 93f17b710fSchristos 94f17b710fSchristos TEST_ASSERT_TRUE(atolfp(str, &actual)); 95f17b710fSchristos TEST_ASSERT_TRUE(mstolfp(str_ms, &actual_ms)); 96f17b710fSchristos 97*eabc0478Schristos TEST_ASSERT_TRUE_MESSAGE(IsEqual(expected, actual), fmtLFP(&expected, &actual)); 98*eabc0478Schristos TEST_ASSERT_TRUE_MESSAGE(IsEqual(expected, actual_ms), fmtLFP(&expected, &actual_ms)); 99f17b710fSchristos } 100f17b710fSchristos 101f17b710fSchristos void test_PositiveMsFraction(void) { 102f17b710fSchristos const char *str = "300.00025"; 103f17b710fSchristos const char *str_ms = "300000.25"; 104f17b710fSchristos 105a6f3f22fSchristos l_fp expected = {{300}, QUARTER_PROMILLE_APPRX}; 106f17b710fSchristos l_fp actual, actual_ms; 107f17b710fSchristos 108f17b710fSchristos 109f17b710fSchristos TEST_ASSERT_TRUE(atolfp(str, &actual)); 110f17b710fSchristos TEST_ASSERT_TRUE(mstolfp(str_ms, &actual_ms)); 111f17b710fSchristos 112*eabc0478Schristos TEST_ASSERT_TRUE_MESSAGE(IsEqual(expected, actual), fmtLFP(&expected, &actual)); 113*eabc0478Schristos TEST_ASSERT_TRUE_MESSAGE(IsEqual(expected, actual_ms), fmtLFP(&expected, &actual_ms)); 114f17b710fSchristos } 115f17b710fSchristos 116f17b710fSchristos void test_NegativeMsFraction(void) { 117f17b710fSchristos const char *str = "-199.99975"; 118f17b710fSchristos const char *str_ms = "-199999.75"; 119f17b710fSchristos 120f17b710fSchristos l_fp expected; 121f17b710fSchristos expected.l_i = -200; 122f17b710fSchristos expected.l_uf = QUARTER_PROMILLE_APPRX; 123f17b710fSchristos 124f17b710fSchristos l_fp actual, actual_ms; 125f17b710fSchristos 126f17b710fSchristos TEST_ASSERT_TRUE(atolfp(str, &actual)); 127f17b710fSchristos TEST_ASSERT_TRUE(mstolfp(str_ms, &actual_ms)); 128f17b710fSchristos 129*eabc0478Schristos TEST_ASSERT_TRUE_MESSAGE(IsEqual(expected, actual), fmtLFP(&expected, &actual)); 130*eabc0478Schristos TEST_ASSERT_TRUE_MESSAGE(IsEqual(expected, actual_ms), fmtLFP(&expected, &actual_ms)); 131f17b710fSchristos } 132f17b710fSchristos 133f17b710fSchristos void test_InvalidChars(void) { 134f17b710fSchristos const char *str = "500.4a2"; 135f17b710fSchristos l_fp actual, actual_ms; 136f17b710fSchristos 137f17b710fSchristos TEST_ASSERT_FALSE(atolfp(str, &actual)); 138f17b710fSchristos TEST_ASSERT_FALSE(mstolfp(str, &actual_ms)); 139f17b710fSchristos } 140f17b710fSchristos 141