1 //===----------------------------------------------------------------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 // <locale>
10 
11 // class time_get<charT, InputIterator>
12 
13 // iter_type
14 // get_monthname(iter_type s, iter_type end, ios_base& str,
15 //               ios_base::iostate& err, tm* t) const;
16 
17 #include <locale>
18 #include <cassert>
19 #include "test_macros.h"
20 #include "test_iterators.h"
21 
22 typedef cpp17_input_iterator<const wchar_t*> I;
23 
24 typedef std::time_get<wchar_t, I> F;
25 
26 class my_facet
27     : public F
28 {
29 public:
my_facet(std::size_t refs=0)30     explicit my_facet(std::size_t refs = 0)
31         : F(refs) {}
32 };
33 
main(int,char **)34 int main(int, char**)
35 {
36     const my_facet f(1);
37     std::ios ios(0);
38     std::ios_base::iostate err;
39     std::tm t;
40     {
41         const wchar_t in[] = L"Jan";
42         err = std::ios_base::goodbit;
43         t = std::tm();
44         I i = f.get_monthname(I(in), I(in+sizeof(in)/sizeof(in[0])-1), ios, err, &t);
45         assert(i.base() == in+3);
46         assert(t.tm_mon == 0);
47         assert(err == std::ios_base::eofbit);
48     }
49     {
50         const wchar_t in[] = L"Feb";
51         err = std::ios_base::goodbit;
52         t = std::tm();
53         I i = f.get_monthname(I(in), I(in+sizeof(in)/sizeof(in[0])-1), ios, err, &t);
54         assert(i.base() == in+3);
55         assert(t.tm_mon == 1);
56         assert(err == std::ios_base::eofbit);
57     }
58     {
59         const wchar_t in[] = L"Mar";
60         err = std::ios_base::goodbit;
61         t = std::tm();
62         I i = f.get_monthname(I(in), I(in+sizeof(in)/sizeof(in[0])-1), ios, err, &t);
63         assert(i.base() == in+3);
64         assert(t.tm_mon == 2);
65         assert(err == std::ios_base::eofbit);
66     }
67     {
68         const wchar_t in[] = L"Apr";
69         err = std::ios_base::goodbit;
70         t = std::tm();
71         I i = f.get_monthname(I(in), I(in+sizeof(in)/sizeof(in[0])-1), ios, err, &t);
72         assert(i.base() == in+3);
73         assert(t.tm_mon == 3);
74         assert(err == std::ios_base::eofbit);
75     }
76     {
77         const wchar_t in[] = L"May";
78         err = std::ios_base::goodbit;
79         t = std::tm();
80         I i = f.get_monthname(I(in), I(in+sizeof(in)/sizeof(in[0])-1), ios, err, &t);
81         assert(i.base() == in+3);
82         assert(t.tm_mon == 4);
83         assert(err == std::ios_base::eofbit);
84     }
85     {
86         const wchar_t in[] = L"Jun";
87         err = std::ios_base::goodbit;
88         t = std::tm();
89         I i = f.get_monthname(I(in), I(in+sizeof(in)/sizeof(in[0])-1), ios, err, &t);
90         assert(i.base() == in+3);
91         assert(t.tm_mon == 5);
92         assert(err == std::ios_base::eofbit);
93     }
94     {
95         const wchar_t in[] = L"Jul";
96         err = std::ios_base::goodbit;
97         t = std::tm();
98         I i = f.get_monthname(I(in), I(in+sizeof(in)/sizeof(in[0])-1), ios, err, &t);
99         assert(i.base() == in+3);
100         assert(t.tm_mon == 6);
101         assert(err == std::ios_base::eofbit);
102     }
103     {
104         const wchar_t in[] = L"Aug";
105         err = std::ios_base::goodbit;
106         t = std::tm();
107         I i = f.get_monthname(I(in), I(in+sizeof(in)/sizeof(in[0])-1), ios, err, &t);
108         assert(i.base() == in+3);
109         assert(t.tm_mon == 7);
110         assert(err == std::ios_base::eofbit);
111     }
112     {
113         const wchar_t in[] = L"Sep";
114         err = std::ios_base::goodbit;
115         t = std::tm();
116         I i = f.get_monthname(I(in), I(in+sizeof(in)/sizeof(in[0])-1), ios, err, &t);
117         assert(i.base() == in+3);
118         assert(t.tm_mon == 8);
119         assert(err == std::ios_base::eofbit);
120     }
121     {
122         const wchar_t in[] = L"Oct";
123         err = std::ios_base::goodbit;
124         t = std::tm();
125         I i = f.get_monthname(I(in), I(in+sizeof(in)/sizeof(in[0])-1), ios, err, &t);
126         assert(i.base() == in+3);
127         assert(t.tm_mon == 9);
128         assert(err == std::ios_base::eofbit);
129     }
130     {
131         const wchar_t in[] = L"Nov";
132         err = std::ios_base::goodbit;
133         t = std::tm();
134         I i = f.get_monthname(I(in), I(in+sizeof(in)/sizeof(in[0])-1), ios, err, &t);
135         assert(i.base() == in+3);
136         assert(t.tm_mon == 10);
137         assert(err == std::ios_base::eofbit);
138     }
139     {
140         const wchar_t in[] = L"Dec";
141         err = std::ios_base::goodbit;
142         t = std::tm();
143         I i = f.get_monthname(I(in), I(in+sizeof(in)/sizeof(in[0])-1), ios, err, &t);
144         assert(i.base() == in+3);
145         assert(t.tm_mon == 11);
146         assert(err == std::ios_base::eofbit);
147     }
148     {
149         const wchar_t in[] = L"January";
150         err = std::ios_base::goodbit;
151         t = std::tm();
152         I i = f.get_monthname(I(in), I(in+sizeof(in)/sizeof(in[0])-1), ios, err, &t);
153         assert(i.base() == in+7);
154         assert(t.tm_mon == 0);
155         assert(err == std::ios_base::eofbit);
156     }
157     {
158         const wchar_t in[] = L"February";
159         err = std::ios_base::goodbit;
160         t = std::tm();
161         I i = f.get_monthname(I(in), I(in+sizeof(in)/sizeof(in[0])-1), ios, err, &t);
162         assert(i.base() == in+8);
163         assert(t.tm_mon == 1);
164         assert(err == std::ios_base::eofbit);
165     }
166     {
167         const wchar_t in[] = L"March";
168         err = std::ios_base::goodbit;
169         t = std::tm();
170         I i = f.get_monthname(I(in), I(in+sizeof(in)/sizeof(in[0])-1), ios, err, &t);
171         assert(i.base() == in+5);
172         assert(t.tm_mon == 2);
173         assert(err == std::ios_base::eofbit);
174     }
175     {
176         const wchar_t in[] = L"April";
177         err = std::ios_base::goodbit;
178         t = std::tm();
179         I i = f.get_monthname(I(in), I(in+sizeof(in)/sizeof(in[0])-1), ios, err, &t);
180         assert(i.base() == in+5);
181         assert(t.tm_mon == 3);
182         assert(err == std::ios_base::eofbit);
183     }
184     {
185         const wchar_t in[] = L"May";
186         err = std::ios_base::goodbit;
187         t = std::tm();
188         I i = f.get_monthname(I(in), I(in+sizeof(in)/sizeof(in[0])-1), ios, err, &t);
189         assert(i.base() == in+3);
190         assert(t.tm_mon == 4);
191         assert(err == std::ios_base::eofbit);
192     }
193     {
194         const wchar_t in[] = L"June";
195         err = std::ios_base::goodbit;
196         t = std::tm();
197         I i = f.get_monthname(I(in), I(in+sizeof(in)/sizeof(in[0])-1), ios, err, &t);
198         assert(i.base() == in+4);
199         assert(t.tm_mon == 5);
200         assert(err == std::ios_base::eofbit);
201     }
202     {
203         const wchar_t in[] = L"July";
204         err = std::ios_base::goodbit;
205         t = std::tm();
206         I i = f.get_monthname(I(in), I(in+sizeof(in)/sizeof(in[0])-1), ios, err, &t);
207         assert(i.base() == in+4);
208         assert(t.tm_mon == 6);
209         assert(err == std::ios_base::eofbit);
210     }
211     {
212         const wchar_t in[] = L"August";
213         err = std::ios_base::goodbit;
214         t = std::tm();
215         I i = f.get_monthname(I(in), I(in+sizeof(in)/sizeof(in[0])-1), ios, err, &t);
216         assert(i.base() == in+6);
217         assert(t.tm_mon == 7);
218         assert(err == std::ios_base::eofbit);
219     }
220     {
221         const wchar_t in[] = L"September";
222         err = std::ios_base::goodbit;
223         t = std::tm();
224         I i = f.get_monthname(I(in), I(in+sizeof(in)/sizeof(in[0])-1), ios, err, &t);
225         assert(i.base() == in+9);
226         assert(t.tm_mon == 8);
227         assert(err == std::ios_base::eofbit);
228     }
229     {
230         const wchar_t in[] = L"October";
231         err = std::ios_base::goodbit;
232         t = std::tm();
233         I i = f.get_monthname(I(in), I(in+sizeof(in)/sizeof(in[0])-1), ios, err, &t);
234         assert(i.base() == in+7);
235         assert(t.tm_mon == 9);
236         assert(err == std::ios_base::eofbit);
237     }
238     {
239         const wchar_t in[] = L"November";
240         err = std::ios_base::goodbit;
241         t = std::tm();
242         I i = f.get_monthname(I(in), I(in+sizeof(in)/sizeof(in[0])-1), ios, err, &t);
243         assert(i.base() == in+8);
244         assert(t.tm_mon == 10);
245         assert(err == std::ios_base::eofbit);
246     }
247     {
248         const wchar_t in[] = L"December";
249         err = std::ios_base::goodbit;
250         t = std::tm();
251         I i = f.get_monthname(I(in), I(in+sizeof(in)/sizeof(in[0])-1), ios, err, &t);
252         assert(i.base() == in+8);
253         assert(t.tm_mon == 11);
254         assert(err == std::ios_base::eofbit);
255     }
256     {
257         const wchar_t in[] = L"Decemper";
258         err = std::ios_base::goodbit;
259         t = std::tm();
260         I i = f.get_monthname(I(in), I(in+sizeof(in)/sizeof(in[0])-1), ios, err, &t);
261         assert(i.base() == in+5);
262         assert(t.tm_mon == 0);
263         assert(err == std::ios_base::failbit);
264     }
265 
266   return 0;
267 }
268