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// <locale>
11
12// class time_get<charT, InputIterator>
13
14// iter_type
15// get_time(iter_type s, iter_type end, ios_base& str,
16//          ios_base::iostate& err, tm* t) const;
17
18#include <locale>
19#include <cassert>
20#include "test_iterators.h"
21
22typedef input_iterator<const wchar_t*> I;
23
24typedef std::time_get<wchar_t, I> F;
25
26class my_facet
27    : public F
28{
29public:
30    explicit my_facet(std::size_t refs = 0)
31        : F(refs) {}
32};
33
34int main()
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"0:0:0";
42        err = std::ios_base::goodbit;
43        t = std::tm();
44        I i = f.get_time(I(in), I(in+sizeof(in)/sizeof(in[0])-1), ios, err, &t);
45        assert(i.base() == in+sizeof(in)/sizeof(in[0])-1);
46        assert(t.tm_hour == 0);
47        assert(t.tm_min == 0);
48        assert(t.tm_sec == 0);
49        assert(err == std::ios_base::eofbit);
50    }
51    {
52        const wchar_t in[] = L"23:59:60";
53        err = std::ios_base::goodbit;
54        t = std::tm();
55        I i = f.get_time(I(in), I(in+sizeof(in)/sizeof(in[0])-1), ios, err, &t);
56        assert(i.base() == in+sizeof(in)/sizeof(in[0])-1);
57        assert(t.tm_hour == 23);
58        assert(t.tm_min == 59);
59        assert(t.tm_sec == 60);
60        assert(err == std::ios_base::eofbit);
61    }
62    {
63        const wchar_t in[] = L"24:59:60";
64        err = std::ios_base::goodbit;
65        t = std::tm();
66        I i = f.get_time(I(in), I(in+sizeof(in)/sizeof(in[0])-1), ios, err, &t);
67        assert(i.base() == in+2);
68        assert(t.tm_hour == 0);
69        assert(t.tm_min == 0);
70        assert(t.tm_sec == 0);
71        assert(err == std::ios_base::failbit);
72    }
73    {
74        const wchar_t in[] = L"23:60:60";
75        err = std::ios_base::goodbit;
76        t = std::tm();
77        I i = f.get_time(I(in), I(in+sizeof(in)/sizeof(in[0])-1), ios, err, &t);
78        assert(i.base() == in+5);
79//         assert(t.tm_hour == 0);
80//         assert(t.tm_min == 0);
81//         assert(t.tm_sec == 0);
82        assert(err == std::ios_base::failbit);
83    }
84    {
85        const wchar_t in[] = L"23:59:61";
86        err = std::ios_base::goodbit;
87        t = std::tm();
88        I i = f.get_time(I(in), I(in+sizeof(in)/sizeof(in[0])-1), ios, err, &t);
89        assert(i.base() == in+8);
90//         assert(t.tm_hour == 0);
91//         assert(t.tm_min == 0);
92//         assert(t.tm_sec == 0);
93        assert(err == (std::ios_base::failbit | std::ios_base::eofbit));
94    }
95    {
96        const wchar_t in[] = L"2:43:221";
97        err = std::ios_base::goodbit;
98        t = std::tm();
99        I i = f.get_time(I(in), I(in+sizeof(in)/sizeof(in[0])-1), ios, err, &t);
100        assert(i.base() == in+7);
101        assert(t.tm_hour == 2);
102        assert(t.tm_min == 43);
103        assert(t.tm_sec == 22);
104        assert(err == std::ios_base::goodbit);
105    }
106    {
107        const wchar_t in[] = L"2.43:221";
108        err = std::ios_base::goodbit;
109        t = std::tm();
110        I i = f.get_time(I(in), I(in+sizeof(in)/sizeof(in[0])-1), ios, err, &t);
111        assert(i.base() == in+1);
112//         assert(t.tm_hour == 0);
113//         assert(t.tm_min == 0);
114//         assert(t.tm_sec == 0);
115        assert(err == std::ios_base::failbit);
116    }
117}
118