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// TODO(mordante) Investigate
10// UNSUPPORTED: apple-clang
11
12// NetBSD does not support LC_MONETARY at the moment
13// XFAIL: netbsd
14
15// XFAIL: LIBCXX-FREEBSD-FIXME
16
17// REQUIRES: locale.en_US.UTF-8
18// REQUIRES: locale.fr_FR.UTF-8
19// REQUIRES: locale.ru_RU.UTF-8
20// REQUIRES: locale.zh_CN.UTF-8
21
22// <locale>
23
24// class moneypunct_byname<charT, International>
25
26// pattern neg_format() const;
27
28#include <locale>
29#include <limits>
30#include <cassert>
31
32#include "test_macros.h"
33#include "platform_support.h" // locale name macros
34
35class Fnf
36 : public std::moneypunct_byname<char, false>
37{
38public:
39 explicit Fnf(const std::string& nm, std::size_t refs = 0)
40 : std::moneypunct_byname<char, false>(nm, refs) {}
41};
42
43class Fnt
44 : public std::moneypunct_byname<char, true>
45{
46public:
47 explicit Fnt(const std::string& nm, std::size_t refs = 0)
48 : std::moneypunct_byname<char, true>(nm, refs) {}
49};
50
51#ifndef TEST_HAS_NO_WIDE_CHARACTERS
52class Fwf
53 : public std::moneypunct_byname<wchar_t, false>
54{
55public:
56 explicit Fwf(const std::string& nm, std::size_t refs = 0)
57 : std::moneypunct_byname<wchar_t, false>(nm, refs) {}
58};
59
60class Fwt
61 : public std::moneypunct_byname<wchar_t, true>
62{
63public:
64 explicit Fwt(const std::string& nm, std::size_t refs = 0)
65 : std::moneypunct_byname<wchar_t, true>(nm, refs) {}
66};
67#endif // TEST_HAS_NO_WIDE_CHARACTERS
68
69void assert_symbol_sign_none_value(std::money_base::pattern p)
70{
71 assert(p.field[0] == std::money_base::symbol);
72 assert(p.field[1] == std::money_base::sign);
73 assert(p.field[2] == std::money_base::none);
74 assert(p.field[3] == std::money_base::value);
75}
76
77void assert_sign_symbol_none_value(std::money_base::pattern p)
78{
79 assert(p.field[0] == std::money_base::sign);
80 assert(p.field[1] == std::money_base::symbol);
81 assert(p.field[2] == std::money_base::none);
82 assert(p.field[3] == std::money_base::value);
83}
84
85void assert_value_none_symbol_sign(std::money_base::pattern p)
86{
87 assert(p.field[0] == std::money_base::value);
88 assert(p.field[1] == std::money_base::none);
89 assert(p.field[2] == std::money_base::symbol);
90 assert(p.field[3] == std::money_base::sign);
91}
92
93void assert_sign_value_none_symbol(std::money_base::pattern p)
94{
95 assert(p.field[0] == std::money_base::sign);
96 assert(p.field[1] == std::money_base::value);
97 assert(p.field[2] == std::money_base::none);
98 assert(p.field[3] == std::money_base::symbol);
99}
100
101int main(int, char**)
102{
103 {
104 Fnf f("C", 1);
105 std::money_base::pattern p = f.neg_format();
106 assert_symbol_sign_none_value(p);
107 }
108 {
109 Fnt f("C", 1);
110 std::money_base::pattern p = f.neg_format();
111 assert_symbol_sign_none_value(p);
112 }
113#ifndef TEST_HAS_NO_WIDE_CHARACTERS
114 {
115 Fwf f("C", 1);
116 std::money_base::pattern p = f.neg_format();
117 assert_symbol_sign_none_value(p);
118 }
119 {
120 Fwt f("C", 1);
121 std::money_base::pattern p = f.neg_format();
122 assert_symbol_sign_none_value(p);
123 }
124#endif // TEST_HAS_NO_WIDE_CHARACTERS
125
126 {
127 Fnf f(LOCALE_en_US_UTF_8, 1);
128 std::money_base::pattern p = f.neg_format();
129 assert_sign_symbol_none_value(p);
130 }
131 {
132 Fnt f(LOCALE_en_US_UTF_8, 1);
133 std::money_base::pattern p = f.neg_format();
134 assert_sign_symbol_none_value(p);
135 }
136#ifndef TEST_HAS_NO_WIDE_CHARACTERS
137 {
138 Fwf f(LOCALE_en_US_UTF_8, 1);
139 std::money_base::pattern p = f.neg_format();
140 assert_sign_symbol_none_value(p);
141 }
142 {
143 Fwt f(LOCALE_en_US_UTF_8, 1);
144 std::money_base::pattern p = f.neg_format();
145 assert_sign_symbol_none_value(p);
146 }
147#endif // TEST_HAS_NO_WIDE_CHARACTERS
148
149 {
150 Fnf f(LOCALE_fr_FR_UTF_8, 1);
151 std::money_base::pattern p = f.neg_format();
152#ifdef __APPLE__
153 assert_value_none_symbol_sign(p);
154#else
155 assert_sign_value_none_symbol(p);
156#endif
157 }
158 {
159 Fnt f(LOCALE_fr_FR_UTF_8, 1);
160 std::money_base::pattern p = f.neg_format();
161#ifdef __APPLE__
162 assert_value_none_symbol_sign(p);
163#else
164 assert_sign_value_none_symbol(p);
165#endif
166 }
167#ifndef TEST_HAS_NO_WIDE_CHARACTERS
168 {
169 Fwf f(LOCALE_fr_FR_UTF_8, 1);
170 std::money_base::pattern p = f.neg_format();
171#ifdef __APPLE__
172 assert_value_none_symbol_sign(p);
173#else
174 assert_sign_value_none_symbol(p);
175#endif
176 }
177 {
178 Fwt f(LOCALE_fr_FR_UTF_8, 1);
179 std::money_base::pattern p = f.neg_format();
180#ifdef __APPLE__
181 assert_value_none_symbol_sign(p);
182#else
183 assert_sign_value_none_symbol(p);
184#endif
185 }
186#endif // TEST_HAS_NO_WIDE_CHARACTERS
187
188 {
189 Fnf f(LOCALE_ru_RU_UTF_8, 1);
190 std::money_base::pattern p = f.neg_format();
191 assert_sign_value_none_symbol(p);
192 }
193 {
194 Fnt f(LOCALE_ru_RU_UTF_8, 1);
195 std::money_base::pattern p = f.neg_format();
196 assert_sign_value_none_symbol(p);
197 }
198#ifndef TEST_HAS_NO_WIDE_CHARACTERS
199 {
200 Fwf f(LOCALE_ru_RU_UTF_8, 1);
201 std::money_base::pattern p = f.neg_format();
202 assert_sign_value_none_symbol(p);
203 }
204 {
205 Fwt f(LOCALE_ru_RU_UTF_8, 1);
206 std::money_base::pattern p = f.neg_format();
207 assert_sign_value_none_symbol(p);
208 }
209#endif // TEST_HAS_NO_WIDE_CHARACTERS
210
211 {
212 Fnf f(LOCALE_zh_CN_UTF_8, 1);
213 std::money_base::pattern p = f.neg_format();
214#ifdef _AIX
215 assert_sign_symbol_none_value(p);
216#else
217 assert_symbol_sign_none_value(p);
218#endif
219 }
220 {
221 Fnt f(LOCALE_zh_CN_UTF_8, 1);
222 std::money_base::pattern p = f.neg_format();
223#if defined(_WIN32) || defined(__APPLE__)
224 assert_symbol_sign_none_value(p);
225#else
226 assert_sign_symbol_none_value(p);
227#endif
228 }
229#ifndef TEST_HAS_NO_WIDE_CHARACTERS
230 {
231 Fwf f(LOCALE_zh_CN_UTF_8, 1);
232 std::money_base::pattern p = f.neg_format();
233#ifdef _AIX
234 assert_sign_symbol_none_value(p);
235#else
236 assert_symbol_sign_none_value(p);
237#endif
238 }
239 {
240 Fwt f(LOCALE_zh_CN_UTF_8, 1);
241 std::money_base::pattern p = f.neg_format();
242#if defined(_WIN32) || defined(__APPLE__)
243 assert_symbol_sign_none_value(p);
244#else
245 assert_sign_symbol_none_value(p);
246#endif
247 }
248#endif // TEST_HAS_NO_WIDE_CHARACTERS
249
250 return 0;
251}
252

source code of libcxx/test/std/localization/locale.categories/category.monetary/locale.moneypunct.byname/neg_format.pass.cpp