hurd: fix warning
[glibc.git] / time / tst-strptime.c
blob49dfbe95350db3ef9dadd0a19e682591f1ce40af
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 { "pl_PL.UTF-8", "23 listopada 2017", "%d %B %Y", 4, 326, 10, 23 },
64 /* The nominative case is incorrect here but it is parseable. */
65 { "pl_PL.UTF-8", "24 listopad 2017", "%d %OB %Y", 5, 327, 10, 24 },
66 { "pl_PL.UTF-8", "25 lis 2017", "%d %Ob %Y", 6, 328, 10, 25 },
67 /* ноя - pronounce: 'noya' - "Nov" (abbreviated "November") in Russian. */
68 { "ru_RU.UTF-8", "26 ноя 2017", "%d %b %Y", 0, 329, 10, 26 },
69 /* TODO: Add an example of "may"/"maya" (5th month, May) using %Ob in
70 Russian when the localedata is updated. Without the genitive forms
71 in localedata the word "maya" is ambiguous and may be mistaken for
72 "mart" (March).
77 static const struct
79 const char *input;
80 const char *format;
81 const char *output;
82 int wday;
83 int yday;
84 } tm_tests [] =
86 {"17410105012000", "%H%M%S%d%m%Y", "2000-01-05 17:41:01", 3, 4}
91 static int
92 test_tm (void)
94 struct tm tm;
95 size_t i;
96 int result = 0;
97 char buf[100];
99 for (i = 0; i < sizeof (tm_tests) / sizeof (tm_tests[0]); ++i)
101 memset (&tm, '\0', sizeof (tm));
103 char *ret = strptime (tm_tests[i].input, tm_tests[i].format, &tm);
104 if (ret == NULL)
106 printf ("strptime returned NULL for `%s'\n", tm_tests[i].input);
107 result = 1;
108 continue;
110 else if (*ret != '\0')
112 printf ("not all of `%s' read\n", tm_tests[i].input);
113 result = 1;
115 strftime (buf, sizeof (buf), "%F %T", &tm);
116 printf ("strptime (\"%s\", \"%s\", ...)\n"
117 "\tshould be: %s, wday = %d, yday = %3d\n"
118 "\t is: %s, wday = %d, yday = %3d\n",
119 tm_tests[i].input, tm_tests[i].format,
120 tm_tests[i].output,
121 tm_tests[i].wday, tm_tests[i].yday,
122 buf, tm.tm_wday, tm.tm_yday);
124 if (strcmp (buf, tm_tests[i].output) != 0)
126 printf ("Time and date are not correct.\n");
127 result = 1;
129 if (tm.tm_wday != tm_tests[i].wday)
131 printf ("weekday for `%s' incorrect: %d instead of %d\n",
132 tm_tests[i].input, tm.tm_wday, tm_tests[i].wday);
133 result = 1;
135 if (tm.tm_yday != tm_tests[i].yday)
137 printf ("yearday for `%s' incorrect: %d instead of %d\n",
138 tm_tests[i].input, tm.tm_yday, tm_tests[i].yday);
139 result = 1;
143 return result;
147 static int
148 do_test (void)
150 struct tm tm;
151 size_t i;
152 int result = 0;
154 for (i = 0; i < sizeof (day_tests) / sizeof (day_tests[0]); ++i)
156 memset (&tm, '\0', sizeof (tm));
158 if (setlocale (LC_ALL, day_tests[i].locale) == NULL)
160 printf ("cannot set locale %s: %m\n", day_tests[i].locale);
161 exit (EXIT_FAILURE);
164 char *ret = strptime (day_tests[i].input, day_tests[i].format, &tm);
165 if (ret == NULL)
167 printf ("strptime returned NULL for `%s'\n", day_tests[i].input);
168 result = 1;
169 continue;
171 else if (*ret != '\0')
173 printf ("not all of `%s' read\n", day_tests[i].input);
174 result = 1;
177 printf ("strptime (\"%s\", \"%s\", ...)\n"
178 "\tshould be: wday = %d, yday = %3d, mon = %2d, mday = %2d\n"
179 "\t is: wday = %d, yday = %3d, mon = %2d, mday = %2d\n",
180 day_tests[i].input, day_tests[i].format,
181 day_tests[i].wday, day_tests[i].yday,
182 day_tests[i].mon, day_tests[i].mday,
183 tm.tm_wday, tm.tm_yday, tm.tm_mon, tm.tm_mday);
185 if (tm.tm_wday != day_tests[i].wday)
187 printf ("weekday for `%s' incorrect: %d instead of %d\n",
188 day_tests[i].input, tm.tm_wday, day_tests[i].wday);
189 result = 1;
191 if (tm.tm_yday != day_tests[i].yday)
193 printf ("yearday for `%s' incorrect: %d instead of %d\n",
194 day_tests[i].input, tm.tm_yday, day_tests[i].yday);
195 result = 1;
197 if (tm.tm_mon != day_tests[i].mon)
199 printf ("month for `%s' incorrect: %d instead of %d\n",
200 day_tests[i].input, tm.tm_mon, day_tests[i].mon);
201 result = 1;
203 if (tm.tm_mday != day_tests[i].mday)
205 printf ("monthday for `%s' incorrect: %d instead of %d\n",
206 day_tests[i].input, tm.tm_mday, day_tests[i].mday);
207 result = 1;
211 setlocale (LC_ALL, "C");
213 result |= test_tm ();
215 return result;
218 #define TEST_FUNCTION do_test ()
219 #include "../test-skeleton.c"