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 // TODO: investigation needed
23 // XFAIL: linux-gnu
24
25 #include <locale>
26 #include <cassert>
27 #include "test_iterators.h"
28
29 #include "platform_support.h" // locale name macros
30
31 typedef input_iterator<const char*> I;
32
33 typedef std::time_get_byname<char, I> F;
34
35 class my_facet
36 : public F
37 {
38 public:
my_facet(const std::string & nm,std::size_t refs=0)39 explicit my_facet(const std::string& nm, std::size_t refs = 0)
40 : F(nm, refs) {}
41 };
42
main()43 int main()
44 {
45 std::ios ios(0);
46 std::ios_base::iostate err;
47 std::tm t;
48 {
49 const my_facet f(LOCALE_en_US_UTF_8, 1);
50 const char in[] = "Sat Dec 31 23:55:59 2061";
51 err = std::ios_base::goodbit;
52 t = std::tm();
53 I i = f.get(I(in), I(in+sizeof(in)/sizeof(in[0])-1), ios, err, &t, 'c');
54 assert(i.base() == in+sizeof(in)/sizeof(in[0])-1);
55 assert(t.tm_sec == 59);
56 assert(t.tm_min == 55);
57 assert(t.tm_hour == 23);
58 assert(t.tm_mday == 31);
59 assert(t.tm_mon == 11);
60 assert(t.tm_year == 161);
61 assert(t.tm_wday == 6);
62 assert(err == std::ios_base::eofbit);
63 }
64 {
65 const my_facet f(LOCALE_en_US_UTF_8, 1);
66 const char in[] = "23:55:59";
67 err = std::ios_base::goodbit;
68 t = std::tm();
69 I i = f.get(I(in), I(in+sizeof(in)/sizeof(in[0])-1), ios, err, &t, 'X');
70 assert(i.base() == in+sizeof(in)/sizeof(in[0])-1);
71 assert(t.tm_sec == 59);
72 assert(t.tm_min == 55);
73 assert(t.tm_hour == 23);
74 assert(err == std::ios_base::eofbit);
75 }
76 {
77 const my_facet f(LOCALE_fr_FR_UTF_8, 1);
78 const char in[] = "Sam 31 d""\xC3\xA9""c 23:55:59 2061";
79 err = std::ios_base::goodbit;
80 t = std::tm();
81 I i = f.get(I(in), I(in+sizeof(in)/sizeof(in[0])-1), ios, err, &t, 'c');
82 assert(i.base() == in+sizeof(in)/sizeof(in[0])-1);
83 assert(t.tm_sec == 59);
84 assert(t.tm_min == 55);
85 assert(t.tm_hour == 23);
86 assert(t.tm_mday == 31);
87 assert(t.tm_mon == 11);
88 assert(t.tm_year == 161);
89 assert(t.tm_wday == 6);
90 assert(err == std::ios_base::eofbit);
91 }
92 {
93 const my_facet f(LOCALE_fr_FR_UTF_8, 1);
94 const char in[] = "23:55:59";
95 err = std::ios_base::goodbit;
96 t = std::tm();
97 I i = f.get(I(in), I(in+sizeof(in)/sizeof(in[0])-1), ios, err, &t, 'X');
98 assert(i.base() == in+sizeof(in)/sizeof(in[0])-1);
99 assert(t.tm_sec == 59);
100 assert(t.tm_min == 55);
101 assert(t.tm_hour == 23);
102 assert(err == std::ios_base::eofbit);
103 }
104 {
105 const my_facet f(LOCALE_ru_RU_UTF_8, 1);
106 const char in[] = "\xD1\x81\xD1\x83\xD0\xB1\xD0\xB1"
107 "\xD0\xBE\xD1\x82\xD0\xB0"
108 ", 31 "
109 "\xD0\xB4\xD0\xB5\xD0\xBA\xD0\xB0"
110 "\xD0\xB1\xD1\x80\xD1\x8F"
111 " 2061 "
112 "\xD0\xB3"
113 ". 23:55:59";
114 err = std::ios_base::goodbit;
115 t = std::tm();
116 I i = f.get(I(in), I(in+sizeof(in)/sizeof(in[0])-1), ios, err, &t, 'c');
117 assert(i.base() == in+sizeof(in)/sizeof(in[0])-1);
118 assert(t.tm_sec == 59);
119 assert(t.tm_min == 55);
120 assert(t.tm_hour == 23);
121 assert(t.tm_mday == 31);
122 assert(t.tm_mon == 11);
123 assert(t.tm_year == 161);
124 assert(t.tm_wday == 6);
125 assert(err == std::ios_base::eofbit);
126 }
127 {
128 const my_facet f(LOCALE_ru_RU_UTF_8, 1);
129 const char in[] = "23:55:59";
130 err = std::ios_base::goodbit;
131 t = std::tm();
132 I i = f.get(I(in), I(in+sizeof(in)/sizeof(in[0])-1), ios, err, &t, 'X');
133 assert(i.base() == in+sizeof(in)/sizeof(in[0])-1);
134 assert(t.tm_sec == 59);
135 assert(t.tm_min == 55);
136 assert(t.tm_hour == 23);
137 assert(err == std::ios_base::eofbit);
138 }
139 {
140 const my_facet f(LOCALE_zh_CN_UTF_8, 1);
141 const char in[] = "\xE5\x85\xAD"
142 " 12/31 23:55:59 2061";
143 err = std::ios_base::goodbit;
144 t = std::tm();
145 I i = f.get(I(in), I(in+sizeof(in)/sizeof(in[0])-1), ios, err, &t, 'c');
146 assert(i.base() == in+sizeof(in)/sizeof(in[0])-1);
147 assert(t.tm_sec == 59);
148 assert(t.tm_min == 55);
149 assert(t.tm_hour == 23);
150 assert(t.tm_mday == 31);
151 assert(t.tm_mon == 11);
152 assert(t.tm_year == 161);
153 assert(t.tm_wday == 6);
154 assert(err == std::ios_base::eofbit);
155 }
156 {
157 const my_facet f(LOCALE_zh_CN_UTF_8, 1);
158 const char in[] = "23""\xE6\x97\xB6""55""\xE5\x88\x86""59""\xE7\xA7\x92";
159 err = std::ios_base::goodbit;
160 t = std::tm();
161 I i = f.get(I(in), I(in+sizeof(in)/sizeof(in[0])-1), ios, err, &t, 'X');
162 assert(i.base() == in+sizeof(in)/sizeof(in[0])-1);
163 assert(t.tm_sec == 59);
164 assert(t.tm_min == 55);
165 assert(t.tm_hour == 23);
166 assert(err == std::ios_base::eofbit);
167 }
168 }
169