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