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_get<charT, InputIterator> 13 14 // iter_type get(iter_type b, iter_type e, bool intl, ios_base& iob, 15 // ios_base::iostate& err, string_type& v) const; 16 17 // REQUIRES: locale.en_US.UTF-8 18 19 #include <locale> 20 #include <ios> 21 #include <streambuf> 22 #include <cassert> 23 #include "test_iterators.h" 24 25 #include "platform_support.h" // locale name macros 26 27 typedef std::money_get<char, input_iterator<const char*> > Fn; 28 29 class my_facet 30 : public Fn 31 { 32 public: 33 explicit my_facet(std::size_t refs = 0) 34 : Fn(refs) {} 35 }; 36 37 typedef std::money_get<wchar_t, input_iterator<const wchar_t*> > Fw; 38 39 class my_facetw 40 : public Fw 41 { 42 public: 43 explicit my_facetw(std::size_t refs = 0) 44 : Fw(refs) {} 45 }; 46 47 int main() 48 { 49 std::ios ios(0); 50 std::string loc_name(LOCALE_en_US_UTF_8); 51 ios.imbue(std::locale(ios.getloc(), 52 new std::moneypunct_byname<char, false>(loc_name))); 53 ios.imbue(std::locale(ios.getloc(), 54 new std::moneypunct_byname<char, true>(loc_name))); 55 ios.imbue(std::locale(ios.getloc(), 56 new std::moneypunct_byname<wchar_t, false>(loc_name))); 57 ios.imbue(std::locale(ios.getloc(), 58 new std::moneypunct_byname<wchar_t, true>(loc_name))); 59 { 60 const my_facet f(1); 61 // char, national 62 { // zero 63 std::string v = "0.00"; 64 typedef input_iterator<const char*> I; 65 std::string ex; 66 std::ios_base::iostate err = std::ios_base::goodbit; 67 I iter = f.get(I(v.data()), I(v.data() + v.size()), 68 false, ios, err, ex); 69 assert(iter.base() == v.data() + v.size()); 70 assert(err == std::ios_base::eofbit); 71 assert(ex == "0"); 72 } 73 { // negative one 74 std::string v = "-0.01"; 75 typedef input_iterator<const char*> I; 76 std::string ex; 77 std::ios_base::iostate err = std::ios_base::goodbit; 78 I iter = f.get(I(v.data()), I(v.data() + v.size()), 79 false, ios, err, ex); 80 assert(iter.base() == v.data() + v.size()); 81 assert(err == std::ios_base::eofbit); 82 assert(ex == "-1"); 83 } 84 { // positive 85 std::string v = "1,234,567.89"; 86 typedef input_iterator<const char*> I; 87 std::string ex; 88 std::ios_base::iostate err = std::ios_base::goodbit; 89 I iter = f.get(I(v.data()), I(v.data() + v.size()), 90 false, ios, err, ex); 91 assert(iter.base() == v.data() + v.size()); 92 assert(err == std::ios_base::eofbit); 93 assert(ex == "123456789"); 94 } 95 { // negative 96 std::string v = "-1,234,567.89"; 97 typedef input_iterator<const char*> I; 98 std::string ex; 99 std::ios_base::iostate err = std::ios_base::goodbit; 100 I iter = f.get(I(v.data()), I(v.data() + v.size()), 101 false, ios, err, ex); 102 assert(iter.base() == v.data() + v.size()); 103 assert(err == std::ios_base::eofbit); 104 assert(ex == "-123456789"); 105 } 106 { // negative 107 std::string v = "-1234567.89"; 108 typedef input_iterator<const char*> I; 109 std::string ex; 110 std::ios_base::iostate err = std::ios_base::goodbit; 111 I iter = f.get(I(v.data()), I(v.data() + v.size()), 112 false, ios, err, ex); 113 assert(iter.base() == v.data() + v.size()); 114 assert(err == std::ios_base::eofbit); 115 assert(ex == "-123456789"); 116 } 117 { // zero, showbase 118 std::string v = "$0.00"; 119 typedef input_iterator<const char*> I; 120 std::string ex; 121 std::ios_base::iostate err = std::ios_base::goodbit; 122 I iter = f.get(I(v.data()), I(v.data() + v.size()), 123 false, ios, err, ex); 124 assert(iter.base() == v.data() + v.size()); 125 assert(err == std::ios_base::eofbit); 126 assert(ex == "0"); 127 } 128 { // zero, showbase 129 std::string v = "$0.00"; 130 showbase(ios); 131 typedef input_iterator<const char*> I; 132 std::string ex; 133 std::ios_base::iostate err = std::ios_base::goodbit; 134 I iter = f.get(I(v.data()), I(v.data() + v.size()), 135 false, ios, err, ex); 136 assert(iter.base() == v.data() + v.size()); 137 assert(err == std::ios_base::eofbit); 138 assert(ex == "0"); 139 noshowbase(ios); 140 } 141 { // negative one, showbase 142 std::string v = "-$0.01"; 143 typedef input_iterator<const char*> I; 144 std::string ex; 145 std::ios_base::iostate err = std::ios_base::goodbit; 146 I iter = f.get(I(v.data()), I(v.data() + v.size()), 147 false, ios, err, ex); 148 assert(iter.base() == v.data() + v.size()); 149 assert(err == std::ios_base::eofbit); 150 assert(ex == "-1"); 151 } 152 { // negative one, showbase 153 std::string v = "-$0.01"; 154 showbase(ios); 155 typedef input_iterator<const char*> I; 156 std::string ex; 157 std::ios_base::iostate err = std::ios_base::goodbit; 158 I iter = f.get(I(v.data()), I(v.data() + v.size()), 159 false, ios, err, ex); 160 assert(iter.base() == v.data() + v.size()); 161 assert(err == std::ios_base::eofbit); 162 assert(ex == "-1"); 163 noshowbase(ios); 164 } 165 { // positive, showbase 166 std::string v = "$1,234,567.89"; 167 typedef input_iterator<const char*> I; 168 std::string ex; 169 std::ios_base::iostate err = std::ios_base::goodbit; 170 I iter = f.get(I(v.data()), I(v.data() + v.size()), 171 false, ios, err, ex); 172 assert(iter.base() == v.data() + v.size()); 173 assert(err == std::ios_base::eofbit); 174 assert(ex == "123456789"); 175 } 176 { // positive, showbase 177 std::string v = "$1,234,567.89"; 178 showbase(ios); 179 typedef input_iterator<const char*> I; 180 std::string ex; 181 std::ios_base::iostate err = std::ios_base::goodbit; 182 I iter = f.get(I(v.data()), I(v.data() + v.size()), 183 false, ios, err, ex); 184 assert(iter.base() == v.data() + v.size()); 185 assert(err == std::ios_base::eofbit); 186 assert(ex == "123456789"); 187 noshowbase(ios); 188 } 189 { // negative, showbase 190 std::string v = "-$1,234,567.89"; 191 showbase(ios); 192 typedef input_iterator<const char*> I; 193 std::string ex; 194 std::ios_base::iostate err = std::ios_base::goodbit; 195 I iter = f.get(I(v.data()), I(v.data() + v.size()), 196 false, ios, err, ex); 197 assert(iter.base() == v.data() + v.size()); 198 assert(err == std::ios_base::eofbit); 199 assert(ex == "-123456789"); 200 noshowbase(ios); 201 } 202 { // negative, showbase 203 std::string v = "-USD 1,234,567.89"; 204 showbase(ios); 205 typedef input_iterator<const char*> I; 206 std::string ex; 207 std::ios_base::iostate err = std::ios_base::goodbit; 208 I iter = f.get(I(v.data()), I(v.data() + v.size()), 209 false, ios, err, ex); 210 assert(iter.base() == v.data() + 1); 211 assert(err == std::ios_base::failbit); 212 assert(ex == ""); 213 noshowbase(ios); 214 } 215 { // negative, showbase 216 std::string v = "-USD 1,234,567.89"; 217 typedef input_iterator<const char*> I; 218 std::string ex; 219 std::ios_base::iostate err = std::ios_base::goodbit; 220 I iter = f.get(I(v.data()), I(v.data() + v.size()), 221 false, ios, err, ex); 222 assert(iter.base() == v.data() + 1); 223 assert(err == std::ios_base::failbit); 224 assert(ex == ""); 225 } 226 } 227 { 228 const my_facet f(1); 229 // char, international 230 { // zero 231 std::string v = "0.00"; 232 typedef input_iterator<const char*> I; 233 std::string ex; 234 std::ios_base::iostate err = std::ios_base::goodbit; 235 I iter = f.get(I(v.data()), I(v.data() + v.size()), 236 true, ios, err, ex); 237 assert(iter.base() == v.data() + v.size()); 238 assert(err == std::ios_base::eofbit); 239 assert(ex == "0"); 240 } 241 { // negative one 242 std::string v = "-0.01"; 243 typedef input_iterator<const char*> I; 244 std::string ex; 245 std::ios_base::iostate err = std::ios_base::goodbit; 246 I iter = f.get(I(v.data()), I(v.data() + v.size()), 247 true, ios, err, ex); 248 assert(iter.base() == v.data() + v.size()); 249 assert(err == std::ios_base::eofbit); 250 assert(ex == "-1"); 251 } 252 { // positive 253 std::string v = "1,234,567.89"; 254 typedef input_iterator<const char*> I; 255 std::string ex; 256 std::ios_base::iostate err = std::ios_base::goodbit; 257 I iter = f.get(I(v.data()), I(v.data() + v.size()), 258 true, ios, err, ex); 259 assert(iter.base() == v.data() + v.size()); 260 assert(err == std::ios_base::eofbit); 261 assert(ex == "123456789"); 262 } 263 { // negative 264 std::string v = "-1,234,567.89"; 265 typedef input_iterator<const char*> I; 266 std::string ex; 267 std::ios_base::iostate err = std::ios_base::goodbit; 268 I iter = f.get(I(v.data()), I(v.data() + v.size()), 269 true, ios, err, ex); 270 assert(iter.base() == v.data() + v.size()); 271 assert(err == std::ios_base::eofbit); 272 assert(ex == "-123456789"); 273 } 274 { // negative 275 std::string v = "-1234567.89"; 276 typedef input_iterator<const char*> I; 277 std::string ex; 278 std::ios_base::iostate err = std::ios_base::goodbit; 279 I iter = f.get(I(v.data()), I(v.data() + v.size()), 280 true, ios, err, ex); 281 assert(iter.base() == v.data() + v.size()); 282 assert(err == std::ios_base::eofbit); 283 assert(ex == "-123456789"); 284 } 285 { // zero, showbase 286 std::string v = "USD 0.00"; 287 typedef input_iterator<const char*> I; 288 std::string ex; 289 std::ios_base::iostate err = std::ios_base::goodbit; 290 I iter = f.get(I(v.data()), I(v.data() + v.size()), 291 true, ios, err, ex); 292 assert(iter.base() == v.data() + v.size()); 293 assert(err == std::ios_base::eofbit); 294 assert(ex == "0"); 295 } 296 { // zero, showbase 297 std::string v = "USD 0.00"; 298 showbase(ios); 299 typedef input_iterator<const char*> I; 300 std::string ex; 301 std::ios_base::iostate err = std::ios_base::goodbit; 302 I iter = f.get(I(v.data()), I(v.data() + v.size()), 303 true, ios, err, ex); 304 assert(iter.base() == v.data() + v.size()); 305 assert(err == std::ios_base::eofbit); 306 assert(ex == "0"); 307 noshowbase(ios); 308 } 309 { // negative one, showbase 310 std::string v = "-USD 0.01"; 311 typedef input_iterator<const char*> I; 312 std::string ex; 313 std::ios_base::iostate err = std::ios_base::goodbit; 314 I iter = f.get(I(v.data()), I(v.data() + v.size()), 315 true, ios, err, ex); 316 assert(iter.base() == v.data() + v.size()); 317 assert(err == std::ios_base::eofbit); 318 assert(ex == "-1"); 319 } 320 { // negative one, showbase 321 std::string v = "-USD 0.01"; 322 showbase(ios); 323 typedef input_iterator<const char*> I; 324 std::string ex; 325 std::ios_base::iostate err = std::ios_base::goodbit; 326 I iter = f.get(I(v.data()), I(v.data() + v.size()), 327 true, ios, err, ex); 328 assert(iter.base() == v.data() + v.size()); 329 assert(err == std::ios_base::eofbit); 330 assert(ex == "-1"); 331 noshowbase(ios); 332 } 333 { // positive, showbase 334 std::string v = "USD 1,234,567.89"; 335 typedef input_iterator<const char*> I; 336 std::string ex; 337 std::ios_base::iostate err = std::ios_base::goodbit; 338 I iter = f.get(I(v.data()), I(v.data() + v.size()), 339 true, ios, err, ex); 340 assert(iter.base() == v.data() + v.size()); 341 assert(err == std::ios_base::eofbit); 342 assert(ex == "123456789"); 343 } 344 { // positive, showbase 345 std::string v = "USD 1,234,567.89"; 346 showbase(ios); 347 typedef input_iterator<const char*> I; 348 std::string ex; 349 std::ios_base::iostate err = std::ios_base::goodbit; 350 I iter = f.get(I(v.data()), I(v.data() + v.size()), 351 true, ios, err, ex); 352 assert(iter.base() == v.data() + v.size()); 353 assert(err == std::ios_base::eofbit); 354 assert(ex == "123456789"); 355 noshowbase(ios); 356 } 357 { // negative, showbase 358 std::string v = "-USD 1,234,567.89"; 359 showbase(ios); 360 typedef input_iterator<const char*> I; 361 std::string ex; 362 std::ios_base::iostate err = std::ios_base::goodbit; 363 I iter = f.get(I(v.data()), I(v.data() + v.size()), 364 true, ios, err, ex); 365 assert(iter.base() == v.data() + v.size()); 366 assert(err == std::ios_base::eofbit); 367 assert(ex == "-123456789"); 368 noshowbase(ios); 369 } 370 { // negative, showbase 371 std::string v = "-$1,234,567.89"; 372 showbase(ios); 373 typedef input_iterator<const char*> I; 374 std::string ex; 375 std::ios_base::iostate err = std::ios_base::goodbit; 376 I iter = f.get(I(v.data()), I(v.data() + v.size()), 377 true, ios, err, ex); 378 assert(iter.base() == v.data() + 1); 379 assert(err == std::ios_base::failbit); 380 assert(ex == ""); 381 noshowbase(ios); 382 } 383 { // negative, showbase 384 std::string v = "-$1,234,567.89"; 385 typedef input_iterator<const char*> I; 386 std::string ex; 387 std::ios_base::iostate err = std::ios_base::goodbit; 388 I iter = f.get(I(v.data()), I(v.data() + v.size()), 389 true, ios, err, ex); 390 assert(iter.base() == v.data() + 1); 391 assert(err == std::ios_base::failbit); 392 assert(ex == ""); 393 } 394 } 395 { 396 const my_facetw f(1); 397 // wchar_t, national 398 { // zero 399 std::wstring v = L"0.00"; 400 typedef input_iterator<const wchar_t*> I; 401 std::wstring ex; 402 std::ios_base::iostate err = std::ios_base::goodbit; 403 I iter = f.get(I(v.data()), I(v.data() + v.size()), 404 false, ios, err, ex); 405 assert(iter.base() == v.data() + v.size()); 406 assert(err == std::ios_base::eofbit); 407 assert(ex == L"0"); 408 } 409 { // negative one 410 std::wstring v = L"-0.01"; 411 typedef input_iterator<const wchar_t*> I; 412 std::wstring ex; 413 std::ios_base::iostate err = std::ios_base::goodbit; 414 I iter = f.get(I(v.data()), I(v.data() + v.size()), 415 false, ios, err, ex); 416 assert(iter.base() == v.data() + v.size()); 417 assert(err == std::ios_base::eofbit); 418 assert(ex == L"-1"); 419 } 420 { // positive 421 std::wstring v = L"1,234,567.89"; 422 typedef input_iterator<const wchar_t*> I; 423 std::wstring ex; 424 std::ios_base::iostate err = std::ios_base::goodbit; 425 I iter = f.get(I(v.data()), I(v.data() + v.size()), 426 false, ios, err, ex); 427 assert(iter.base() == v.data() + v.size()); 428 assert(err == std::ios_base::eofbit); 429 assert(ex == L"123456789"); 430 } 431 { // negative 432 std::wstring v = L"-1,234,567.89"; 433 typedef input_iterator<const wchar_t*> I; 434 std::wstring ex; 435 std::ios_base::iostate err = std::ios_base::goodbit; 436 I iter = f.get(I(v.data()), I(v.data() + v.size()), 437 false, ios, err, ex); 438 assert(iter.base() == v.data() + v.size()); 439 assert(err == std::ios_base::eofbit); 440 assert(ex == L"-123456789"); 441 } 442 { // negative 443 std::wstring v = L"-1234567.89"; 444 typedef input_iterator<const wchar_t*> I; 445 std::wstring ex; 446 std::ios_base::iostate err = std::ios_base::goodbit; 447 I iter = f.get(I(v.data()), I(v.data() + v.size()), 448 false, ios, err, ex); 449 assert(iter.base() == v.data() + v.size()); 450 assert(err == std::ios_base::eofbit); 451 assert(ex == L"-123456789"); 452 } 453 { // zero, showbase 454 std::wstring v = L"$0.00"; 455 typedef input_iterator<const wchar_t*> I; 456 std::wstring ex; 457 std::ios_base::iostate err = std::ios_base::goodbit; 458 I iter = f.get(I(v.data()), I(v.data() + v.size()), 459 false, ios, err, ex); 460 assert(iter.base() == v.data() + v.size()); 461 assert(err == std::ios_base::eofbit); 462 assert(ex == L"0"); 463 } 464 { // zero, showbase 465 std::wstring v = L"$0.00"; 466 showbase(ios); 467 typedef input_iterator<const wchar_t*> I; 468 std::wstring ex; 469 std::ios_base::iostate err = std::ios_base::goodbit; 470 I iter = f.get(I(v.data()), I(v.data() + v.size()), 471 false, ios, err, ex); 472 assert(iter.base() == v.data() + v.size()); 473 assert(err == std::ios_base::eofbit); 474 assert(ex == L"0"); 475 noshowbase(ios); 476 } 477 { // negative one, showbase 478 std::wstring v = L"-$0.01"; 479 typedef input_iterator<const wchar_t*> I; 480 std::wstring ex; 481 std::ios_base::iostate err = std::ios_base::goodbit; 482 I iter = f.get(I(v.data()), I(v.data() + v.size()), 483 false, ios, err, ex); 484 assert(iter.base() == v.data() + v.size()); 485 assert(err == std::ios_base::eofbit); 486 assert(ex == L"-1"); 487 } 488 { // negative one, showbase 489 std::wstring v = L"-$0.01"; 490 showbase(ios); 491 typedef input_iterator<const wchar_t*> I; 492 std::wstring ex; 493 std::ios_base::iostate err = std::ios_base::goodbit; 494 I iter = f.get(I(v.data()), I(v.data() + v.size()), 495 false, ios, err, ex); 496 assert(iter.base() == v.data() + v.size()); 497 assert(err == std::ios_base::eofbit); 498 assert(ex == L"-1"); 499 noshowbase(ios); 500 } 501 { // positive, showbase 502 std::wstring v = L"$1,234,567.89"; 503 typedef input_iterator<const wchar_t*> I; 504 std::wstring ex; 505 std::ios_base::iostate err = std::ios_base::goodbit; 506 I iter = f.get(I(v.data()), I(v.data() + v.size()), 507 false, ios, err, ex); 508 assert(iter.base() == v.data() + v.size()); 509 assert(err == std::ios_base::eofbit); 510 assert(ex == L"123456789"); 511 } 512 { // positive, showbase 513 std::wstring v = L"$1,234,567.89"; 514 showbase(ios); 515 typedef input_iterator<const wchar_t*> I; 516 std::wstring ex; 517 std::ios_base::iostate err = std::ios_base::goodbit; 518 I iter = f.get(I(v.data()), I(v.data() + v.size()), 519 false, ios, err, ex); 520 assert(iter.base() == v.data() + v.size()); 521 assert(err == std::ios_base::eofbit); 522 assert(ex == L"123456789"); 523 noshowbase(ios); 524 } 525 { // negative, showbase 526 std::wstring v = L"-$1,234,567.89"; 527 showbase(ios); 528 typedef input_iterator<const wchar_t*> I; 529 std::wstring ex; 530 std::ios_base::iostate err = std::ios_base::goodbit; 531 I iter = f.get(I(v.data()), I(v.data() + v.size()), 532 false, ios, err, ex); 533 assert(iter.base() == v.data() + v.size()); 534 assert(err == std::ios_base::eofbit); 535 assert(ex == L"-123456789"); 536 noshowbase(ios); 537 } 538 { // negative, showbase 539 std::wstring v = L"-USD 1,234,567.89"; 540 showbase(ios); 541 typedef input_iterator<const wchar_t*> I; 542 std::wstring ex; 543 std::ios_base::iostate err = std::ios_base::goodbit; 544 I iter = f.get(I(v.data()), I(v.data() + v.size()), 545 false, ios, err, ex); 546 assert(iter.base() == v.data() + 1); 547 assert(err == std::ios_base::failbit); 548 assert(ex == L""); 549 noshowbase(ios); 550 } 551 { // negative, showbase 552 std::wstring v = L"-USD 1,234,567.89"; 553 typedef input_iterator<const wchar_t*> I; 554 std::wstring ex; 555 std::ios_base::iostate err = std::ios_base::goodbit; 556 I iter = f.get(I(v.data()), I(v.data() + v.size()), 557 false, ios, err, ex); 558 assert(iter.base() == v.data() + 1); 559 assert(err == std::ios_base::failbit); 560 assert(ex == L""); 561 } 562 } 563 { 564 const my_facetw f(1); 565 // wchar_t, international 566 { // zero 567 std::wstring v = L"0.00"; 568 typedef input_iterator<const wchar_t*> I; 569 std::wstring ex; 570 std::ios_base::iostate err = std::ios_base::goodbit; 571 I iter = f.get(I(v.data()), I(v.data() + v.size()), 572 true, ios, err, ex); 573 assert(iter.base() == v.data() + v.size()); 574 assert(err == std::ios_base::eofbit); 575 assert(ex == L"0"); 576 } 577 { // negative one 578 std::wstring v = L"-0.01"; 579 typedef input_iterator<const wchar_t*> I; 580 std::wstring ex; 581 std::ios_base::iostate err = std::ios_base::goodbit; 582 I iter = f.get(I(v.data()), I(v.data() + v.size()), 583 true, ios, err, ex); 584 assert(iter.base() == v.data() + v.size()); 585 assert(err == std::ios_base::eofbit); 586 assert(ex == L"-1"); 587 } 588 { // positive 589 std::wstring v = L"1,234,567.89"; 590 typedef input_iterator<const wchar_t*> I; 591 std::wstring ex; 592 std::ios_base::iostate err = std::ios_base::goodbit; 593 I iter = f.get(I(v.data()), I(v.data() + v.size()), 594 true, ios, err, ex); 595 assert(iter.base() == v.data() + v.size()); 596 assert(err == std::ios_base::eofbit); 597 assert(ex == L"123456789"); 598 } 599 { // negative 600 std::wstring v = L"-1,234,567.89"; 601 typedef input_iterator<const wchar_t*> I; 602 std::wstring ex; 603 std::ios_base::iostate err = std::ios_base::goodbit; 604 I iter = f.get(I(v.data()), I(v.data() + v.size()), 605 true, ios, err, ex); 606 assert(iter.base() == v.data() + v.size()); 607 assert(err == std::ios_base::eofbit); 608 assert(ex == L"-123456789"); 609 } 610 { // negative 611 std::wstring v = L"-1234567.89"; 612 typedef input_iterator<const wchar_t*> I; 613 std::wstring ex; 614 std::ios_base::iostate err = std::ios_base::goodbit; 615 I iter = f.get(I(v.data()), I(v.data() + v.size()), 616 true, ios, err, ex); 617 assert(iter.base() == v.data() + v.size()); 618 assert(err == std::ios_base::eofbit); 619 assert(ex == L"-123456789"); 620 } 621 { // zero, showbase 622 std::wstring v = L"USD 0.00"; 623 typedef input_iterator<const wchar_t*> I; 624 std::wstring ex; 625 std::ios_base::iostate err = std::ios_base::goodbit; 626 I iter = f.get(I(v.data()), I(v.data() + v.size()), 627 true, ios, err, ex); 628 assert(iter.base() == v.data() + v.size()); 629 assert(err == std::ios_base::eofbit); 630 assert(ex == L"0"); 631 } 632 { // zero, showbase 633 std::wstring v = L"USD 0.00"; 634 showbase(ios); 635 typedef input_iterator<const wchar_t*> I; 636 std::wstring ex; 637 std::ios_base::iostate err = std::ios_base::goodbit; 638 I iter = f.get(I(v.data()), I(v.data() + v.size()), 639 true, ios, err, ex); 640 assert(iter.base() == v.data() + v.size()); 641 assert(err == std::ios_base::eofbit); 642 assert(ex == L"0"); 643 noshowbase(ios); 644 } 645 { // negative one, showbase 646 std::wstring v = L"-USD 0.01"; 647 typedef input_iterator<const wchar_t*> I; 648 std::wstring ex; 649 std::ios_base::iostate err = std::ios_base::goodbit; 650 I iter = f.get(I(v.data()), I(v.data() + v.size()), 651 true, ios, err, ex); 652 assert(iter.base() == v.data() + v.size()); 653 assert(err == std::ios_base::eofbit); 654 assert(ex == L"-1"); 655 } 656 { // negative one, showbase 657 std::wstring v = L"-USD 0.01"; 658 showbase(ios); 659 typedef input_iterator<const wchar_t*> I; 660 std::wstring ex; 661 std::ios_base::iostate err = std::ios_base::goodbit; 662 I iter = f.get(I(v.data()), I(v.data() + v.size()), 663 true, ios, err, ex); 664 assert(iter.base() == v.data() + v.size()); 665 assert(err == std::ios_base::eofbit); 666 assert(ex == L"-1"); 667 noshowbase(ios); 668 } 669 { // positive, showbase 670 std::wstring v = L"USD 1,234,567.89"; 671 typedef input_iterator<const wchar_t*> I; 672 std::wstring ex; 673 std::ios_base::iostate err = std::ios_base::goodbit; 674 I iter = f.get(I(v.data()), I(v.data() + v.size()), 675 true, ios, err, ex); 676 assert(iter.base() == v.data() + v.size()); 677 assert(err == std::ios_base::eofbit); 678 assert(ex == L"123456789"); 679 } 680 { // positive, showbase 681 std::wstring v = L"USD 1,234,567.89"; 682 showbase(ios); 683 typedef input_iterator<const wchar_t*> I; 684 std::wstring ex; 685 std::ios_base::iostate err = std::ios_base::goodbit; 686 I iter = f.get(I(v.data()), I(v.data() + v.size()), 687 true, ios, err, ex); 688 assert(iter.base() == v.data() + v.size()); 689 assert(err == std::ios_base::eofbit); 690 assert(ex == L"123456789"); 691 noshowbase(ios); 692 } 693 { // negative, showbase 694 std::wstring v = L"-USD 1,234,567.89"; 695 showbase(ios); 696 typedef input_iterator<const wchar_t*> I; 697 std::wstring ex; 698 std::ios_base::iostate err = std::ios_base::goodbit; 699 I iter = f.get(I(v.data()), I(v.data() + v.size()), 700 true, ios, err, ex); 701 assert(iter.base() == v.data() + v.size()); 702 assert(err == std::ios_base::eofbit); 703 assert(ex == L"-123456789"); 704 noshowbase(ios); 705 } 706 { // negative, showbase 707 std::wstring v = L"-$1,234,567.89"; 708 showbase(ios); 709 typedef input_iterator<const wchar_t*> I; 710 std::wstring ex; 711 std::ios_base::iostate err = std::ios_base::goodbit; 712 I iter = f.get(I(v.data()), I(v.data() + v.size()), 713 true, ios, err, ex); 714 assert(iter.base() == v.data() + 1); 715 assert(err == std::ios_base::failbit); 716 assert(ex == L""); 717 noshowbase(ios); 718 } 719 { // negative, showbase 720 std::wstring v = L"-$1,234,567.89"; 721 typedef input_iterator<const wchar_t*> I; 722 std::wstring ex; 723 std::ios_base::iostate err = std::ios_base::goodbit; 724 I iter = f.get(I(v.data()), I(v.data() + v.size()), 725 true, ios, err, ex); 726 assert(iter.base() == v.data() + 1); 727 assert(err == std::ios_base::failbit); 728 assert(ex == L""); 729 } 730 } 731 } 732