1 //===----------------------------------------------------------------------===//
3 // The LLVM Compiler Infrastructure
5 // This file is dual licensed under the MIT and the University of Illinois Open
6 // Source Licenses. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // REQUIRES: locale.zh_CN.UTF-8
14 // class money_put<charT, OutputIterator>
16 // iter_type put(iter_type s, bool intl, ios_base& f, char_type fill,
17 // long double units) const;
23 #include "test_iterators.h"
25 #include "platform_support.h" // locale name macros
27 typedef std::money_put<char, output_iterator<char*> > Fn;
33 explicit my_facet(std::size_t refs = 0)
37 typedef std::money_put<wchar_t, output_iterator<wchar_t*> > Fw;
43 explicit my_facetw(std::size_t refs = 0)
50 std::string loc_name(LOCALE_zh_CN_UTF_8);
51 ios.imbue(std::locale(ios.getloc(),
52 new std::moneypunct_byname<char, false>(loc_name)));
53 ios.imbue(std::locale(ios.getloc(),
54 new std::moneypunct_byname<char, true>(loc_name)));
55 ios.imbue(std::locale(ios.getloc(),
56 new std::moneypunct_byname<wchar_t, false>(loc_name)));
57 ios.imbue(std::locale(ios.getloc(),
58 new std::moneypunct_byname<wchar_t, true>(loc_name)));
65 output_iterator<char*> iter = f.put(output_iterator<char*>(str),
67 std::string ex(str, iter.base());
73 output_iterator<char*> iter = f.put(output_iterator<char*>(str),
75 std::string ex(str, iter.base());
76 assert(ex == "-0.01");
79 long double v = 123456789;
81 output_iterator<char*> iter = f.put(output_iterator<char*>(str),
83 std::string ex(str, iter.base());
84 assert(ex == "1,234,567.89");
87 long double v = -123456789;
89 output_iterator<char*> iter = f.put(output_iterator<char*>(str),
91 std::string ex(str, iter.base());
92 assert(ex == "-1,234,567.89");
98 output_iterator<char*> iter = f.put(output_iterator<char*>(str),
100 std::string ex(str, iter.base());
101 assert(ex == "\xEF\xBF\xA5""0.00");
103 { // negative one, showbase
107 output_iterator<char*> iter = f.put(output_iterator<char*>(str),
109 std::string ex(str, iter.base());
110 assert(ex == "\xEF\xBF\xA5""-0.01");
112 { // positive, showbase
113 long double v = 123456789;
116 output_iterator<char*> iter = f.put(output_iterator<char*>(str),
118 std::string ex(str, iter.base());
119 assert(ex == "\xEF\xBF\xA5""1,234,567.89");
121 { // negative, showbase
122 long double v = -123456789;
125 output_iterator<char*> iter = f.put(output_iterator<char*>(str),
127 std::string ex(str, iter.base());
128 assert(ex == "\xEF\xBF\xA5""-1,234,567.89");
130 { // negative, showbase, left
131 long double v = -123456789;
136 output_iterator<char*> iter = f.put(output_iterator<char*>(str),
138 std::string ex(str, iter.base());
139 assert(ex == "\xEF\xBF\xA5""-1,234,567.89 ");
140 assert(ios.width() == 0);
142 { // negative, showbase, internal
143 long double v = -123456789;
148 output_iterator<char*> iter = f.put(output_iterator<char*>(str),
150 std::string ex(str, iter.base());
151 assert(ex == "\xEF\xBF\xA5""- 1,234,567.89");
152 assert(ios.width() == 0);
154 { // negative, showbase, right
155 long double v = -123456789;
160 output_iterator<char*> iter = f.put(output_iterator<char*>(str),
162 std::string ex(str, iter.base());
163 assert(ex == " \xEF\xBF\xA5""-1,234,567.89");
164 assert(ios.width() == 0);
167 // char, international
169 ios.unsetf(std::ios_base::adjustfield);
173 output_iterator<char*> iter = f.put(output_iterator<char*>(str),
175 std::string ex(str, iter.base());
176 assert(ex == "0.00");
181 output_iterator<char*> iter = f.put(output_iterator<char*>(str),
183 std::string ex(str, iter.base());
184 assert(ex == "-0.01");
187 long double v = 123456789;
189 output_iterator<char*> iter = f.put(output_iterator<char*>(str),
191 std::string ex(str, iter.base());
192 assert(ex == "1,234,567.89");
195 long double v = -123456789;
197 output_iterator<char*> iter = f.put(output_iterator<char*>(str),
199 std::string ex(str, iter.base());
200 assert(ex == "-1,234,567.89");
206 output_iterator<char*> iter = f.put(output_iterator<char*>(str),
208 std::string ex(str, iter.base());
209 assert(ex == "CNY 0.00");
211 { // negative one, showbase
215 output_iterator<char*> iter = f.put(output_iterator<char*>(str),
217 std::string ex(str, iter.base());
218 assert(ex == "CNY -0.01");
220 { // positive, showbase
221 long double v = 123456789;
224 output_iterator<char*> iter = f.put(output_iterator<char*>(str),
226 std::string ex(str, iter.base());
227 assert(ex == "CNY 1,234,567.89");
229 { // negative, showbase
230 long double v = -123456789;
233 output_iterator<char*> iter = f.put(output_iterator<char*>(str),
235 std::string ex(str, iter.base());
236 assert(ex == "CNY -1,234,567.89");
238 { // negative, showbase, left
239 long double v = -123456789;
244 output_iterator<char*> iter = f.put(output_iterator<char*>(str),
246 std::string ex(str, iter.base());
247 assert(ex == "CNY -1,234,567.89 ");
248 assert(ios.width() == 0);
250 { // negative, showbase, internal
251 long double v = -123456789;
256 output_iterator<char*> iter = f.put(output_iterator<char*>(str),
258 std::string ex(str, iter.base());
259 assert(ex == "CNY - 1,234,567.89");
260 assert(ios.width() == 0);
262 { // negative, showbase, right
263 long double v = -123456789;
268 output_iterator<char*> iter = f.put(output_iterator<char*>(str),
270 std::string ex(str, iter.base());
271 assert(ex == " CNY -1,234,567.89");
272 assert(ios.width() == 0);
276 const my_facetw f(1);
279 ios.unsetf(std::ios_base::adjustfield);
283 output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str),
285 std::wstring ex(str, iter.base());
286 assert(ex == L"0.00");
291 output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str),
293 std::wstring ex(str, iter.base());
294 assert(ex == L"-0.01");
297 long double v = 123456789;
299 output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str),
301 std::wstring ex(str, iter.base());
302 assert(ex == L"1,234,567.89");
305 long double v = -123456789;
307 output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str),
309 std::wstring ex(str, iter.base());
310 assert(ex == L"-1,234,567.89");
316 output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str),
318 std::wstring ex(str, iter.base());
319 assert(ex == L"\xFFE5""0.00");
321 { // negative one, showbase
325 output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str),
327 std::wstring ex(str, iter.base());
328 assert(ex == L"\xFFE5""-0.01");
330 { // positive, showbase
331 long double v = 123456789;
334 output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str),
336 std::wstring ex(str, iter.base());
337 assert(ex == L"\xFFE5""1,234,567.89");
339 { // negative, showbase
340 long double v = -123456789;
343 output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str),
345 std::wstring ex(str, iter.base());
346 assert(ex == L"\xFFE5""-1,234,567.89");
348 { // negative, showbase, left
349 long double v = -123456789;
354 output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str),
356 std::wstring ex(str, iter.base());
357 assert(ex == L"\xFFE5""-1,234,567.89 ");
358 assert(ios.width() == 0);
360 { // negative, showbase, internal
361 long double v = -123456789;
366 output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str),
368 std::wstring ex(str, iter.base());
369 assert(ex == L"\xFFE5""- 1,234,567.89");
370 assert(ios.width() == 0);
372 { // negative, showbase, right
373 long double v = -123456789;
378 output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str),
380 std::wstring ex(str, iter.base());
381 assert(ex == L" \xFFE5""-1,234,567.89");
382 assert(ios.width() == 0);
385 // wchar_t, international
387 ios.unsetf(std::ios_base::adjustfield);
391 output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str),
393 std::wstring ex(str, iter.base());
394 assert(ex == L"0.00");
399 output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str),
401 std::wstring ex(str, iter.base());
402 assert(ex == L"-0.01");
405 long double v = 123456789;
407 output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str),
409 std::wstring ex(str, iter.base());
410 assert(ex == L"1,234,567.89");
413 long double v = -123456789;
415 output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str),
417 std::wstring ex(str, iter.base());
418 assert(ex == L"-1,234,567.89");
424 output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str),
426 std::wstring ex(str, iter.base());
427 assert(ex == L"CNY 0.00");
429 { // negative one, showbase
433 output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str),
435 std::wstring ex(str, iter.base());
436 assert(ex == L"CNY -0.01");
438 { // positive, showbase
439 long double v = 123456789;
442 output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str),
444 std::wstring ex(str, iter.base());
445 assert(ex == L"CNY 1,234,567.89");
447 { // negative, showbase
448 long double v = -123456789;
451 output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str),
453 std::wstring ex(str, iter.base());
454 assert(ex == L"CNY -1,234,567.89");
456 { // negative, showbase, left
457 long double v = -123456789;
462 output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str),
464 std::wstring ex(str, iter.base());
465 assert(ex == L"CNY -1,234,567.89 ");
466 assert(ios.width() == 0);
468 { // negative, showbase, internal
469 long double v = -123456789;
474 output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str),
476 std::wstring ex(str, iter.base());
477 assert(ex == L"CNY - 1,234,567.89");
478 assert(ios.width() == 0);
480 { // negative, showbase, right
481 long double v = -123456789;
486 output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str),
488 std::wstring ex(str, iter.base());
489 assert(ex == L" CNY -1,234,567.89");
490 assert(ios.width() == 0);