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 // REQUIRES: locale.en_US.UTF-8
11 // REQUIRES: locale.fr_FR.UTF-8
12 // REQUIRES: locale.ru_RU.UTF-8
13 // REQUIRES: locale.zh_CN.UTF-8
14
15 // <locale>
16
17 // class time_get_byname<charT, InputIterator>
18
19 // iter_type get(iter_type s, iter_type end, ios_base& f,
20 // ios_base::iostate& err, tm *t, char format, char modifier = 0) const;
21
22 #include <locale>
23 #include <cassert>
24 #include "test_iterators.h"
25
26 #include "platform_support.h" // locale name macros
27
28 typedef input_iterator<const wchar_t*> I;
29
30 typedef std::time_get_byname<wchar_t, I> F;
31
32 class my_facet
33 : public F
34 {
35 public:
my_facet(const std::string & nm,std::size_t refs=0)36 explicit my_facet(const std::string& nm, std::size_t refs = 0)
37 : F(nm, refs) {}
38 };
39
main()40 int main()
41 {
42 std::ios ios(0);
43 std::ios_base::iostate err;
44 std::tm t;
45 {
46 const my_facet f(LOCALE_en_US_UTF_8, 1);
47 const wchar_t in[] = L"Sat Dec 31 23:55:59 2061";
48 err = std::ios_base::goodbit;
49 t = std::tm();
50 I i = f.get(I(in), I(in+sizeof(in)/sizeof(in[0])-1), ios, err, &t, 'c');
51 assert(i.base() == in+sizeof(in)/sizeof(in[0])-1);
52 assert(t.tm_sec == 59);
53 assert(t.tm_min == 55);
54 assert(t.tm_hour == 23);
55 assert(t.tm_mday == 31);
56 assert(t.tm_mon == 11);
57 assert(t.tm_year == 161);
58 assert(t.tm_wday == 6);
59 assert(err == std::ios_base::eofbit);
60 }
61 {
62 const my_facet f(LOCALE_en_US_UTF_8, 1);
63 const wchar_t in[] = L"23:55:59";
64 err = std::ios_base::goodbit;
65 t = std::tm();
66 I i = f.get(I(in), I(in+sizeof(in)/sizeof(in[0])-1), ios, err, &t, 'X');
67 assert(i.base() == in+sizeof(in)/sizeof(in[0])-1);
68 assert(t.tm_sec == 59);
69 assert(t.tm_min == 55);
70 assert(t.tm_hour == 23);
71 assert(err == std::ios_base::eofbit);
72 }
73 {
74 const my_facet f(LOCALE_fr_FR_UTF_8, 1);
75 const wchar_t in[] = L"Sam 31 d""\xE9""c 23:55:59 2061";
76 err = std::ios_base::goodbit;
77 t = std::tm();
78 I i = f.get(I(in), I(in+sizeof(in)/sizeof(in[0])-1), ios, err, &t, 'c');
79 assert(i.base() == in+sizeof(in)/sizeof(in[0])-1);
80 assert(t.tm_sec == 59);
81 assert(t.tm_min == 55);
82 assert(t.tm_hour == 23);
83 assert(t.tm_mday == 31);
84 assert(t.tm_mon == 11);
85 assert(t.tm_year == 161);
86 assert(t.tm_wday == 6);
87 assert(err == std::ios_base::eofbit);
88 }
89 {
90 const my_facet f(LOCALE_fr_FR_UTF_8, 1);
91 const wchar_t in[] = L"23:55:59";
92 err = std::ios_base::goodbit;
93 t = std::tm();
94 I i = f.get(I(in), I(in+sizeof(in)/sizeof(in[0])-1), ios, err, &t, 'X');
95 assert(i.base() == in+sizeof(in)/sizeof(in[0])-1);
96 assert(t.tm_sec == 59);
97 assert(t.tm_min == 55);
98 assert(t.tm_hour == 23);
99 assert(err == std::ios_base::eofbit);
100 }
101 #ifdef __APPLE__
102 {
103 const my_facet f("ru_RU", 1);
104 const wchar_t in[] = L"\x441\x443\x431\x431\x43E\x442\x430"
105 ", 31 "
106 "\x434\x435\x43A\x430\x431\x440\x44F"
107 " 2061 "
108 "\x433"
109 ". 23:55:59";
110 err = std::ios_base::goodbit;
111 t = std::tm();
112 I i = f.get(I(in), I(in+sizeof(in)/sizeof(in[0])-1), ios, err, &t, 'c');
113 assert(i.base() == in+sizeof(in)/sizeof(in[0])-1);
114 assert(t.tm_sec == 59);
115 assert(t.tm_min == 55);
116 assert(t.tm_hour == 23);
117 assert(t.tm_mday == 31);
118 assert(t.tm_mon == 11);
119 assert(t.tm_year == 161);
120 assert(t.tm_wday == 6);
121 assert(err == std::ios_base::eofbit);
122 }
123 #endif
124 {
125 const my_facet f(LOCALE_ru_RU_UTF_8, 1);
126 const wchar_t in[] = L"23:55:59";
127 err = std::ios_base::goodbit;
128 t = std::tm();
129 I i = f.get(I(in), I(in+sizeof(in)/sizeof(in[0])-1), ios, err, &t, 'X');
130 assert(i.base() == in+sizeof(in)/sizeof(in[0])-1);
131 assert(t.tm_sec == 59);
132 assert(t.tm_min == 55);
133 assert(t.tm_hour == 23);
134 assert(err == std::ios_base::eofbit);
135 }
136 #ifdef __APPLE__
137 {
138 const my_facet f("zh_CN", 1);
139 const wchar_t in[] = L"\x516D"
140 " 12/31 23:55:59 2061";
141 err = std::ios_base::goodbit;
142 t = std::tm();
143 I i = f.get(I(in), I(in+sizeof(in)/sizeof(in[0])-1), ios, err, &t, 'c');
144 assert(i.base() == in+sizeof(in)/sizeof(in[0])-1);
145 assert(t.tm_sec == 59);
146 assert(t.tm_min == 55);
147 assert(t.tm_hour == 23);
148 assert(t.tm_mday == 31);
149 assert(t.tm_mon == 11);
150 assert(t.tm_year == 161);
151 assert(t.tm_wday == 6);
152 assert(err == std::ios_base::eofbit);
153 }
154 #endif
155 {
156 const my_facet f(LOCALE_zh_CN_UTF_8, 1);
157 const wchar_t in[] = L"23""\x65F6""55""\x5206""59""\x79D2";
158 err = std::ios_base::goodbit;
159 t = std::tm();
160 I i = f.get(I(in), I(in+sizeof(in)/sizeof(in[0])-1), ios, err, &t, 'X');
161 assert(i.base() == in+sizeof(in)/sizeof(in[0])-1);
162 assert(t.tm_sec == 59);
163 assert(t.tm_min == 55);
164 assert(t.tm_hour == 23);
165 assert(err == std::ios_base::eofbit);
166 }
167 }
168