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 money_put<charT, OutputIterator>
13 
14 // iter_type put(iter_type s, bool intl, ios_base& f, char_type fill,
15 //               long double units) const;
16 
17 #include <locale>
18 #include <ios>
19 #include <streambuf>
20 #include <cassert>
21 #include "test_iterators.h"
22 
23 #include "platform_support.h" // locale name macros
24 
25 typedef std::money_put<char, output_iterator<char*> > Fn;
26 
27 class my_facet
28     : public Fn
29 {
30 public:
31     explicit my_facet(std::size_t refs = 0)
32         : Fn(refs) {}
33 };
34 
35 typedef std::money_put<wchar_t, output_iterator<wchar_t*> > Fw;
36 
37 class my_facetw
38     : public Fw
39 {
40 public:
41     explicit my_facetw(std::size_t refs = 0)
42         : Fw(refs) {}
43 };
44 
45 int main()
46 {
47     std::ios ios(0);
48     std::string loc_name(LOCALE_zh_CN_UTF_8);
49     ios.imbue(std::locale(ios.getloc(),
50                           new std::moneypunct_byname<char, false>(loc_name)));
51     ios.imbue(std::locale(ios.getloc(),
52                           new std::moneypunct_byname<char, true>(loc_name)));
53     ios.imbue(std::locale(ios.getloc(),
54                           new std::moneypunct_byname<wchar_t, false>(loc_name)));
55     ios.imbue(std::locale(ios.getloc(),
56                           new std::moneypunct_byname<wchar_t, true>(loc_name)));
57 {
58     const my_facet f(1);
59     // char, national
60     {   // zero
61         long double v = 0;
62         char str[100];
63         output_iterator<char*> iter = f.put(output_iterator<char*>(str),
64                                             false, ios, '*', v);
65         std::string ex(str, iter.base());
66         assert(ex == "0.00");
67     }
68     {   // negative one
69         long double v = -1;
70         char str[100];
71         output_iterator<char*> iter = f.put(output_iterator<char*>(str),
72                                             false, ios, '*', v);
73         std::string ex(str, iter.base());
74         assert(ex == "-0.01");
75     }
76     {   // positive
77         long double v = 123456789;
78         char str[100];
79         output_iterator<char*> iter = f.put(output_iterator<char*>(str),
80                                             false, ios, '*', v);
81         std::string ex(str, iter.base());
82         assert(ex == "1,234,567.89");
83     }
84     {   // negative
85         long double v = -123456789;
86         char str[100];
87         output_iterator<char*> iter = f.put(output_iterator<char*>(str),
88                                             false, ios, '*', v);
89         std::string ex(str, iter.base());
90         assert(ex == "-1,234,567.89");
91     }
92     {   // zero, showbase
93         long double v = 0;
94         showbase(ios);
95         char str[100];
96         output_iterator<char*> iter = f.put(output_iterator<char*>(str),
97                                             false, ios, '*', v);
98         std::string ex(str, iter.base());
99         assert(ex == "\xEF\xBF\xA5""0.00");
100     }
101     {   // negative one, showbase
102         long double v = -1;
103         showbase(ios);
104         char str[100];
105         output_iterator<char*> iter = f.put(output_iterator<char*>(str),
106                                             false, ios, '*', v);
107         std::string ex(str, iter.base());
108         assert(ex == "\xEF\xBF\xA5""-0.01");
109     }
110     {   // positive, showbase
111         long double v = 123456789;
112         showbase(ios);
113         char str[100];
114         output_iterator<char*> iter = f.put(output_iterator<char*>(str),
115                                             false, ios, '*', v);
116         std::string ex(str, iter.base());
117         assert(ex == "\xEF\xBF\xA5""1,234,567.89");
118     }
119     {   // negative, showbase
120         long double v = -123456789;
121         showbase(ios);
122         char str[100];
123         output_iterator<char*> iter = f.put(output_iterator<char*>(str),
124                                             false, ios, '*', v);
125         std::string ex(str, iter.base());
126         assert(ex == "\xEF\xBF\xA5""-1,234,567.89");
127     }
128     {   // negative, showbase, left
129         long double v = -123456789;
130         showbase(ios);
131         ios.width(20);
132         left(ios);
133         char str[100];
134         output_iterator<char*> iter = f.put(output_iterator<char*>(str),
135                                             false, ios, ' ', v);
136         std::string ex(str, iter.base());
137         assert(ex == "\xEF\xBF\xA5""-1,234,567.89    ");
138         assert(ios.width() == 0);
139     }
140     {   // negative, showbase, internal
141         long double v = -123456789;
142         showbase(ios);
143         ios.width(20);
144         internal(ios);
145         char str[100];
146         output_iterator<char*> iter = f.put(output_iterator<char*>(str),
147                                             false, ios, ' ', v);
148         std::string ex(str, iter.base());
149         assert(ex == "\xEF\xBF\xA5""-    1,234,567.89");
150         assert(ios.width() == 0);
151     }
152     {   // negative, showbase, right
153         long double v = -123456789;
154         showbase(ios);
155         ios.width(20);
156         right(ios);
157         char str[100];
158         output_iterator<char*> iter = f.put(output_iterator<char*>(str),
159                                             false, ios, ' ', v);
160         std::string ex(str, iter.base());
161         assert(ex == "    \xEF\xBF\xA5""-1,234,567.89");
162         assert(ios.width() == 0);
163     }
164 
165     // char, international
166     noshowbase(ios);
167     ios.unsetf(std::ios_base::adjustfield);
168     {   // zero
169         long double v = 0;
170         char str[100];
171         output_iterator<char*> iter = f.put(output_iterator<char*>(str),
172                                             true, ios, '*', v);
173         std::string ex(str, iter.base());
174         assert(ex == "0.00");
175     }
176     {   // negative one
177         long double v = -1;
178         char str[100];
179         output_iterator<char*> iter = f.put(output_iterator<char*>(str),
180                                             true, ios, '*', v);
181         std::string ex(str, iter.base());
182         assert(ex == "-0.01");
183     }
184     {   // positive
185         long double v = 123456789;
186         char str[100];
187         output_iterator<char*> iter = f.put(output_iterator<char*>(str),
188                                             true, ios, '*', v);
189         std::string ex(str, iter.base());
190         assert(ex == "1,234,567.89");
191     }
192     {   // negative
193         long double v = -123456789;
194         char str[100];
195         output_iterator<char*> iter = f.put(output_iterator<char*>(str),
196                                             true, ios, '*', v);
197         std::string ex(str, iter.base());
198         assert(ex == "-1,234,567.89");
199     }
200     {   // zero, showbase
201         long double v = 0;
202         showbase(ios);
203         char str[100];
204         output_iterator<char*> iter = f.put(output_iterator<char*>(str),
205                                             true, ios, '*', v);
206         std::string ex(str, iter.base());
207         assert(ex == "CNY 0.00");
208     }
209     {   // negative one, showbase
210         long double v = -1;
211         showbase(ios);
212         char str[100];
213         output_iterator<char*> iter = f.put(output_iterator<char*>(str),
214                                             true, ios, '*', v);
215         std::string ex(str, iter.base());
216         assert(ex == "CNY -0.01");
217     }
218     {   // positive, showbase
219         long double v = 123456789;
220         showbase(ios);
221         char str[100];
222         output_iterator<char*> iter = f.put(output_iterator<char*>(str),
223                                             true, ios, '*', v);
224         std::string ex(str, iter.base());
225         assert(ex == "CNY 1,234,567.89");
226     }
227     {   // negative, showbase
228         long double v = -123456789;
229         showbase(ios);
230         char str[100];
231         output_iterator<char*> iter = f.put(output_iterator<char*>(str),
232                                             true, ios, '*', v);
233         std::string ex(str, iter.base());
234         assert(ex == "CNY -1,234,567.89");
235     }
236     {   // negative, showbase, left
237         long double v = -123456789;
238         showbase(ios);
239         ios.width(20);
240         left(ios);
241         char str[100];
242         output_iterator<char*> iter = f.put(output_iterator<char*>(str),
243                                             true, ios, ' ', v);
244         std::string ex(str, iter.base());
245         assert(ex == "CNY -1,234,567.89   ");
246         assert(ios.width() == 0);
247     }
248     {   // negative, showbase, internal
249         long double v = -123456789;
250         showbase(ios);
251         ios.width(20);
252         internal(ios);
253         char str[100];
254         output_iterator<char*> iter = f.put(output_iterator<char*>(str),
255                                             true, ios, ' ', v);
256         std::string ex(str, iter.base());
257         assert(ex == "CNY -   1,234,567.89");
258         assert(ios.width() == 0);
259     }
260     {   // negative, showbase, right
261         long double v = -123456789;
262         showbase(ios);
263         ios.width(20);
264         right(ios);
265         char str[100];
266         output_iterator<char*> iter = f.put(output_iterator<char*>(str),
267                                             true, ios, ' ', v);
268         std::string ex(str, iter.base());
269         assert(ex == "   CNY -1,234,567.89");
270         assert(ios.width() == 0);
271     }
272 }
273 {
274     const my_facetw f(1);
275     // wchar_t, national
276     noshowbase(ios);
277     ios.unsetf(std::ios_base::adjustfield);
278     {   // zero
279         long double v = 0;
280         wchar_t str[100];
281         output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str),
282                                             false, ios, '*', v);
283         std::wstring ex(str, iter.base());
284         assert(ex == L"0.00");
285     }
286     {   // negative one
287         long double v = -1;
288         wchar_t str[100];
289         output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str),
290                                             false, ios, '*', v);
291         std::wstring ex(str, iter.base());
292         assert(ex == L"-0.01");
293     }
294     {   // positive
295         long double v = 123456789;
296         wchar_t str[100];
297         output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str),
298                                             false, ios, '*', v);
299         std::wstring ex(str, iter.base());
300         assert(ex == L"1,234,567.89");
301     }
302     {   // negative
303         long double v = -123456789;
304         wchar_t str[100];
305         output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str),
306                                             false, ios, '*', v);
307         std::wstring ex(str, iter.base());
308         assert(ex == L"-1,234,567.89");
309     }
310     {   // zero, showbase
311         long double v = 0;
312         showbase(ios);
313         wchar_t str[100];
314         output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str),
315                                             false, ios, '*', v);
316         std::wstring ex(str, iter.base());
317         assert(ex == L"\xFFE5""0.00");
318     }
319     {   // negative one, showbase
320         long double v = -1;
321         showbase(ios);
322         wchar_t str[100];
323         output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str),
324                                             false, ios, '*', v);
325         std::wstring ex(str, iter.base());
326         assert(ex == L"\xFFE5""-0.01");
327     }
328     {   // positive, showbase
329         long double v = 123456789;
330         showbase(ios);
331         wchar_t str[100];
332         output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str),
333                                             false, ios, '*', v);
334         std::wstring ex(str, iter.base());
335         assert(ex == L"\xFFE5""1,234,567.89");
336     }
337     {   // negative, showbase
338         long double v = -123456789;
339         showbase(ios);
340         wchar_t str[100];
341         output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str),
342                                             false, ios, '*', v);
343         std::wstring ex(str, iter.base());
344         assert(ex == L"\xFFE5""-1,234,567.89");
345     }
346     {   // negative, showbase, left
347         long double v = -123456789;
348         showbase(ios);
349         ios.width(20);
350         left(ios);
351         wchar_t str[100];
352         output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str),
353                                             false, ios, ' ', v);
354         std::wstring ex(str, iter.base());
355         assert(ex == L"\xFFE5""-1,234,567.89      ");
356         assert(ios.width() == 0);
357     }
358     {   // negative, showbase, internal
359         long double v = -123456789;
360         showbase(ios);
361         ios.width(20);
362         internal(ios);
363         wchar_t str[100];
364         output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str),
365                                             false, ios, ' ', v);
366         std::wstring ex(str, iter.base());
367         assert(ex == L"\xFFE5""-      1,234,567.89");
368         assert(ios.width() == 0);
369     }
370     {   // negative, showbase, right
371         long double v = -123456789;
372         showbase(ios);
373         ios.width(20);
374         right(ios);
375         wchar_t str[100];
376         output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str),
377                                             false, ios, ' ', v);
378         std::wstring ex(str, iter.base());
379         assert(ex == L"      \xFFE5""-1,234,567.89");
380         assert(ios.width() == 0);
381     }
382 
383     // wchar_t, international
384     noshowbase(ios);
385     ios.unsetf(std::ios_base::adjustfield);
386     {   // zero
387         long double v = 0;
388         wchar_t str[100];
389         output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str),
390                                             true, ios, '*', v);
391         std::wstring ex(str, iter.base());
392         assert(ex == L"0.00");
393     }
394     {   // negative one
395         long double v = -1;
396         wchar_t str[100];
397         output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str),
398                                             true, ios, '*', v);
399         std::wstring ex(str, iter.base());
400         assert(ex == L"-0.01");
401     }
402     {   // positive
403         long double v = 123456789;
404         wchar_t str[100];
405         output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str),
406                                             true, ios, '*', v);
407         std::wstring ex(str, iter.base());
408         assert(ex == L"1,234,567.89");
409     }
410     {   // negative
411         long double v = -123456789;
412         wchar_t str[100];
413         output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str),
414                                             true, ios, '*', v);
415         std::wstring ex(str, iter.base());
416         assert(ex == L"-1,234,567.89");
417     }
418     {   // zero, showbase
419         long double v = 0;
420         showbase(ios);
421         wchar_t str[100];
422         output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str),
423                                             true, ios, '*', v);
424         std::wstring ex(str, iter.base());
425         assert(ex == L"CNY 0.00");
426     }
427     {   // negative one, showbase
428         long double v = -1;
429         showbase(ios);
430         wchar_t str[100];
431         output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str),
432                                             true, ios, '*', v);
433         std::wstring ex(str, iter.base());
434         assert(ex == L"CNY -0.01");
435     }
436     {   // positive, showbase
437         long double v = 123456789;
438         showbase(ios);
439         wchar_t str[100];
440         output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str),
441                                             true, ios, '*', v);
442         std::wstring ex(str, iter.base());
443         assert(ex == L"CNY 1,234,567.89");
444     }
445     {   // negative, showbase
446         long double v = -123456789;
447         showbase(ios);
448         wchar_t str[100];
449         output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str),
450                                             true, ios, '*', v);
451         std::wstring ex(str, iter.base());
452         assert(ex == L"CNY -1,234,567.89");
453     }
454     {   // negative, showbase, left
455         long double v = -123456789;
456         showbase(ios);
457         ios.width(20);
458         left(ios);
459         wchar_t str[100];
460         output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str),
461                                             true, ios, ' ', v);
462         std::wstring ex(str, iter.base());
463         assert(ex == L"CNY -1,234,567.89   ");
464         assert(ios.width() == 0);
465     }
466     {   // negative, showbase, internal
467         long double v = -123456789;
468         showbase(ios);
469         ios.width(20);
470         internal(ios);
471         wchar_t str[100];
472         output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str),
473                                             true, ios, ' ', v);
474         std::wstring ex(str, iter.base());
475         assert(ex == L"CNY -   1,234,567.89");
476         assert(ios.width() == 0);
477     }
478     {   // negative, showbase, right
479         long double v = -123456789;
480         showbase(ios);
481         ios.width(20);
482         right(ios);
483         wchar_t str[100];
484         output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str),
485                                             true, ios, ' ', v);
486         std::wstring ex(str, iter.base());
487         assert(ex == L"   CNY -1,234,567.89");
488         assert(ios.width() == 0);
489     }
490 }
491 }
492