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 // const string_type& 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_en_US_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 std::string 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 std::string 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 std::string 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 std::string 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 std::string 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 == "$0.00"); 100 } 101 { // negative one, showbase 102 std::string 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 == "-$0.01"); 109 } 110 { // positive, showbase 111 std::string 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 == "$1,234,567.89"); 118 } 119 { // negative, showbase 120 std::string 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 == "-$1,234,567.89"); 127 } 128 { // negative, showbase, left 129 std::string 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 == "-$1,234,567.89 "); 138 assert(ios.width() == 0); 139 } 140 { // negative, showbase, internal 141 std::string 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 == "-$ 1,234,567.89"); 150 assert(ios.width() == 0); 151 } 152 { // negative, showbase, right 153 std::string 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 == " -$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 std::string 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 std::string 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 std::string 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 std::string 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 std::string 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 == "USD 0.00"); 208 } 209 { // negative one, showbase 210 std::string 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 == "-USD 0.01"); 217 } 218 { // positive, showbase 219 std::string 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 == "USD 1,234,567.89"); 226 } 227 { // negative, showbase 228 std::string 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 == "-USD 1,234,567.89"); 235 } 236 { // negative, showbase, left 237 std::string 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 == "-USD 1,234,567.89 "); 246 assert(ios.width() == 0); 247 } 248 { // negative, showbase, internal 249 std::string 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 == "-USD 1,234,567.89"); 258 assert(ios.width() == 0); 259 } 260 { // negative, showbase, right 261 std::string 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 == " -USD 1,234,567.89"); 270 assert(ios.width() == 0); 271 } 272 } 273 { 274 275 const my_facetw f(1); 276 // wchar_t, national 277 noshowbase(ios); 278 ios.unsetf(std::ios_base::adjustfield); 279 { // zero 280 std::wstring v = L"0"; 281 wchar_t str[100]; 282 output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str), 283 false, ios, '*', v); 284 std::wstring ex(str, iter.base()); 285 assert(ex == L"0.00"); 286 } 287 { // negative one 288 std::wstring v = L"-1"; 289 wchar_t str[100]; 290 output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str), 291 false, ios, '*', v); 292 std::wstring ex(str, iter.base()); 293 assert(ex == L"-0.01"); 294 } 295 { // positive 296 std::wstring v = L"123456789"; 297 wchar_t str[100]; 298 output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str), 299 false, ios, '*', v); 300 std::wstring ex(str, iter.base()); 301 assert(ex == L"1,234,567.89"); 302 } 303 { // negative 304 std::wstring v = L"-123456789"; 305 wchar_t str[100]; 306 output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str), 307 false, ios, '*', v); 308 std::wstring ex(str, iter.base()); 309 assert(ex == L"-1,234,567.89"); 310 } 311 { // zero, showbase 312 std::wstring v = L"0"; 313 showbase(ios); 314 wchar_t str[100]; 315 output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str), 316 false, ios, '*', v); 317 std::wstring ex(str, iter.base()); 318 assert(ex == L"$0.00"); 319 } 320 { // negative one, showbase 321 std::wstring v = L"-1"; 322 showbase(ios); 323 wchar_t str[100]; 324 output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str), 325 false, ios, '*', v); 326 std::wstring ex(str, iter.base()); 327 assert(ex == L"-$0.01"); 328 } 329 { // positive, showbase 330 std::wstring v = L"123456789"; 331 showbase(ios); 332 wchar_t str[100]; 333 output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str), 334 false, ios, '*', v); 335 std::wstring ex(str, iter.base()); 336 assert(ex == L"$1,234,567.89"); 337 } 338 { // negative, showbase 339 std::wstring v = L"-123456789"; 340 showbase(ios); 341 wchar_t str[100]; 342 output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str), 343 false, ios, '*', v); 344 std::wstring ex(str, iter.base()); 345 assert(ex == L"-$1,234,567.89"); 346 } 347 { // negative, showbase, left 348 std::wstring v = L"-123456789"; 349 showbase(ios); 350 ios.width(20); 351 left(ios); 352 wchar_t str[100]; 353 output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str), 354 false, ios, ' ', v); 355 std::wstring ex(str, iter.base()); 356 assert(ex == L"-$1,234,567.89 "); 357 assert(ios.width() == 0); 358 } 359 { // negative, showbase, internal 360 std::wstring v = L"-123456789"; 361 showbase(ios); 362 ios.width(20); 363 internal(ios); 364 wchar_t str[100]; 365 output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str), 366 false, ios, ' ', v); 367 std::wstring ex(str, iter.base()); 368 assert(ex == L"-$ 1,234,567.89"); 369 assert(ios.width() == 0); 370 } 371 { // negative, showbase, right 372 std::wstring v = L"-123456789"; 373 showbase(ios); 374 ios.width(20); 375 right(ios); 376 wchar_t str[100]; 377 output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str), 378 false, ios, ' ', v); 379 std::wstring ex(str, iter.base()); 380 assert(ex == L" -$1,234,567.89"); 381 assert(ios.width() == 0); 382 } 383 384 // wchar_t, international 385 noshowbase(ios); 386 ios.unsetf(std::ios_base::adjustfield); 387 { // zero 388 std::wstring v = L"0"; 389 wchar_t str[100]; 390 output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str), 391 true, ios, '*', v); 392 std::wstring ex(str, iter.base()); 393 assert(ex == L"0.00"); 394 } 395 { // negative one 396 std::wstring v = L"-1"; 397 wchar_t str[100]; 398 output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str), 399 true, ios, '*', v); 400 std::wstring ex(str, iter.base()); 401 assert(ex == L"-0.01"); 402 } 403 { // positive 404 std::wstring v = L"123456789"; 405 wchar_t str[100]; 406 output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str), 407 true, ios, '*', v); 408 std::wstring ex(str, iter.base()); 409 assert(ex == L"1,234,567.89"); 410 } 411 { // negative 412 std::wstring v = L"-123456789"; 413 wchar_t str[100]; 414 output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str), 415 true, ios, '*', v); 416 std::wstring ex(str, iter.base()); 417 assert(ex == L"-1,234,567.89"); 418 } 419 { // zero, showbase 420 std::wstring v = L"0"; 421 showbase(ios); 422 wchar_t str[100]; 423 output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str), 424 true, ios, '*', v); 425 std::wstring ex(str, iter.base()); 426 assert(ex == L"USD 0.00"); 427 } 428 { // negative one, showbase 429 std::wstring v = L"-1"; 430 showbase(ios); 431 wchar_t str[100]; 432 output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str), 433 true, ios, '*', v); 434 std::wstring ex(str, iter.base()); 435 assert(ex == L"-USD 0.01"); 436 } 437 { // positive, showbase 438 std::wstring v = L"123456789"; 439 showbase(ios); 440 wchar_t str[100]; 441 output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str), 442 true, ios, '*', v); 443 std::wstring ex(str, iter.base()); 444 assert(ex == L"USD 1,234,567.89"); 445 } 446 { // negative, showbase 447 std::wstring v = L"-123456789"; 448 showbase(ios); 449 wchar_t str[100]; 450 output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str), 451 true, ios, '*', v); 452 std::wstring ex(str, iter.base()); 453 assert(ex == L"-USD 1,234,567.89"); 454 } 455 { // negative, showbase, left 456 std::wstring v = L"-123456789"; 457 showbase(ios); 458 ios.width(20); 459 left(ios); 460 wchar_t str[100]; 461 output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str), 462 true, ios, ' ', v); 463 std::wstring ex(str, iter.base()); 464 assert(ex == L"-USD 1,234,567.89 "); 465 assert(ios.width() == 0); 466 } 467 { // negative, showbase, internal 468 std::wstring v = L"-123456789"; 469 showbase(ios); 470 ios.width(20); 471 internal(ios); 472 wchar_t str[100]; 473 output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str), 474 true, ios, ' ', v); 475 std::wstring ex(str, iter.base()); 476 assert(ex == L"-USD 1,234,567.89"); 477 assert(ios.width() == 0); 478 } 479 { // negative, showbase, right 480 std::wstring v = L"-123456789"; 481 showbase(ios); 482 ios.width(20); 483 right(ios); 484 wchar_t str[100]; 485 output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str), 486 true, ios, ' ', v); 487 std::wstring ex(str, iter.base()); 488 assert(ex == L" -USD 1,234,567.89"); 489 assert(ios.width() == 0); 490 } 491 } 492 } 493