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