diff --git a/tests/unittests/tests-fmt/tests-fmt.c b/tests/unittests/tests-fmt/tests-fmt.c index c9d4b45d98..e707e8056f 100644 --- a/tests/unittests/tests-fmt/tests-fmt.c +++ b/tests/unittests/tests-fmt/tests-fmt.c @@ -931,6 +931,98 @@ static void test_fmt_lpad(void) TEST_ASSERT_EQUAL_STRING((char*)string, "xxxx3333"); } +static void test_fmt_time_iso8601(void) +{ + char out[20] = { 0 }; + const char *expected = "2025-04-08T17:40:02"; + + struct tm time = { + .tm_year = 2025 - 1900, + .tm_mon = 4 - 1, + .tm_mday = 8, + .tm_hour = 17, + .tm_min = 40, + .tm_sec = 2 + }; + + TEST_ASSERT_EQUAL_INT(19, fmt_time_tm_iso8601(out, &time, 'T')); + TEST_ASSERT_EQUAL_STRING(expected, out); + expected = "2025-04-08 17:40:02"; + TEST_ASSERT_EQUAL_INT(19, fmt_time_tm_iso8601(out, &time, ' ')); + TEST_ASSERT_EQUAL_STRING(expected, out); + + time.tm_year = -1901; + TEST_ASSERT_EQUAL_INT(-EINVAL, fmt_time_tm_iso8601(out, &time, 'T')); + time.tm_year = 9999 - 1899; + TEST_ASSERT_EQUAL_INT(-EINVAL, fmt_time_tm_iso8601(out, &time, 'T')); +} + +static void test_scn_time_iso8601(void) +{ + struct tm time; + + memset(&time, 0, sizeof(time)); + TEST_ASSERT_EQUAL_INT(19, scn_time_tm_iso8601(&time, "2025-04-08T17:40:02", 'T')); + TEST_ASSERT_EQUAL_INT(2025 - 1900, time.tm_year); + TEST_ASSERT_EQUAL_INT(4 - 1, time.tm_mon); + TEST_ASSERT_EQUAL_INT(8, time.tm_mday); + TEST_ASSERT_EQUAL_INT(17, time.tm_hour); + TEST_ASSERT_EQUAL_INT(40, time.tm_min); + TEST_ASSERT_EQUAL_INT(2, time.tm_sec); + + memset(&time, 0, sizeof(time)); + TEST_ASSERT_EQUAL_INT(19, scn_time_tm_iso8601(&time, "2025-04-08 17:40:02", ' ')); + TEST_ASSERT_EQUAL_INT(2025 - 1900, time.tm_year); + TEST_ASSERT_EQUAL_INT(4 - 1, time.tm_mon); + TEST_ASSERT_EQUAL_INT(8, time.tm_mday); + TEST_ASSERT_EQUAL_INT(17, time.tm_hour); + TEST_ASSERT_EQUAL_INT(40, time.tm_min); + TEST_ASSERT_EQUAL_INT(2, time.tm_sec); + + memset(&time, 0, sizeof(time)); + TEST_ASSERT_EQUAL_INT(10, scn_time_tm_iso8601(&time, "2025-04-08", 'T')); + TEST_ASSERT_EQUAL_INT(2025 - 1900, time.tm_year); + TEST_ASSERT_EQUAL_INT(4 - 1, time.tm_mon); + TEST_ASSERT_EQUAL_INT(8, time.tm_mday); + + memset(&time, 0, sizeof(time)); + TEST_ASSERT_EQUAL_INT(19, scn_time_tm_iso8601(&time, "2025-13-08T17:40:02", 'T')); + TEST_ASSERT_EQUAL_INT(2025 - 1900, time.tm_year); + TEST_ASSERT_EQUAL_INT(13 - 1, time.tm_mon); + TEST_ASSERT_EQUAL_INT(8, time.tm_mday); + TEST_ASSERT_EQUAL_INT(17, time.tm_hour); + TEST_ASSERT_EQUAL_INT(40, time.tm_min); + TEST_ASSERT_EQUAL_INT(2, time.tm_sec); + + memset(&time, 0, sizeof(time)); + TEST_ASSERT_EQUAL_INT(19, scn_time_tm_iso8601(&time, "2025-04-08T17:60:02", 'T')); + TEST_ASSERT_EQUAL_INT(2025 - 1900, time.tm_year); + TEST_ASSERT_EQUAL_INT(4 - 1, time.tm_mon); + TEST_ASSERT_EQUAL_INT(8, time.tm_mday); + TEST_ASSERT_EQUAL_INT(17, time.tm_hour); + TEST_ASSERT_EQUAL_INT(60, time.tm_min); + TEST_ASSERT_EQUAL_INT(2, time.tm_sec); + + memset(&time, 0, sizeof(time)); + TEST_ASSERT_EQUAL_INT(19, scn_time_tm_iso8601(&time, "1899-04-08T17:40:02", 'T')); + TEST_ASSERT_EQUAL_INT(1899 - 1900, time.tm_year); + TEST_ASSERT_EQUAL_INT(4 - 1, time.tm_mon); + TEST_ASSERT_EQUAL_INT(8, time.tm_mday); + TEST_ASSERT_EQUAL_INT(17, time.tm_hour); + TEST_ASSERT_EQUAL_INT(40, time.tm_min); + TEST_ASSERT_EQUAL_INT(2, time.tm_sec); + + memset(&time, 0, sizeof(time)); + TEST_ASSERT_EQUAL_INT(-EBADF, scn_time_tm_iso8601(&time, "2025-04-08T", ' ')); + TEST_ASSERT_EQUAL_INT(-EBADF, scn_time_tm_iso8601(&time, "2025-04-08 17:40:02", 'T')); + TEST_ASSERT_EQUAL_INT(-EINVAL, scn_time_tm_iso8601(&time, "2025-XX-08T17:40:02", 'T')); + TEST_ASSERT_EQUAL_INT(-EINVAL, scn_time_tm_iso8601(&time, "2025-4-08T17:40:02", 'T')); + TEST_ASSERT_EQUAL_INT(-EINVAL, scn_time_tm_iso8601(&time, "2025-04-8T17:40:02", 'T')); + TEST_ASSERT_EQUAL_INT(-EINVAL, scn_time_tm_iso8601(&time, "2025-04-08T17:40:2", 'T')); + TEST_ASSERT_EQUAL_INT(-EINVAL, scn_time_tm_iso8601(&time, "-2025-04-08T17:40:02", 'T')); + TEST_ASSERT_EQUAL_INT(-EINVAL, scn_time_tm_iso8601(&time, "10000-04-08T17:40:02", 'T')); +} + Test *tests_fmt_tests(void) { EMB_UNIT_TESTFIXTURES(fixtures) { @@ -965,6 +1057,8 @@ Test *tests_fmt_tests(void) new_TestFixture(test_scn_u32_hex), new_TestFixture(test_scn_buf_hex), new_TestFixture(test_fmt_lpad), + new_TestFixture(test_fmt_time_iso8601), + new_TestFixture(test_scn_time_iso8601), }; EMB_UNIT_TESTCALLER(fmt_tests, NULL, NULL, fixtures);