1//===----------------------------------------------------------------------===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is dual licensed under the MIT and the University of Illinois Open
6// Source Licenses. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10// <locale>
11
12// class time_put<charT, OutputIterator>
13
14// iter_type put(iter_type s, ios_base& str, char_type fill, const tm* t,
15//               char format, char modifier = 0) const;
16
17#include <locale>
18#include <cassert>
19#include "test_iterators.h"
20
21typedef std::time_put<char, output_iterator<char*> > F;
22
23class my_facet
24    : public F
25{
26public:
27    explicit my_facet(std::size_t refs = 0)
28        : F(refs) {}
29};
30
31int main()
32{
33    const my_facet f(1);
34    char str[200];
35    output_iterator<char*> iter;
36    tm t = {0};
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 = -1;
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 == "00");
161    }
162    {
163        iter = f.put(output_iterator<char*>(str), ios, '*', &t, 'V', 'O');
164        std::string ex(str, iter.base());
165        assert(ex == "52");
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 == "00");
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, 'B', 'O');
184        std::string ex(str, iter.base());
185        assert(ex == "May");
186    }
187    {
188        iter = f.put(output_iterator<char*>(str), ios, '*', &t, 'e');
189        std::string ex(str, iter.base());
190        assert(ex == " 2");
191    }
192    {
193        iter = f.put(output_iterator<char*>(str), ios, '*', &t, 'F');
194        std::string ex(str, iter.base());
195        assert(ex == "2009-05-02");
196    }
197    {
198        iter = f.put(output_iterator<char*>(str), ios, '*', &t, 'G');
199        std::string ex(str, iter.base());
200        assert(ex == "2008");
201    }
202    {
203        iter = f.put(output_iterator<char*>(str), ios, '*', &t, 'g');
204        std::string ex(str, iter.base());
205        assert(ex == "08");
206    }
207    {
208        iter = f.put(output_iterator<char*>(str), ios, '*', &t, 'H');
209        std::string ex(str, iter.base());
210        assert(ex == "13");
211    }
212    {
213        iter = f.put(output_iterator<char*>(str), ios, '*', &t, 'h');
214        std::string ex(str, iter.base());
215        assert(ex == "May");
216    }
217    {
218        iter = f.put(output_iterator<char*>(str), ios, '*', &t, 'I');
219        std::string ex(str, iter.base());
220        assert(ex == "01");
221    }
222    {
223        iter = f.put(output_iterator<char*>(str), ios, '*', &t, 'j');
224        std::string ex(str, iter.base());
225        assert(ex == "000");
226    }
227    {
228        iter = f.put(output_iterator<char*>(str), ios, '*', &t, 'k');
229        std::string ex(str, iter.base());
230        assert(ex == "13");
231    }
232    {
233        iter = f.put(output_iterator<char*>(str), ios, '*', &t, 'l');
234        std::string ex(str, iter.base());
235        assert(ex == " 1");
236    }
237    {
238        iter = f.put(output_iterator<char*>(str), ios, '*', &t, 'M');
239        std::string ex(str, iter.base());
240        assert(ex == "03");
241    }
242    {
243        iter = f.put(output_iterator<char*>(str), ios, '*', &t, 'm');
244        std::string ex(str, iter.base());
245        assert(ex == "05");
246    }
247    {
248        iter = f.put(output_iterator<char*>(str), ios, '*', &t, 'n');
249        std::string ex(str, iter.base());
250        assert(ex == "\n");
251    }
252    {
253        iter = f.put(output_iterator<char*>(str), ios, '*', &t, 'p');
254        std::string ex(str, iter.base());
255        assert(ex == "PM");
256    }
257    {
258        iter = f.put(output_iterator<char*>(str), ios, '*', &t, 'R');
259        std::string ex(str, iter.base());
260        assert(ex == "13:03");
261    }
262    {
263        iter = f.put(output_iterator<char*>(str), ios, '*', &t, 'r');
264        std::string ex(str, iter.base());
265        assert(ex == "01:03:06 PM");
266    }
267    {
268        iter = f.put(output_iterator<char*>(str), ios, '*', &t, 'S');
269        std::string ex(str, iter.base());
270        assert(ex == "06");
271    }
272    {
273        iter = f.put(output_iterator<char*>(str), ios, '*', &t, 's');
274        std::string ex(str, iter.base());
275//        assert(ex == "1241283786");  depends on time zone
276    }
277    {
278        iter = f.put(output_iterator<char*>(str), ios, '*', &t, 'T');
279        std::string ex(str, iter.base());
280        assert(ex == "13:03:06");
281    }
282    {
283        iter = f.put(output_iterator<char*>(str), ios, '*', &t, 't');
284        std::string ex(str, iter.base());
285        assert(ex == "\t");
286    }
287    {
288        iter = f.put(output_iterator<char*>(str), ios, '*', &t, 'U');
289        std::string ex(str, iter.base());
290        assert(ex == "00");
291    }
292    {
293        iter = f.put(output_iterator<char*>(str), ios, '*', &t, 'u');
294        std::string ex(str, iter.base());
295        assert(ex == "6");
296    }
297    {
298        iter = f.put(output_iterator<char*>(str), ios, '*', &t, 'V');
299        std::string ex(str, iter.base());
300        assert(ex == "52");
301    }
302    {
303        iter = f.put(output_iterator<char*>(str), ios, '*', &t, 'v');
304        std::string ex(str, iter.base());
305        assert(ex == " 2-May-2009");
306    }
307    {
308        iter = f.put(output_iterator<char*>(str), ios, '*', &t, 'W');
309        std::string ex(str, iter.base());
310        assert(ex == "00");
311    }
312    {
313        iter = f.put(output_iterator<char*>(str), ios, '*', &t, 'w');
314        std::string ex(str, iter.base());
315        assert(ex == "6");
316    }
317    {
318        iter = f.put(output_iterator<char*>(str), ios, '*', &t, 'X');
319        std::string ex(str, iter.base());
320        assert(ex == "13:03:06");
321    }
322    {
323        iter = f.put(output_iterator<char*>(str), ios, '*', &t, 'x');
324        std::string ex(str, iter.base());
325        assert(ex == "05/02/09");
326    }
327    {
328        iter = f.put(output_iterator<char*>(str), ios, '*', &t, 'Y');
329        std::string ex(str, iter.base());
330        assert(ex == "2009");
331    }
332    {
333        iter = f.put(output_iterator<char*>(str), ios, '*', &t, 'y');
334        std::string ex(str, iter.base());
335        assert(ex == "09");
336    }
337    {
338        iter = f.put(output_iterator<char*>(str), ios, '*', &t, 'Z');
339        std::string ex(str, iter.base());
340//        assert(ex == "EDT");  depends on time zone
341    }
342    {
343        iter = f.put(output_iterator<char*>(str), ios, '*', &t, 'z');
344        std::string ex(str, iter.base());
345//        assert(ex == "-0400");  depends on time zone
346    }
347    {
348        iter = f.put(output_iterator<char*>(str), ios, '*', &t, '+');
349        std::string ex(str, iter.base());
350//        assert(ex == "Sat May  2 13:03:06 EDT 2009");  depends on time zone
351    }
352    {
353        iter = f.put(output_iterator<char*>(str), ios, '*', &t, '%');
354        std::string ex(str, iter.base());
355        assert(ex == "%");
356    }
357    {
358        iter = f.put(output_iterator<char*>(str), ios, '*', &t, '%', 'J');
359        std::string ex(str, iter.base());
360        assert(ex == "J%");
361    }
362    {
363        iter = f.put(output_iterator<char*>(str), ios, '*', &t, 'J');
364        std::string ex(str, iter.base());
365        assert(ex == "J");
366    }
367}
368