1b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner//===----------------------------------------------------------------------===//
2b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner//
3b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner//                     The LLVM Compiler Infrastructure
4b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner//
5b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner// This file is dual licensed under the MIT and the University of Illinois Open
6b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner// Source Licenses. See LICENSE.TXT for details.
7b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner//
8b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner//===----------------------------------------------------------------------===//
9b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner
10b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner// <locale>
11b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner
12b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner// class time_get_byname<charT, InputIterator>
13b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner
14b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner// iter_type get(iter_type s, iter_type end, ios_base& f,
15b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner//               ios_base::iostate& err, tm *t, char format, char modifier = 0) const;
16b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner
17b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner#include <locale>
18b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner#include <cassert>
19b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner#include "test_iterators.h"
20b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner
21b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner#include "platform_support.h" // locale name macros
22b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner
23b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turnertypedef input_iterator<const char*> I;
24b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner
25b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turnertypedef std::time_get_byname<char, I> F;
26b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner
27b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turnerclass my_facet
28b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    : public F
29b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner{
30b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turnerpublic:
31b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    explicit my_facet(const std::string& nm, std::size_t refs = 0)
32b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        : F(nm, refs) {}
33b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner};
34b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner
35b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turnerint main()
36b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner{
37b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    std::ios ios(0);
38b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    std::ios_base::iostate err;
39b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    std::tm t;
40b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    {
41b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        const my_facet f(LOCALE_en_US_UTF_8, 1);
42b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        const char in[] = "Sat Dec 31 23:55:59 2061";
43b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        err = std::ios_base::goodbit;
44b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        t = std::tm();
45b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        I i = f.get(I(in), I(in+sizeof(in)/sizeof(in[0])-1), ios, err, &t, 'c');
46b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(i.base() == in+sizeof(in)/sizeof(in[0])-1);
47b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(t.tm_sec == 59);
48b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(t.tm_min == 55);
49b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(t.tm_hour == 23);
50b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(t.tm_mday == 31);
51b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(t.tm_mon == 11);
52b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(t.tm_year == 161);
53b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(t.tm_wday == 6);
54b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(err == std::ios_base::eofbit);
55b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    }
56b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    {
57b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        const my_facet f(LOCALE_en_US_UTF_8, 1);
58b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        const char in[] = "23:55:59";
59b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        err = std::ios_base::goodbit;
60b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        t = std::tm();
61b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        I i = f.get(I(in), I(in+sizeof(in)/sizeof(in[0])-1), ios, err, &t, 'X');
62b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(i.base() == in+sizeof(in)/sizeof(in[0])-1);
63b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(t.tm_sec == 59);
64b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(t.tm_min == 55);
65b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(t.tm_hour == 23);
66b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(err == std::ios_base::eofbit);
67b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    }
68b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    {
69b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        const my_facet f(LOCALE_fr_FR_UTF_8, 1);
70b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        const char in[] = "Sam 31 d""\xC3\xA9""c 23:55:59 2061";
71b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        err = std::ios_base::goodbit;
72b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        t = std::tm();
73b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        I i = f.get(I(in), I(in+sizeof(in)/sizeof(in[0])-1), ios, err, &t, 'c');
74b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(i.base() == in+sizeof(in)/sizeof(in[0])-1);
75b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(t.tm_sec == 59);
76b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(t.tm_min == 55);
77b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(t.tm_hour == 23);
78b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(t.tm_mday == 31);
79b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(t.tm_mon == 11);
80b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(t.tm_year == 161);
81b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(t.tm_wday == 6);
82b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(err == std::ios_base::eofbit);
83b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    }
84b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    {
85b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        const my_facet f(LOCALE_fr_FR_UTF_8, 1);
86b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        const char in[] = "23:55:59";
87b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        err = std::ios_base::goodbit;
88b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        t = std::tm();
89b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        I i = f.get(I(in), I(in+sizeof(in)/sizeof(in[0])-1), ios, err, &t, 'X');
90b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(i.base() == in+sizeof(in)/sizeof(in[0])-1);
91b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(t.tm_sec == 59);
92b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(t.tm_min == 55);
93b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(t.tm_hour == 23);
94b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(err == std::ios_base::eofbit);
95b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    }
96b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    {
97b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        const my_facet f(LOCALE_ru_RU_UTF_8, 1);
98b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        const char in[] = "\xD1\x81\xD1\x83\xD0\xB1\xD0\xB1"
99b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner                          "\xD0\xBE\xD1\x82\xD0\xB0"
100b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner                          ", 31 "
101b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner                          "\xD0\xB4\xD0\xB5\xD0\xBA\xD0\xB0"
102b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner                          "\xD0\xB1\xD1\x80\xD1\x8F"
103b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner                          " 2061 "
104b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner                          "\xD0\xB3"
105b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner                          ". 23:55:59";
106b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        err = std::ios_base::goodbit;
107b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        t = std::tm();
108b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        I i = f.get(I(in), I(in+sizeof(in)/sizeof(in[0])-1), ios, err, &t, 'c');
109b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(i.base() == in+sizeof(in)/sizeof(in[0])-1);
110b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(t.tm_sec == 59);
111b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(t.tm_min == 55);
112b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(t.tm_hour == 23);
113b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(t.tm_mday == 31);
114b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(t.tm_mon == 11);
115b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(t.tm_year == 161);
116b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(t.tm_wday == 6);
117b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(err == std::ios_base::eofbit);
118b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    }
119b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    {
120b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        const my_facet f(LOCALE_ru_RU_UTF_8, 1);
121b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        const char in[] = "23:55:59";
122b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        err = std::ios_base::goodbit;
123b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        t = std::tm();
124b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        I i = f.get(I(in), I(in+sizeof(in)/sizeof(in[0])-1), ios, err, &t, 'X');
125b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(i.base() == in+sizeof(in)/sizeof(in[0])-1);
126b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(t.tm_sec == 59);
127b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(t.tm_min == 55);
128b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(t.tm_hour == 23);
129b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(err == std::ios_base::eofbit);
130b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    }
131b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    {
132b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        const my_facet f(LOCALE_zh_CN_UTF_8, 1);
133b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        const char in[] = "\xE5\x85\xAD"
134b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner                          " 12/31 23:55:59 2061";
135b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        err = std::ios_base::goodbit;
136b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        t = std::tm();
137b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        I i = f.get(I(in), I(in+sizeof(in)/sizeof(in[0])-1), ios, err, &t, 'c');
138b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(i.base() == in+sizeof(in)/sizeof(in[0])-1);
139b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(t.tm_sec == 59);
140b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(t.tm_min == 55);
141b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(t.tm_hour == 23);
142b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(t.tm_mday == 31);
143b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(t.tm_mon == 11);
144b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(t.tm_year == 161);
145b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(t.tm_wday == 6);
146b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(err == std::ios_base::eofbit);
147b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    }
148b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    {
149b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        const my_facet f(LOCALE_zh_CN_UTF_8, 1);
150b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        const char in[] = "23""\xE6\x97\xB6""55""\xE5\x88\x86""59""\xE7\xA7\x92";
151b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        err = std::ios_base::goodbit;
152b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        t = std::tm();
153b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        I i = f.get(I(in), I(in+sizeof(in)/sizeof(in[0])-1), ios, err, &t, 'X');
154b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(i.base() == in+sizeof(in)/sizeof(in[0])-1);
155b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(t.tm_sec == 59);
156b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(t.tm_min == 55);
157b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(t.tm_hour == 23);
158b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner        assert(err == std::ios_base::eofbit);
159b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner    }
160b9a36c36f4b257de79bd656aefa7bfde40cedb0fDavid 'Digit' Turner}
161