From d8794aaf703ac21fc58fcfdbafbb44eadb2fbcec Mon Sep 17 00:00:00 2001 From: Philip Withnall Date: Fri, 11 Dec 2020 15:41:42 +0000 Subject: [PATCH] tests: Add more tests for GDateTime ISO 8601 seconds parsing This should add a few more lines/branches to the test coverage. Signed-off-by: Philip Withnall --- glib/tests/gdatetime.c | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/glib/tests/gdatetime.c b/glib/tests/gdatetime.c index 56491a060..0203dd0c2 100644 --- a/glib/tests/gdatetime.c +++ b/glib/tests/gdatetime.c @@ -741,6 +741,14 @@ test_GDateTime_new_from_iso8601 (void) dt = g_date_time_new_from_iso8601 ("--0824T22:10:42Z", NULL); g_assert_null (dt); + /* Seconds must be two digits. */ + dt = g_date_time_new_from_iso8601 ("2016-08-10T22:10:4Z", NULL); + g_assert_null (dt); + + /* Seconds must all be digits. */ + dt = g_date_time_new_from_iso8601 ("2016-08-10T22:10:4aZ", NULL); + g_assert_null (dt); + /* Check subseconds work */ dt = g_date_time_new_from_iso8601 ("2016-08-24T22:10:42.123456Z", NULL); ASSERT_DATE (dt, 2016, 8, 24); @@ -757,6 +765,28 @@ test_GDateTime_new_from_iso8601 (void) ASSERT_TIME (dt, 22, 10, 42, 123456); g_date_time_unref (dt); + /* Subseconds must all be digits. */ + dt = g_date_time_new_from_iso8601 ("2016-08-10T22:10:42.5aZ", NULL); + g_assert_null (dt); + + /* Subseconds can be an arbitrary length, but must not overflow. + * The ASSERT_TIME() comparisons are constrained by only comparing up to + * microsecond granularity. */ + dt = g_date_time_new_from_iso8601 ("2016-08-10T22:10:09.222222222222222222Z", NULL); + ASSERT_DATE (dt, 2016, 8, 10); + ASSERT_TIME (dt, 22, 10, 9, 222222); + g_date_time_unref (dt); + dt = g_date_time_new_from_iso8601 ("2016-08-10T22:10:09.2222222222222222222Z", NULL); + g_assert_null (dt); + + /* Small numerator, large divisor when parsing the subseconds. */ + dt = g_date_time_new_from_iso8601 ("2016-08-10T22:10:00.0000000000000000001Z", NULL); + ASSERT_DATE (dt, 2016, 8, 10); + ASSERT_TIME (dt, 22, 10, 0, 0); + g_date_time_unref (dt); + dt = g_date_time_new_from_iso8601 ("2016-08-10T22:10:00.00000000000000000001Z", NULL); + g_assert_null (dt); + /* We don't support times without minutes / seconds (valid ISO 8601) */ dt = g_date_time_new_from_iso8601 ("2016-08-24T22Z", NULL); g_assert_null (dt); @@ -1277,8 +1307,18 @@ test_GDateTime_new_full (void) g_date_time_unref (dt); dt = g_date_time_new_utc (2016, 12, 32, 22, 10, 42); g_assert_null (dt); + + /* Seconds limits. */ dt = g_date_time_new_utc (2020, 12, 9, 14, 49, NAN); g_assert_null (dt); + dt = g_date_time_new_utc (2020, 12, 9, 14, 49, -0.1); + g_assert_null (dt); + dt = g_date_time_new_utc (2020, 12, 9, 14, 49, 60.0); + g_assert_null (dt); + + /* Year limits */ + dt = g_date_time_new_utc (10000, 1, 1, 0, 0, 0); + dt = g_date_time_new_utc (0, 1, 1, 0, 0, 0); } static void