xref: /llvm-project/libcxx/test/std/input.output/iostream.format/ext.manip/put_money.pass.cpp (revision bce3b505931cee9dc79d1c56c021983b4a8fb819)
1 //===----------------------------------------------------------------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 // <iomanip>
10 
11 // template <class charT, class moneyT> T8 put_money(const moneyT& mon, bool intl = false);
12 
13 // Bionic has minimal locale support, investigate this later.
14 // XFAIL: LIBCXX-ANDROID-FIXME
15 
16 // REQUIRES: locale.en_US.UTF-8
17 
18 #include <iomanip>
19 #include <ostream>
20 #include <cassert>
21 
22 #include "test_macros.h"
23 #include "platform_support.h" // locale name macros
24 
25 template <class CharT>
26 class testbuf
27     : public std::basic_streambuf<CharT>
28 {
29     typedef std::basic_streambuf<CharT> base;
30     std::basic_string<CharT> str_;
31 public:
testbuf()32     testbuf()
33     {
34     }
35 
str() const36     std::basic_string<CharT> str() const
37         {return std::basic_string<CharT>(base::pbase(), base::pptr());}
38 
39 protected:
40 
41     virtual typename base::int_type
overflow(typename base::int_type ch=base::traits_type::eof ())42         overflow(typename base::int_type ch = base::traits_type::eof())
43         {
44             if (ch != base::traits_type::eof())
45             {
46                 int n = str_.size();
47                 str_.push_back(static_cast<CharT>(ch));
48                 str_.resize(str_.capacity());
49                 base::setp(const_cast<CharT*>(str_.data()),
50                            const_cast<CharT*>(str_.data() + str_.size()));
51                 base::pbump(n+1);
52             }
53             return ch;
54         }
55 };
56 
main(int,char **)57 int main(int, char**)
58 {
59     {
60         testbuf<char> sb;
61         std::ostream os(&sb);
62         os.imbue(std::locale(LOCALE_en_US_UTF_8));
63         std::showbase(os);
64         long double x = -123456789;
65         os << std::put_money(x, false);
66 #if defined(_WIN32)
67         assert(sb.str() == "($1,234,567.89)");
68 #else
69         assert(sb.str() == "-$1,234,567.89");
70 #endif
71     }
72     {
73         testbuf<char> sb;
74         std::ostream os(&sb);
75         os.imbue(std::locale(LOCALE_en_US_UTF_8));
76         std::showbase(os);
77         long double x = -123456789;
78         os << std::put_money(x, true);
79 #if defined(_WIN32)
80         assert(sb.str() == "(USD1,234,567.89)");
81 #else
82         assert(sb.str() == "-USD 1,234,567.89");
83 #endif
84     }
85 #ifndef TEST_HAS_NO_WIDE_CHARACTERS
86     {
87         testbuf<wchar_t> sb;
88         std::wostream os(&sb);
89         os.imbue(std::locale(LOCALE_en_US_UTF_8));
90         std::showbase(os);
91         long double x = -123456789;
92         os << std::put_money(x, false);
93 #if defined(_WIN32)
94         assert(sb.str() == L"($1,234,567.89)");
95 #else
96         assert(sb.str() == L"-$1,234,567.89");
97 #endif
98     }
99     {
100         testbuf<wchar_t> sb;
101         std::wostream os(&sb);
102         os.imbue(std::locale(LOCALE_en_US_UTF_8));
103         std::showbase(os);
104         long double x = -123456789;
105         os << std::put_money(x, true);
106 #if defined(_WIN32)
107         assert(sb.str() == L"(USD1,234,567.89)");
108 #else
109         assert(sb.str() == L"-USD 1,234,567.89");
110 #endif
111     }
112 #endif
113 
114   return 0;
115 }
116