[evolution-data-server] I#421 - libedataserver: Enhance two-digit year parsing



commit ea0d6300dd61d6b4f7703642d0b0e19c49a09758
Author: Milan Crha <mcrha redhat com>
Date:   Thu Oct 6 15:55:15 2022 +0200

    I#421 - libedataserver: Enhance two-digit year parsing
    
    Closes https://gitlab.gnome.org/GNOME/evolution-data-server/-/issues/421

 src/libedataserver/e-time-utils.c          |  8 ++++--
 tests/libedataserver/libedataserver-test.c | 39 ++++++++++++++++++++++++++++++
 2 files changed, 45 insertions(+), 2 deletions(-)
---
diff --git a/src/libedataserver/e-time-utils.c b/src/libedataserver/e-time-utils.c
index ab5de804e..14eb650d5 100644
--- a/src/libedataserver/e-time-utils.c
+++ b/src/libedataserver/e-time-utils.c
@@ -1564,13 +1564,17 @@ correct_two_digit_year (struct tm *result,
                *two_digit_year = FALSE;
 
        /* If a 2-digit year was used we use the current century. */
-       if (result->tm_year < 0 && result->tm_year < -1800) {
+       if (result->tm_year < -1800 && result->tm_year >= -1900) {
                time_t t = time (NULL);
                struct tm *today_tm = localtime (&t);
 
-               /* This should convert it into a value from 0 to 99. */
+               /* This converts it into a value from 0 to 99. */
                result->tm_year += 1900;
 
+               /* When the year is after the next year, then expect it be the previous century */
+               if ((today_tm->tm_year % 100) + 1 < result->tm_year)
+                       result->tm_year -= 100;
+
                /* Now add on the century. */
                result->tm_year += today_tm->tm_year
                        - (today_tm->tm_year % 100);
diff --git a/tests/libedataserver/libedataserver-test.c b/tests/libedataserver/libedataserver-test.c
index 6c321d234..7e6b6c713 100644
--- a/tests/libedataserver/libedataserver-test.c
+++ b/tests/libedataserver/libedataserver-test.c
@@ -86,6 +86,39 @@ test_webdav_href_compare (ETestServerFixture *fixture,
        }
 }
 
+static void
+test_parse_date (ETestServerFixture *fixture,
+                gconstpointer user_data)
+{
+       struct _tests {
+               const gchar *value;
+               gint expected_year;
+               gshort expected_month;
+               gshort expected_day;
+               gboolean two_digit_year;
+       } tests[] = {
+               { "12/30/1980", 1980, 12, 30, FALSE },
+               { "01/02/2020", 2020, 01, 02, FALSE },
+               { "12/29/80",   1980, 12, 29, TRUE },
+               { "12/28/02",   2002, 12, 28, TRUE },
+               { "12/27/133",   133, 12, 27, FALSE },
+               { "12/26/99",   1999, 12, 26, TRUE },
+               { "11/25/00",   2000, 11, 25, TRUE }
+       };
+       gint ii;
+
+       for (ii = 0; ii < G_N_ELEMENTS (tests); ii++) {
+               struct tm tm;
+               gboolean two_digit_year = FALSE;
+
+               g_assert_cmpint (e_time_parse_date_ex (tests[ii].value, &tm, &two_digit_year), ==, 
E_TIME_PARSE_OK);
+               g_assert_cmpint (tm.tm_year + 1900, ==, tests[ii].expected_year);
+               g_assert_cmpint (tm.tm_mon + 1, ==, tests[ii].expected_month);
+               g_assert_cmpint (tm.tm_mday, ==, tests[ii].expected_day);
+               g_assert_cmpint ((two_digit_year ? 1 : 0), ==, (tests[ii].two_digit_year ? 1 : 0));
+       }
+}
+
 gint
 main (gint argc,
       gchar **argv)
@@ -99,6 +132,12 @@ main (gint argc,
                e_test_server_utils_setup,
                test_webdav_href_compare,
                e_test_server_utils_teardown);
+       g_test_add (
+               "/libedataserver-test/ParseDate",
+               ETestServerFixture, &test_closure,
+               e_test_server_utils_setup,
+               test_parse_date,
+               e_test_server_utils_teardown);
 
        return e_test_server_utils_run (argc, argv);
 }


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]