1 //===----------------------------------------------------------------------===//
3 // The LLVM Compiler Infrastructure
5 // This file is dual licensed under the MIT and the University of Illinois Open
6 // Source Licenses. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // XFAIL: apple-darwin
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
18 // REQUIRES: locale.ru_RU.UTF-8
22 // class money_get<charT, InputIterator>
24 // iter_type get(iter_type b, iter_type e, bool intl, ios_base& iob,
25 // ios_base::iostate& err, long double& v) const;
31 #include "test_iterators.h"
33 #include "platform_support.h" // locale name macros
35 typedef std::money_get<char, input_iterator<const char*> > Fn;
41 explicit my_facet(std::size_t refs = 0)
45 typedef std::money_get<wchar_t, input_iterator<const wchar_t*> > Fw;
51 explicit my_facetw(std::size_t refs = 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)));
71 std::string v = "0,00 ";
72 typedef input_iterator<const char*> I;
74 std::ios_base::iostate err = std::ios_base::goodbit;
75 I iter = f.get(I(v.data()), I(v.data() + v.size()),
77 assert(iter.base() == v.data() + v.size());
78 assert(err == std::ios_base::eofbit);
82 std::string v = "-0,01 ";
83 typedef input_iterator<const char*> I;
85 std::ios_base::iostate err = std::ios_base::goodbit;
86 I iter = f.get(I(v.data()), I(v.data() + v.size()),
88 assert(iter.base() == v.data() + v.size());
89 assert(err == std::ios_base::eofbit);
93 std::string v = "1 234 567,89 ";
94 typedef input_iterator<const char*> I;
96 std::ios_base::iostate err = std::ios_base::goodbit;
97 I iter = f.get(I(v.data()), I(v.data() + v.size()),
99 assert(iter.base() == v.data() + v.size());
100 assert(err == std::ios_base::eofbit);
101 assert(ex == 123456789);
104 std::string v = "-1 234 567,89 ";
105 typedef input_iterator<const char*> I;
107 std::ios_base::iostate err = std::ios_base::goodbit;
108 I iter = f.get(I(v.data()), I(v.data() + v.size()),
109 false, ios, err, ex);
110 assert(iter.base() == v.data() + v.size());
111 assert(err == std::ios_base::eofbit);
112 assert(ex == -123456789);
115 std::string v = "-1234567,89 ";
116 typedef input_iterator<const char*> I;
118 std::ios_base::iostate err = std::ios_base::goodbit;
119 I iter = f.get(I(v.data()), I(v.data() + v.size()),
120 false, ios, err, ex);
121 assert(iter.base() == v.data() + v.size());
122 assert(err == std::ios_base::eofbit);
123 assert(ex == -123456789);
126 std::string v = "0,00 \xD1\x80\xD1\x83\xD0\xB1"".";
127 typedef input_iterator<const char*> I;
129 std::ios_base::iostate err = std::ios_base::goodbit;
130 I iter = f.get(I(v.data()), I(v.data() + v.size()),
131 false, ios, err, ex);
132 assert(iter.base() == v.data() + 5);
133 assert(err == std::ios_base::goodbit);
137 std::string v = "0,00 \xD1\x80\xD1\x83\xD0\xB1"".";
139 typedef input_iterator<const char*> I;
141 std::ios_base::iostate err = std::ios_base::goodbit;
142 I iter = f.get(I(v.data()), I(v.data() + v.size()),
143 false, ios, err, ex);
144 assert(iter.base() == v.data() + v.size());
145 assert(err == std::ios_base::eofbit);
149 { // negative one, showbase
150 std::string v = "-0,01 \xD1\x80\xD1\x83\xD0\xB1"".";
151 typedef input_iterator<const char*> I;
153 std::ios_base::iostate err = std::ios_base::goodbit;
154 I iter = f.get(I(v.data()), I(v.data() + v.size()),
155 false, ios, err, ex);
156 assert(iter.base() == v.data() + 6);
157 assert(err == std::ios_base::goodbit);
160 { // negative one, showbase
161 std::string v = "-0,01 \xD1\x80\xD1\x83\xD0\xB1"".";
163 typedef input_iterator<const char*> I;
165 std::ios_base::iostate err = std::ios_base::goodbit;
166 I iter = f.get(I(v.data()), I(v.data() + v.size()),
167 false, ios, err, ex);
168 assert(iter.base() == v.data() + v.size());
169 assert(err == std::ios_base::eofbit);
173 { // positive, showbase
174 std::string v = "1 234 567,89 \xD1\x80\xD1\x83\xD0\xB1"".";
175 typedef input_iterator<const char*> I;
177 std::ios_base::iostate err = std::ios_base::goodbit;
178 I iter = f.get(I(v.data()), I(v.data() + v.size()),
179 false, ios, err, ex);
180 assert(iter.base() == v.data() + 13);
181 assert(err == std::ios_base::goodbit);
182 assert(ex == 123456789);
184 { // positive, showbase
185 std::string v = "1 234 567,89 \xD1\x80\xD1\x83\xD0\xB1"".";
187 typedef input_iterator<const char*> I;
189 std::ios_base::iostate err = std::ios_base::goodbit;
190 I iter = f.get(I(v.data()), I(v.data() + v.size()),
191 false, ios, err, ex);
192 assert(iter.base() == v.data() + v.size());
193 assert(err == std::ios_base::eofbit);
194 assert(ex == 123456789);
197 { // negative, showbase
198 std::string v = "-1 234 567,89 \xD1\x80\xD1\x83\xD0\xB1"".";
200 typedef input_iterator<const char*> I;
202 std::ios_base::iostate err = std::ios_base::goodbit;
203 I iter = f.get(I(v.data()), I(v.data() + v.size()),
204 false, ios, err, ex);
205 assert(iter.base() == v.data() + v.size());
206 assert(err == std::ios_base::eofbit);
207 assert(ex == -123456789);
210 { // negative, showbase
211 std::string v = "-1 234 567,89 RUB ";
213 typedef input_iterator<const char*> I;
215 std::ios_base::iostate err = std::ios_base::goodbit;
216 I iter = f.get(I(v.data()), I(v.data() + v.size()),
217 false, ios, err, ex);
218 assert(iter.base() == v.data() + 14);
219 assert(err == std::ios_base::failbit);
222 { // negative, showbase
223 std::string v = "-1 234 567,89 RUB ";
224 typedef input_iterator<const char*> I;
226 std::ios_base::iostate err = std::ios_base::goodbit;
227 I iter = f.get(I(v.data()), I(v.data() + v.size()),
228 false, ios, err, ex);
229 assert(iter.base() == v.data() + 14);
230 assert(err == std::ios_base::goodbit);
231 assert(ex == -123456789);
236 // char, international
238 std::string v = "0,00";
239 typedef input_iterator<const char*> I;
241 std::ios_base::iostate err = std::ios_base::goodbit;
242 I iter = f.get(I(v.data()), I(v.data() + v.size()),
244 assert(iter.base() == v.data() + v.size());
245 assert(err == std::ios_base::eofbit);
249 std::string v = "-0,01 ";
250 typedef input_iterator<const char*> I;
252 std::ios_base::iostate err = std::ios_base::goodbit;
253 I iter = f.get(I(v.data()), I(v.data() + v.size()),
255 assert(iter.base() == v.data() + v.size());
256 assert(err == std::ios_base::eofbit);
260 std::string v = "1 234 567,89 ";
261 typedef input_iterator<const char*> I;
263 std::ios_base::iostate err = std::ios_base::goodbit;
264 I iter = f.get(I(v.data()), I(v.data() + v.size()),
266 assert(iter.base() == v.data() + v.size());
267 assert(err == std::ios_base::eofbit);
268 assert(ex == 123456789);
271 std::string v = "-1 234 567,89 ";
272 typedef input_iterator<const char*> I;
274 std::ios_base::iostate err = std::ios_base::goodbit;
275 I iter = f.get(I(v.data()), I(v.data() + v.size()),
277 assert(iter.base() == v.data() + v.size());
278 assert(err == std::ios_base::eofbit);
279 assert(ex == -123456789);
282 std::string v = "-1234567,89 ";
283 typedef input_iterator<const char*> I;
285 std::ios_base::iostate err = std::ios_base::goodbit;
286 I iter = f.get(I(v.data()), I(v.data() + v.size()),
288 assert(iter.base() == v.data() + v.size());
289 assert(err == std::ios_base::eofbit);
290 assert(ex == -123456789);
293 std::string v = "0,00 RUB ";
294 typedef input_iterator<const char*> I;
296 std::ios_base::iostate err = std::ios_base::goodbit;
297 I iter = f.get(I(v.data()), I(v.data() + v.size()),
299 assert(iter.base() == v.data() + 5);
300 assert(err == std::ios_base::goodbit);
304 std::string v = "0,00 RUB ";
306 typedef input_iterator<const char*> I;
308 std::ios_base::iostate err = std::ios_base::goodbit;
309 I iter = f.get(I(v.data()), I(v.data() + v.size()),
311 assert(iter.base() == v.data() + v.size());
312 assert(err == std::ios_base::eofbit);
316 { // negative one, showbase
317 std::string v = "-0,01 RUB ";
318 typedef input_iterator<const char*> I;
320 std::ios_base::iostate err = std::ios_base::goodbit;
321 I iter = f.get(I(v.data()), I(v.data() + v.size()),
323 assert(iter.base() == v.data() + 6);
324 assert(err == std::ios_base::goodbit);
327 { // negative one, showbase
328 std::string v = "-0,01 RUB ";
330 typedef input_iterator<const char*> I;
332 std::ios_base::iostate err = std::ios_base::goodbit;
333 I iter = f.get(I(v.data()), I(v.data() + v.size()),
335 assert(iter.base() == v.data() + v.size());
336 assert(err == std::ios_base::eofbit);
340 { // positive, showbase
341 std::string v = "1 234 567,89 RUB ";
342 typedef input_iterator<const char*> I;
344 std::ios_base::iostate err = std::ios_base::goodbit;
345 I iter = f.get(I(v.data()), I(v.data() + v.size()),
347 assert(iter.base() == v.data() + 13);
348 assert(err == std::ios_base::goodbit);
349 assert(ex == 123456789);
351 { // positive, showbase
352 std::string v = "1 234 567,89 RUB ";
354 typedef input_iterator<const char*> I;
356 std::ios_base::iostate err = std::ios_base::goodbit;
357 I iter = f.get(I(v.data()), I(v.data() + v.size()),
359 assert(iter.base() == v.data() + v.size());
360 assert(err == std::ios_base::eofbit);
361 assert(ex == 123456789);
364 { // negative, showbase
365 std::string v = "-1 234 567,89 RUB ";
367 typedef input_iterator<const char*> I;
369 std::ios_base::iostate err = std::ios_base::goodbit;
370 I iter = f.get(I(v.data()), I(v.data() + v.size()),
372 assert(iter.base() == v.data() + v.size());
373 assert(err == std::ios_base::eofbit);
374 assert(ex == -123456789);
377 { // negative, showbase
378 std::string v = "-1 234 567,89 \xD1\x80\xD1\x83\xD0\xB1"".";
380 typedef input_iterator<const char*> I;
382 std::ios_base::iostate err = std::ios_base::goodbit;
383 I iter = f.get(I(v.data()), I(v.data() + v.size()),
385 assert(iter.base() == v.data() + 14);
386 assert(err == std::ios_base::failbit);
389 { // negative, showbase
390 std::string v = "-1 234 567,89 \xD1\x80\xD1\x83\xD0\xB1"".";
391 typedef input_iterator<const char*> I;
393 std::ios_base::iostate err = std::ios_base::goodbit;
394 I iter = f.get(I(v.data()), I(v.data() + v.size()),
396 assert(iter.base() == v.data() + 14);
397 assert(err == std::ios_base::goodbit);
398 assert(ex == -123456789);
402 const my_facetw f(1);
405 std::wstring v = L"0,00";
406 typedef input_iterator<const wchar_t*> I;
408 std::ios_base::iostate err = std::ios_base::goodbit;
409 I iter = f.get(I(v.data()), I(v.data() + v.size()),
410 false, ios, err, ex);
411 assert(iter.base() == v.data() + v.size());
412 assert(err == std::ios_base::eofbit);
416 std::wstring v = L"-0,01 ";
417 typedef input_iterator<const wchar_t*> I;
419 std::ios_base::iostate err = std::ios_base::goodbit;
420 I iter = f.get(I(v.data()), I(v.data() + v.size()),
421 false, ios, err, ex);
422 assert(iter.base() == v.data() + v.size());
423 assert(err == std::ios_base::eofbit);
427 std::wstring v = L"1 234 567,89 ";
428 typedef input_iterator<const wchar_t*> I;
430 std::ios_base::iostate err = std::ios_base::goodbit;
431 I iter = f.get(I(v.data()), I(v.data() + v.size()),
432 false, ios, err, ex);
433 assert(iter.base() == v.data() + v.size());
434 assert(err == std::ios_base::eofbit);
435 assert(ex == 123456789);
438 std::wstring v = L"-1 234 567,89 ";
439 typedef input_iterator<const wchar_t*> I;
441 std::ios_base::iostate err = std::ios_base::goodbit;
442 I iter = f.get(I(v.data()), I(v.data() + v.size()),
443 false, ios, err, ex);
444 assert(iter.base() == v.data() + v.size());
445 assert(err == std::ios_base::eofbit);
446 assert(ex == -123456789);
449 std::wstring v = L"-1234567,89 ";
450 typedef input_iterator<const wchar_t*> I;
452 std::ios_base::iostate err = std::ios_base::goodbit;
453 I iter = f.get(I(v.data()), I(v.data() + v.size()),
454 false, ios, err, ex);
455 assert(iter.base() == v.data() + v.size());
456 assert(err == std::ios_base::eofbit);
457 assert(ex == -123456789);
460 std::wstring v = L"0,00 \x440\x443\x431"".";
461 typedef input_iterator<const wchar_t*> I;
463 std::ios_base::iostate err = std::ios_base::goodbit;
464 I iter = f.get(I(v.data()), I(v.data() + v.size()),
465 false, ios, err, ex);
466 assert(iter.base() == v.data() + 5);
467 assert(err == std::ios_base::goodbit);
471 std::wstring v = L"0,00 \x440\x443\x431"".";
473 typedef input_iterator<const wchar_t*> I;
475 std::ios_base::iostate err = std::ios_base::goodbit;
476 I iter = f.get(I(v.data()), I(v.data() + v.size()),
477 false, ios, err, ex);
478 assert(iter.base() == v.data() + v.size());
479 assert(err == std::ios_base::eofbit);
483 { // negative one, showbase
484 std::wstring v = L"-0,01 \x440\x443\x431"".";
485 typedef input_iterator<const wchar_t*> I;
487 std::ios_base::iostate err = std::ios_base::goodbit;
488 I iter = f.get(I(v.data()), I(v.data() + v.size()),
489 false, ios, err, ex);
490 assert(iter.base() == v.data() + 6);
491 assert(err == std::ios_base::goodbit);
494 { // negative one, showbase
495 std::wstring v = L"-0,01 \x440\x443\x431"".";
497 typedef input_iterator<const wchar_t*> I;
499 std::ios_base::iostate err = std::ios_base::goodbit;
500 I iter = f.get(I(v.data()), I(v.data() + v.size()),
501 false, ios, err, ex);
502 assert(iter.base() == v.data() + v.size());
503 assert(err == std::ios_base::eofbit);
507 { // positive, showbase
508 std::wstring v = L"1 234 567,89 \x440\x443\x431"".";
509 typedef input_iterator<const wchar_t*> I;
511 std::ios_base::iostate err = std::ios_base::goodbit;
512 I iter = f.get(I(v.data()), I(v.data() + v.size()),
513 false, ios, err, ex);
514 assert(iter.base() == v.data() + 13);
515 assert(err == std::ios_base::goodbit);
516 assert(ex == 123456789);
518 { // positive, showbase
519 std::wstring v = L"1 234 567,89 \x440\x443\x431"".";
521 typedef input_iterator<const wchar_t*> I;
523 std::ios_base::iostate err = std::ios_base::goodbit;
524 I iter = f.get(I(v.data()), I(v.data() + v.size()),
525 false, ios, err, ex);
526 assert(iter.base() == v.data() + v.size());
527 assert(err == std::ios_base::eofbit);
528 assert(ex == 123456789);
531 { // negative, showbase
532 std::wstring v = L"-1 234 567,89 \x440\x443\x431"".";
534 typedef input_iterator<const wchar_t*> I;
536 std::ios_base::iostate err = std::ios_base::goodbit;
537 I iter = f.get(I(v.data()), I(v.data() + v.size()),
538 false, ios, err, ex);
539 assert(iter.base() == v.data() + v.size());
540 assert(err == std::ios_base::eofbit);
541 assert(ex == -123456789);
544 { // negative, showbase
545 std::wstring v = L"-1 234 567,89 RUB ";
547 typedef input_iterator<const wchar_t*> I;
549 std::ios_base::iostate err = std::ios_base::goodbit;
550 I iter = f.get(I(v.data()), I(v.data() + v.size()),
551 false, ios, err, ex);
552 assert(iter.base() == v.data() + 14);
553 assert(err == std::ios_base::failbit);
556 { // negative, showbase
557 std::wstring v = L"-1 234 567,89 RUB ";
558 typedef input_iterator<const wchar_t*> I;
560 std::ios_base::iostate err = std::ios_base::goodbit;
561 I iter = f.get(I(v.data()), I(v.data() + v.size()),
562 false, ios, err, ex);
563 assert(iter.base() == v.data() + 14);
564 assert(err == std::ios_base::goodbit);
565 assert(ex == -123456789);
569 const my_facetw f(1);
570 // wchar_t, international
572 std::wstring v = L"0,00";
573 typedef input_iterator<const wchar_t*> I;
575 std::ios_base::iostate err = std::ios_base::goodbit;
576 I iter = f.get(I(v.data()), I(v.data() + v.size()),
578 assert(iter.base() == v.data() + v.size());
579 assert(err == std::ios_base::eofbit);
583 std::wstring v = L"-0,01 ";
584 typedef input_iterator<const wchar_t*> I;
586 std::ios_base::iostate err = std::ios_base::goodbit;
587 I iter = f.get(I(v.data()), I(v.data() + v.size()),
589 assert(iter.base() == v.data() + v.size());
590 assert(err == std::ios_base::eofbit);
594 std::wstring v = L"1 234 567,89 ";
595 typedef input_iterator<const wchar_t*> I;
597 std::ios_base::iostate err = std::ios_base::goodbit;
598 I iter = f.get(I(v.data()), I(v.data() + v.size()),
600 assert(iter.base() == v.data() + v.size());
601 assert(err == std::ios_base::eofbit);
602 assert(ex == 123456789);
605 std::wstring v = L"-1 234 567,89 ";
606 typedef input_iterator<const wchar_t*> I;
608 std::ios_base::iostate err = std::ios_base::goodbit;
609 I iter = f.get(I(v.data()), I(v.data() + v.size()),
611 assert(iter.base() == v.data() + v.size());
612 assert(err == std::ios_base::eofbit);
613 assert(ex == -123456789);
616 std::wstring v = L"-1234567,89 ";
617 typedef input_iterator<const wchar_t*> I;
619 std::ios_base::iostate err = std::ios_base::goodbit;
620 I iter = f.get(I(v.data()), I(v.data() + v.size()),
622 assert(iter.base() == v.data() + v.size());
623 assert(err == std::ios_base::eofbit);
624 assert(ex == -123456789);
627 std::wstring v = L"0,00 RUB ";
628 typedef input_iterator<const wchar_t*> I;
630 std::ios_base::iostate err = std::ios_base::goodbit;
631 I iter = f.get(I(v.data()), I(v.data() + v.size()),
633 assert(iter.base() == v.data() + 5);
634 assert(err == std::ios_base::goodbit);
638 std::wstring v = L"0,00 RUB ";
640 typedef input_iterator<const wchar_t*> I;
642 std::ios_base::iostate err = std::ios_base::goodbit;
643 I iter = f.get(I(v.data()), I(v.data() + v.size()),
645 assert(iter.base() == v.data() + v.size());
646 assert(err == std::ios_base::eofbit);
650 { // negative one, showbase
651 std::wstring v = L"-0,01 RUB ";
652 typedef input_iterator<const wchar_t*> I;
654 std::ios_base::iostate err = std::ios_base::goodbit;
655 I iter = f.get(I(v.data()), I(v.data() + v.size()),
657 assert(iter.base() == v.data() + 6);
658 assert(err == std::ios_base::goodbit);
661 { // negative one, showbase
662 std::wstring v = L"-0,01 RUB ";
664 typedef input_iterator<const wchar_t*> I;
666 std::ios_base::iostate err = std::ios_base::goodbit;
667 I iter = f.get(I(v.data()), I(v.data() + v.size()),
669 assert(iter.base() == v.data() + v.size());
670 assert(err == std::ios_base::eofbit);
674 { // positive, showbase
675 std::wstring v = L"1 234 567,89 RUB ";
676 typedef input_iterator<const wchar_t*> I;
678 std::ios_base::iostate err = std::ios_base::goodbit;
679 I iter = f.get(I(v.data()), I(v.data() + v.size()),
681 assert(iter.base() == v.data() + 13);
682 assert(err == std::ios_base::goodbit);
683 assert(ex == 123456789);
685 { // positive, showbase
686 std::wstring v = L"1 234 567,89 RUB ";
688 typedef input_iterator<const wchar_t*> I;
690 std::ios_base::iostate err = std::ios_base::goodbit;
691 I iter = f.get(I(v.data()), I(v.data() + v.size()),
693 assert(iter.base() == v.data() + v.size());
694 assert(err == std::ios_base::eofbit);
695 assert(ex == 123456789);
698 { // negative, showbase
699 std::wstring v = L"-1 234 567,89 RUB ";
701 typedef input_iterator<const wchar_t*> I;
703 std::ios_base::iostate err = std::ios_base::goodbit;
704 I iter = f.get(I(v.data()), I(v.data() + v.size()),
706 assert(iter.base() == v.data() + v.size());
707 assert(err == std::ios_base::eofbit);
708 assert(ex == -123456789);
711 { // negative, showbase
712 std::wstring v = L"-1 234 567,89 \x440\x443\x431"".";
714 typedef input_iterator<const wchar_t*> I;
716 std::ios_base::iostate err = std::ios_base::goodbit;
717 I iter = f.get(I(v.data()), I(v.data() + v.size()),
719 assert(iter.base() == v.data() + 14);
720 assert(err == std::ios_base::failbit);
723 { // negative, showbase
724 std::wstring v = L"-1 234 567,89 \x440\x443\x431"".";
725 typedef input_iterator<const wchar_t*> I;
727 std::ios_base::iostate err = std::ios_base::goodbit;
728 I iter = f.get(I(v.data()), I(v.data() + v.size()),
730 assert(iter.base() == v.data() + 14);
731 assert(err == std::ios_base::goodbit);
732 assert(ex == -123456789);