Abbreviated alternative month names (%Ob) also added (bug 10871).
[glibc.git] / time / tst-strptime.c
blob2eac5a25cbbfe9e81e381be82c20a66a0ae1ef9c
1 /* Test for strptime.
2 Copyright (C) 1998-2018 Free Software Foundation, Inc.
3 This file is part of the GNU C Library.
4 Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
6 The GNU C Library is free software; you can redistribute it and/or
7 modify it under the terms of the GNU Lesser General Public
8 License as published by the Free Software Foundation; either
9 version 2.1 of the License, or (at your option) any later version.
11 The GNU C Library is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 Lesser General Public License for more details.
16 You should have received a copy of the GNU Lesser General Public
17 License along with the GNU C Library; if not, see
18 <http://www.gnu.org/licenses/>. */
20 #include <locale.h>
21 #include <stdio.h>
22 #include <stdlib.h>
23 #include <string.h>
24 #include <time.h>
27 static const struct
29 const char *locale;
30 const char *input;
31 const char *format;
32 int wday;
33 int yday;
34 int mon;
35 int mday;
36 } day_tests[] =
38 { "C", "2000-01-01", "%Y-%m-%d", 6, 0, 0, 1 },
39 { "C", "03/03/00", "%D", 5, 62, 2, 3 },
40 { "C", "9/9/99", "%x", 4, 251, 8, 9 },
41 { "C", "19990502123412", "%Y%m%d%H%M%S", 0, 121, 4, 2 },
42 { "C", "2001 20 Mon", "%Y %U %a", 1, 140, 4, 21 },
43 { "C", "2001 21 Mon", "%Y %W %a", 1, 140, 4, 21 },
44 { "C", "2001 21 Mon", "%2000Y %W %a", 1, 140, 4, 21 },
45 { "C", "2001 21 Mon", "%^Y %W %a", 1, 140, 4, 21 },
46 { "C", "2001 EST 21 Mon", "%Y %Z %W %a", 1, 140, 4, 21 },
47 { "C", "2012 00 Sun", "%Y %W %a", 0, 0, 0, 1 },
48 { "ja_JP.EUC-JP", "2000-01-01 08:12:21 AM", "%Y-%m-%d %I:%M:%S %p",
49 6, 0, 0, 1 },
50 { "en_US.ISO-8859-1", "2000-01-01 08:12:21 PM", "%Y-%m-%d %I:%M:%S %p",
51 6, 0, 0, 1 },
52 { "ja_JP.EUC-JP", "2001 20 \xb7\xee", "%Y %U %a", 1, 140, 4, 21 },
53 { "ja_JP.EUC-JP", "2001 21 \xb7\xee", "%Y %W %a", 1, 140, 4, 21 },
54 /* Most of the languages do not need the declension of the month names
55 and do not distinguish between %B and %OB. */
56 { "en_US.ISO-8859-1", "November 17, 2017", "%B %e, %Y", 5, 320, 10, 17 },
57 { "de_DE.ISO-8859-1", "18. Nov 2017", "%d. %b %Y", 6, 321, 10, 18 },
58 { "fr_FR.UTF-8", "19 novembre 2017", "%d %OB %Y", 0, 322, 10, 19 },
59 { "es_ES.UTF-8", "20 de nov de 2017", "%d de %Ob de %Y", 1, 323, 10, 20 },
60 /* Some languages do need the declension of the month names. */
61 { "pl_PL.UTF-8", "21 lis 2017", "%d %b %Y", 2, 324, 10, 21 },
62 { "pl_PL.UTF-8", "22 LIS 2017", "%d %B %Y", 3, 325, 10, 22 },
63 /* TODO: Use the genitive case here as soon as it is added to localedata. */
64 { "pl_PL.UTF-8", "23 listopad 2017", "%d %B %Y", 4, 326, 10, 23 },
65 /* The nominative case is incorrect here but it is parseable. */
66 { "pl_PL.UTF-8", "24 listopad 2017", "%d %OB %Y", 5, 327, 10, 24 },
67 { "pl_PL.UTF-8", "25 lis 2017", "%d %Ob %Y", 6, 328, 10, 25 },
68 /* ноя - pronounce: 'noya' - "Nov" (abbreviated "November") in Russian. */
69 { "ru_RU.UTF-8", "26 ноя 2017", "%d %b %Y", 0, 329, 10, 26 },
70 /* TODO: Add an example of "may"/"maya" (5th month, May) using %Ob in
71 Russian when the localedata is updated. Without the genitive forms
72 in localedata the word "maya" is ambiguous and may be mistaken for
73 "mart" (March).
78 static const struct
80 const char *input;
81 const char *format;
82 const char *output;
83 int wday;
84 int yday;
85 } tm_tests [] =
87 {"17410105012000", "%H%M%S%d%m%Y", "2000-01-05 17:41:01", 3, 4}
92 static int
93 test_tm (void)
95 struct tm tm;
96 size_t i;
97 int result = 0;
98 char buf[100];
100 for (i = 0; i < sizeof (tm_tests) / sizeof (tm_tests[0]); ++i)
102 memset (&tm, '\0', sizeof (tm));
104 char *ret = strptime (tm_tests[i].input, tm_tests[i].format, &tm);
105 if (ret == NULL)
107 printf ("strptime returned NULL for `%s'\n", tm_tests[i].input);
108 result = 1;
109 continue;
111 else if (*ret != '\0')
113 printf ("not all of `%s' read\n", tm_tests[i].input);
114 result = 1;
116 strftime (buf, sizeof (buf), "%F %T", &tm);
117 printf ("strptime (\"%s\", \"%s\", ...)\n"
118 "\tshould be: %s, wday = %d, yday = %3d\n"
119 "\t is: %s, wday = %d, yday = %3d\n",
120 tm_tests[i].input, tm_tests[i].format,
121 tm_tests[i].output,
122 tm_tests[i].wday, tm_tests[i].yday,
123 buf, tm.tm_wday, tm.tm_yday);
125 if (strcmp (buf, tm_tests[i].output) != 0)
127 printf ("Time and date are not correct.\n");
128 result = 1;
130 if (tm.tm_wday != tm_tests[i].wday)
132 printf ("weekday for `%s' incorrect: %d instead of %d\n",
133 tm_tests[i].input, tm.tm_wday, tm_tests[i].wday);
134 result = 1;
136 if (tm.tm_yday != tm_tests[i].yday)
138 printf ("yearday for `%s' incorrect: %d instead of %d\n",
139 tm_tests[i].input, tm.tm_yday, tm_tests[i].yday);
140 result = 1;
144 return result;
148 static int
149 do_test (void)
151 struct tm tm;
152 size_t i;
153 int result = 0;
155 for (i = 0; i < sizeof (day_tests) / sizeof (day_tests[0]); ++i)
157 memset (&tm, '\0', sizeof (tm));
159 if (setlocale (LC_ALL, day_tests[i].locale) == NULL)
161 printf ("cannot set locale %s: %m\n", day_tests[i].locale);
162 exit (EXIT_FAILURE);
165 char *ret = strptime (day_tests[i].input, day_tests[i].format, &tm);
166 if (ret == NULL)
168 printf ("strptime returned NULL for `%s'\n", day_tests[i].input);
169 result = 1;
170 continue;
172 else if (*ret != '\0')
174 printf ("not all of `%s' read\n", day_tests[i].input);
175 result = 1;
178 printf ("strptime (\"%s\", \"%s\", ...)\n"
179 "\tshould be: wday = %d, yday = %3d, mon = %2d, mday = %2d\n"
180 "\t is: wday = %d, yday = %3d, mon = %2d, mday = %2d\n",
181 day_tests[i].input, day_tests[i].format,
182 day_tests[i].wday, day_tests[i].yday,
183 day_tests[i].mon, day_tests[i].mday,
184 tm.tm_wday, tm.tm_yday, tm.tm_mon, tm.tm_mday);
186 if (tm.tm_wday != day_tests[i].wday)
188 printf ("weekday for `%s' incorrect: %d instead of %d\n",
189 day_tests[i].input, tm.tm_wday, day_tests[i].wday);
190 result = 1;
192 if (tm.tm_yday != day_tests[i].yday)
194 printf ("yearday for `%s' incorrect: %d instead of %d\n",
195 day_tests[i].input, tm.tm_yday, day_tests[i].yday);
196 result = 1;
198 if (tm.tm_mon != day_tests[i].mon)
200 printf ("month for `%s' incorrect: %d instead of %d\n",
201 day_tests[i].input, tm.tm_mon, day_tests[i].mon);
202 result = 1;
204 if (tm.tm_mday != day_tests[i].mday)
206 printf ("monthday for `%s' incorrect: %d instead of %d\n",
207 day_tests[i].input, tm.tm_mday, day_tests[i].mday);
208 result = 1;
212 setlocale (LC_ALL, "C");
214 result |= test_tm ();
216 return result;
219 #define TEST_FUNCTION do_test ()
220 #include "../test-skeleton.c"