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_put<charT, OutputIterator>
12 
13 // iter_type put(iter_type s, ios_base& str, char_type fill, const tm* t,
14 //               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 std::time_put<char, output_iterator<char*> > F;
22 
23 class my_facet
24     : public F
25 {
26 public:
my_facet(std::size_t refs=0)27     explicit my_facet(std::size_t refs = 0)
28         : F(refs) {}
29 };
30 
main(int,char **)31 int main(int, char**)
32 {
33     const my_facet f(1);
34     char str[200];
35     output_iterator<char*> iter;
36     tm t = {};
37     t.tm_sec = 6;
38     t.tm_min = 3;
39     t.tm_hour = 13;
40     t.tm_mday = 2;
41     t.tm_mon = 4;
42     t.tm_year = 109;
43     t.tm_wday = 6;
44     t.tm_yday = 121;
45     t.tm_isdst = 1;
46     std::ios ios(0);
47     {
48         iter = f.put(output_iterator<char*>(str), ios, '*', &t, 'A');
49         std::string ex(str, iter.base());
50         assert(ex == "Saturday");
51     }
52     {
53         iter = f.put(output_iterator<char*>(str), ios, '*', &t, 'a');
54         std::string ex(str, iter.base());
55         assert(ex == "Sat");
56     }
57     {
58         iter = f.put(output_iterator<char*>(str), ios, '*', &t, 'B');
59         std::string ex(str, iter.base());
60         assert(ex == "May");
61     }
62     {
63         iter = f.put(output_iterator<char*>(str), ios, '*', &t, 'b');
64         std::string ex(str, iter.base());
65         assert(ex == "May");
66     }
67     {
68         iter = f.put(output_iterator<char*>(str), ios, '*', &t, 'C');
69         std::string ex(str, iter.base());
70         assert(ex == "20");
71     }
72     {
73         iter = f.put(output_iterator<char*>(str), ios, '*', &t, 'c');
74         std::string ex(str, iter.base());
75         assert(ex == "Sat May  2 13:03:06 2009");
76     }
77     {
78         iter = f.put(output_iterator<char*>(str), ios, '*', &t, 'D');
79         std::string ex(str, iter.base());
80         assert(ex == "05/02/09");
81     }
82     {
83         iter = f.put(output_iterator<char*>(str), ios, '*', &t, 'd');
84         std::string ex(str, iter.base());
85         assert(ex == "02");
86     }
87     {
88         iter = f.put(output_iterator<char*>(str), ios, '*', &t, 'c', 'E');
89         std::string ex(str, iter.base());
90         assert(ex == "Sat May  2 13:03:06 2009");
91     }
92     {
93         iter = f.put(output_iterator<char*>(str), ios, '*', &t, 'C', 'E');
94         std::string ex(str, iter.base());
95         assert(ex == "20");
96     }
97     {
98         iter = f.put(output_iterator<char*>(str), ios, '*', &t, 'x', 'E');
99         std::string ex(str, iter.base());
100         assert(ex == "05/02/09");
101     }
102     {
103         iter = f.put(output_iterator<char*>(str), ios, '*', &t, 'X', 'E');
104         std::string ex(str, iter.base());
105         assert(ex == "13:03:06");
106     }
107     {
108         iter = f.put(output_iterator<char*>(str), ios, '*', &t, 'y', 'E');
109         std::string ex(str, iter.base());
110         assert(ex == "09");
111     }
112     {
113         iter = f.put(output_iterator<char*>(str), ios, '*', &t, 'Y', 'E');
114         std::string ex(str, iter.base());
115         assert(ex == "2009");
116     }
117     {
118         iter = f.put(output_iterator<char*>(str), ios, '*', &t, 'd', 'O');
119         std::string ex(str, iter.base());
120         assert(ex == "02");
121     }
122     {
123         iter = f.put(output_iterator<char*>(str), ios, '*', &t, 'e', 'O');
124         std::string ex(str, iter.base());
125         assert(ex == " 2");
126     }
127     {
128         iter = f.put(output_iterator<char*>(str), ios, '*', &t, 'H', 'O');
129         std::string ex(str, iter.base());
130         assert(ex == "13");
131     }
132     {
133         iter = f.put(output_iterator<char*>(str), ios, '*', &t, 'I', 'O');
134         std::string ex(str, iter.base());
135         assert(ex == "01");
136     }
137     {
138         iter = f.put(output_iterator<char*>(str), ios, '*', &t, 'm', 'O');
139         std::string ex(str, iter.base());
140         assert(ex == "05");
141     }
142     {
143         iter = f.put(output_iterator<char*>(str), ios, '*', &t, 'M', 'O');
144         std::string ex(str, iter.base());
145         assert(ex == "03");
146     }
147     {
148         iter = f.put(output_iterator<char*>(str), ios, '*', &t, 'S', 'O');
149         std::string ex(str, iter.base());
150         assert(ex == "06");
151     }
152     {
153         iter = f.put(output_iterator<char*>(str), ios, '*', &t, 'u', 'O');
154         std::string ex(str, iter.base());
155         assert(ex == "6");
156     }
157     {
158         iter = f.put(output_iterator<char*>(str), ios, '*', &t, 'U', 'O');
159         std::string ex(str, iter.base());
160         assert(ex == "17");
161     }
162     {
163         iter = f.put(output_iterator<char*>(str), ios, '*', &t, 'V', 'O');
164         std::string ex(str, iter.base());
165         assert(ex == "18");
166     }
167     {
168         iter = f.put(output_iterator<char*>(str), ios, '*', &t, 'w', 'O');
169         std::string ex(str, iter.base());
170         assert(ex == "6");
171     }
172     {
173         iter = f.put(output_iterator<char*>(str), ios, '*', &t, 'W', 'O');
174         std::string ex(str, iter.base());
175         assert(ex == "17");
176     }
177     {
178         iter = f.put(output_iterator<char*>(str), ios, '*', &t, 'y', 'O');
179         std::string ex(str, iter.base());
180         assert(ex == "09");
181     }
182     {
183         iter = f.put(output_iterator<char*>(str), ios, '*', &t, 'e');
184         std::string ex(str, iter.base());
185         assert(ex == " 2");
186     }
187     {
188         iter = f.put(output_iterator<char*>(str), ios, '*', &t, 'F');
189         std::string ex(str, iter.base());
190         assert(ex == "2009-05-02");
191     }
192     {
193         iter = f.put(output_iterator<char*>(str), ios, '*', &t, 'G');
194         std::string ex(str, iter.base());
195         assert(ex == "2009");
196     }
197     {
198         iter = f.put(output_iterator<char*>(str), ios, '*', &t, 'g');
199         std::string ex(str, iter.base());
200         assert(ex == "09");
201     }
202     {
203         iter = f.put(output_iterator<char*>(str), ios, '*', &t, 'H');
204         std::string ex(str, iter.base());
205         assert(ex == "13");
206     }
207     {
208         iter = f.put(output_iterator<char*>(str), ios, '*', &t, 'h');
209         std::string ex(str, iter.base());
210         assert(ex == "May");
211     }
212     {
213         iter = f.put(output_iterator<char*>(str), ios, '*', &t, 'I');
214         std::string ex(str, iter.base());
215         assert(ex == "01");
216     }
217     {
218         iter = f.put(output_iterator<char*>(str), ios, '*', &t, 'j');
219         std::string ex(str, iter.base());
220         assert(ex == "122");
221     }
222     {
223         iter = f.put(output_iterator<char*>(str), ios, '*', &t, 'M');
224         std::string ex(str, iter.base());
225         assert(ex == "03");
226     }
227     {
228         iter = f.put(output_iterator<char*>(str), ios, '*', &t, 'm');
229         std::string ex(str, iter.base());
230         assert(ex == "05");
231     }
232     {
233         iter = f.put(output_iterator<char*>(str), ios, '*', &t, 'n');
234         std::string ex(str, iter.base());
235         assert(ex == "\n");
236     }
237     {
238         iter = f.put(output_iterator<char*>(str), ios, '*', &t, 'p');
239         std::string ex(str, iter.base());
240         assert(ex == "PM");
241     }
242     {
243         iter = f.put(output_iterator<char*>(str), ios, '*', &t, 'R');
244         std::string ex(str, iter.base());
245         assert(ex == "13:03");
246     }
247     {
248         iter = f.put(output_iterator<char*>(str), ios, '*', &t, 'r');
249         std::string ex(str, iter.base());
250         assert(ex == "01:03:06 PM");
251     }
252     {
253         iter = f.put(output_iterator<char*>(str), ios, '*', &t, 'S');
254         std::string ex(str, iter.base());
255         assert(ex == "06");
256     }
257     {
258         iter = f.put(output_iterator<char*>(str), ios, '*', &t, 'T');
259         std::string ex(str, iter.base());
260         assert(ex == "13:03:06");
261     }
262     {
263         iter = f.put(output_iterator<char*>(str), ios, '*', &t, 't');
264         std::string ex(str, iter.base());
265         assert(ex == "\t");
266     }
267     {
268         iter = f.put(output_iterator<char*>(str), ios, '*', &t, 'U');
269         std::string ex(str, iter.base());
270         assert(ex == "17");
271     }
272     {
273         iter = f.put(output_iterator<char*>(str), ios, '*', &t, 'u');
274         std::string ex(str, iter.base());
275         assert(ex == "6");
276     }
277     {
278         iter = f.put(output_iterator<char*>(str), ios, '*', &t, 'V');
279         std::string ex(str, iter.base());
280         assert(ex == "18");
281     }
282     {
283         iter = f.put(output_iterator<char*>(str), ios, '*', &t, 'W');
284         std::string ex(str, iter.base());
285         assert(ex == "17");
286     }
287     {
288         iter = f.put(output_iterator<char*>(str), ios, '*', &t, 'w');
289         std::string ex(str, iter.base());
290         assert(ex == "6");
291     }
292     {
293         iter = f.put(output_iterator<char*>(str), ios, '*', &t, 'X');
294         std::string ex(str, iter.base());
295         assert(ex == "13:03:06");
296     }
297     {
298         iter = f.put(output_iterator<char*>(str), ios, '*', &t, 'x');
299         std::string ex(str, iter.base());
300         assert(ex == "05/02/09");
301     }
302     {
303         iter = f.put(output_iterator<char*>(str), ios, '*', &t, 'Y');
304         std::string ex(str, iter.base());
305         assert(ex == "2009");
306     }
307     {
308         iter = f.put(output_iterator<char*>(str), ios, '*', &t, 'y');
309         std::string ex(str, iter.base());
310         assert(ex == "09");
311     }
312     {
313         iter = f.put(output_iterator<char*>(str), ios, '*', &t, 'Z');
314         std::string ex(str, iter.base());
315 //        assert(ex == "EDT");  depends on time zone
316     }
317     {
318         iter = f.put(output_iterator<char*>(str), ios, '*', &t, 'z');
319         std::string ex(str, iter.base());
320 //        assert(ex == "-0400");  depends on time zone
321     }
322     {
323         iter = f.put(output_iterator<char*>(str), ios, '*', &t, '+');
324         std::string ex(str, iter.base());
325 //        assert(ex == "Sat May  2 13:03:06 EDT 2009");  depends on time zone
326     }
327     {
328         iter = f.put(output_iterator<char*>(str), ios, '*', &t, '%');
329         std::string ex(str, iter.base());
330         assert(ex == "%");
331     }
332 
333   return 0;
334 }
335