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