1 //===----------------------------------------------------------------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8
9 // <locale>
10
11 // class time_get<charT, InputIterator>
12
13 // iter_type get(iter_type s, iter_type end, ios_base& f,
14 // ios_base::iostate& err, tm *t, char format, char modifier = 0) const;
15
16 #include <locale>
17 #include <cassert>
18 #include "test_macros.h"
19 #include "test_iterators.h"
20
21 typedef input_iterator<const char*> I;
22
23 typedef std::time_get<char, I> F;
24
25 class my_facet
26 : public F
27 {
28 public:
my_facet(std::size_t refs=0)29 explicit my_facet(std::size_t refs = 0)
30 : F(refs) {}
31 };
32
main(int,char **)33 int main(int, char**)
34 {
35 const my_facet f(1);
36 std::ios ios(0);
37 std::ios_base::iostate err;
38 std::tm t;
39 {
40 const char in[] = "mon";
41 err = std::ios_base::goodbit;
42 t = std::tm();
43 I i = f.get(I(in), I(in+sizeof(in)-1), ios, err, &t, 'a');
44 assert(i.base() == in+sizeof(in)-1);
45 assert(t.tm_wday == 1);
46 assert(err == std::ios_base::eofbit);
47 }
48 {
49 const char in[] = "wednesdaY";
50 err = std::ios_base::goodbit;
51 t = std::tm();
52 I i = f.get(I(in), I(in+sizeof(in)-1), ios, err, &t, 'A');
53 assert(i.base() == in+sizeof(in)-1);
54 assert(t.tm_wday == 3);
55 assert(err == std::ios_base::eofbit);
56 }
57 {
58 const char in[] = "June";
59 err = std::ios_base::goodbit;
60 t = std::tm();
61 I i = f.get(I(in), I(in+sizeof(in)-1), ios, err, &t, 'b');
62 assert(i.base() == in+sizeof(in)-1);
63 assert(t.tm_mon == 5);
64 assert(err == std::ios_base::eofbit);
65 }
66 {
67 const char in[] = "Jul";
68 err = std::ios_base::goodbit;
69 t = std::tm();
70 I i = f.get(I(in), I(in+sizeof(in)-1), ios, err, &t, 'B');
71 assert(i.base() == in+sizeof(in)-1);
72 assert(t.tm_mon == 6);
73 assert(err == std::ios_base::eofbit);
74 }
75 {
76 const char in[] = "Thu Jun 6 09:49:10 2009";
77 err = std::ios_base::goodbit;
78 t = std::tm();
79 I i = f.get(I(in), I(in+sizeof(in)-1), ios, err, &t, 'c');
80 assert(i.base() == in+sizeof(in)-1);
81 assert(t.tm_wday == 4);
82 assert(t.tm_mon == 5);
83 assert(t.tm_mday == 6);
84 assert(t.tm_hour == 9);
85 assert(t.tm_min == 49);
86 assert(t.tm_sec == 10);
87 assert(t.tm_year == 109);
88 assert(err == std::ios_base::eofbit);
89 }
90 {
91 const char in[] = "11";
92 err = std::ios_base::goodbit;
93 t = std::tm();
94 I i = f.get(I(in), I(in+sizeof(in)-1), ios, err, &t, 'd');
95 assert(i.base() == in+sizeof(in)-1);
96 assert(t.tm_mday == 11);
97 assert(err == std::ios_base::eofbit);
98 }
99 {
100 const char in[] = "2/1/1";
101 err = std::ios_base::goodbit;
102 t = std::tm();
103 I i = f.get(I(in), I(in+sizeof(in)-1), ios, err, &t, 'D');
104 assert(i.base() == in+sizeof(in)-1);
105 assert(t.tm_mon == 1);
106 assert(t.tm_mday == 1);
107 assert(t.tm_year == 101);
108 assert(err == std::ios_base::eofbit);
109 }
110 {
111 const char in[] = "11";
112 err = std::ios_base::goodbit;
113 t = std::tm();
114 I i = f.get(I(in), I(in+sizeof(in)-1), ios, err, &t, 'e');
115 assert(i.base() == in+sizeof(in)-1);
116 assert(t.tm_mday == 11);
117 assert(err == std::ios_base::eofbit);
118 }
119 {
120 const char in[] = "June";
121 err = std::ios_base::goodbit;
122 t = std::tm();
123 I i = f.get(I(in), I(in+sizeof(in)-1), ios, err, &t, 'h');
124 assert(i.base() == in+sizeof(in)-1);
125 assert(t.tm_mon == 5);
126 assert(err == std::ios_base::eofbit);
127 }
128 {
129 const char in[] = "19";
130 err = std::ios_base::goodbit;
131 t = std::tm();
132 I i = f.get(I(in), I(in+sizeof(in)-1), ios, err, &t, 'H');
133 assert(i.base() == in+sizeof(in)-1);
134 assert(t.tm_hour == 19);
135 assert(err == std::ios_base::eofbit);
136 }
137 {
138 const char in[] = "12";
139 err = std::ios_base::goodbit;
140 t = std::tm();
141 I i = f.get(I(in), I(in+sizeof(in)-1), ios, err, &t, 'm');
142 assert(i.base() == in+sizeof(in)-1);
143 assert(t.tm_mon == 11);
144 assert(err == std::ios_base::eofbit);
145 }
146 {
147 const char in[] = "59";
148 err = std::ios_base::goodbit;
149 t = std::tm();
150 I i = f.get(I(in), I(in+sizeof(in)-1), ios, err, &t, 'M');
151 assert(i.base() == in+sizeof(in)-1);
152 assert(t.tm_min == 59);
153 assert(err == std::ios_base::eofbit);
154 }
155 {
156 const char in[] = "\t\n ";
157 err = std::ios_base::goodbit;
158 t = std::tm();
159 I i = f.get(I(in), I(in+sizeof(in)-1), ios, err, &t, 'n');
160 assert(i.base() == in+sizeof(in)-1);
161 assert(err == std::ios_base::eofbit);
162 }
163 {
164 const char in[] = "09:49:10 PM";
165 err = std::ios_base::goodbit;
166 t = std::tm();
167 I i = f.get(I(in), I(in+sizeof(in)-1), ios, err, &t, 'r');
168 assert(i.base() == in+sizeof(in)-1);
169 assert(t.tm_hour == 21);
170 assert(t.tm_min == 49);
171 assert(t.tm_sec == 10);
172 assert(err == std::ios_base::eofbit);
173 }
174 {
175 const char in[] = "09:49:10 AM";
176 err = std::ios_base::goodbit;
177 t = std::tm();
178 I i = f.get(I(in), I(in+sizeof(in)-1), ios, err, &t, 'r');
179 assert(i.base() == in+sizeof(in)-1);
180 assert(t.tm_hour == 9);
181 assert(t.tm_min == 49);
182 assert(t.tm_sec == 10);
183 assert(err == std::ios_base::eofbit);
184 }
185 {
186 const char in[] = "12:49:10 AM";
187 err = std::ios_base::goodbit;
188 t = std::tm();
189 I i = f.get(I(in), I(in+sizeof(in)-1), ios, err, &t, 'r');
190 assert(i.base() == in+sizeof(in)-1);
191 assert(t.tm_hour == 0);
192 assert(t.tm_min == 49);
193 assert(t.tm_sec == 10);
194 assert(err == std::ios_base::eofbit);
195 }
196 {
197 const char in[] = "12:49:10 PM";
198 err = std::ios_base::goodbit;
199 t = std::tm();
200 I i = f.get(I(in), I(in+sizeof(in)-1), ios, err, &t, 'r');
201 assert(i.base() == in+sizeof(in)-1);
202 assert(t.tm_hour == 12);
203 assert(t.tm_min == 49);
204 assert(t.tm_sec == 10);
205 assert(err == std::ios_base::eofbit);
206 }
207 {
208 const char in[] = "09:49";
209 err = std::ios_base::goodbit;
210 t = std::tm();
211 I i = f.get(I(in), I(in+sizeof(in)-1), ios, err, &t, 'R');
212 assert(i.base() == in+sizeof(in)-1);
213 assert(t.tm_hour == 9);
214 assert(t.tm_min == 49);
215 assert(t.tm_sec == 0);
216 assert(err == std::ios_base::eofbit);
217 }
218 {
219 const char in[] = "60";
220 err = std::ios_base::goodbit;
221 t = std::tm();
222 I i = f.get(I(in), I(in+sizeof(in)-1), ios, err, &t, 'S');
223 assert(i.base() == in+sizeof(in)-1);
224 assert(t.tm_hour == 0);
225 assert(t.tm_min == 0);
226 assert(t.tm_sec == 60);
227 assert(err == std::ios_base::eofbit);
228 }
229 {
230 const char in[] = "\t\n ";
231 err = std::ios_base::goodbit;
232 t = std::tm();
233 I i = f.get(I(in), I(in+sizeof(in)-1), ios, err, &t, 't');
234 assert(i.base() == in+sizeof(in)-1);
235 assert(err == std::ios_base::eofbit);
236 }
237 {
238 const char in[] = "21:49:10";
239 err = std::ios_base::goodbit;
240 t = std::tm();
241 I i = f.get(I(in), I(in+sizeof(in)-1), ios, err, &t, 'T');
242 assert(i.base() == in+sizeof(in)-1);
243 assert(t.tm_hour == 21);
244 assert(t.tm_min == 49);
245 assert(t.tm_sec == 10);
246 assert(err == std::ios_base::eofbit);
247 }
248 {
249 const char in[] = "3";
250 err = std::ios_base::goodbit;
251 t = std::tm();
252 I i = f.get(I(in), I(in+sizeof(in)-1), ios, err, &t, 'w');
253 assert(i.base() == in+sizeof(in)-1);
254 assert(t.tm_wday == 3);
255 assert(err == std::ios_base::eofbit);
256 }
257 {
258 const char in[] = "06/06/09";
259 err = std::ios_base::goodbit;
260 t = std::tm();
261 I i = f.get(I(in), I(in+sizeof(in)-1), ios, err, &t, 'x');
262 assert(i.base() == in+sizeof(in)-1);
263 assert(t.tm_mon == 5);
264 assert(t.tm_mday == 6);
265 assert(t.tm_year == 109);
266 assert(err == std::ios_base::eofbit);
267 }
268 {
269 const char in[] = "21:49:10";
270 err = std::ios_base::goodbit;
271 t = std::tm();
272 I i = f.get(I(in), I(in+sizeof(in)-1), ios, err, &t, 'X');
273 assert(i.base() == in+sizeof(in)-1);
274 assert(t.tm_hour == 21);
275 assert(t.tm_min == 49);
276 assert(t.tm_sec == 10);
277 assert(err == std::ios_base::eofbit);
278 }
279 {
280 const char in[] = "68";
281 err = std::ios_base::goodbit;
282 t = std::tm();
283 I i = f.get(I(in), I(in+sizeof(in)-1), ios, err, &t, 'y');
284 assert(i.base() == in+sizeof(in)-1);
285 assert(t.tm_year == 168);
286 assert(err == std::ios_base::eofbit);
287 }
288 {
289 const char in[] = "68";
290 err = std::ios_base::goodbit;
291 t = std::tm();
292 I i = f.get(I(in), I(in+sizeof(in)-1), ios, err, &t, 'Y');
293 assert(i.base() == in+sizeof(in)-1);
294 assert(t.tm_year == -1832);
295 assert(err == std::ios_base::eofbit);
296 }
297 {
298 const char in[] = "%";
299 err = std::ios_base::goodbit;
300 t = std::tm();
301 I i = f.get(I(in), I(in+sizeof(in)-1), ios, err, &t, '%');
302 assert(i.base() == in+sizeof(in)-1);
303 assert(err == std::ios_base::eofbit);
304 }
305
306 return 0;
307 }
308