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