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