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 // FILE_DEPENDENCIES: underflow.dat, underflow_utf8.dat
10 
11 // <locale>
12 
13 // ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS
14 
15 // wbuffer_convert<Codecvt, Elem, Tr>
16 
17 // int_type underflow();
18 
19 // This test is not entirely portable
20 
21 // XFAIL: no-wide-characters
22 
23 #include <locale>
24 #include <codecvt>
25 #include <fstream>
26 #include <cassert>
27 
28 #include "test_macros.h"
29 
30 struct test_buf
31     : public std::wbuffer_convert<std::codecvt_utf8<wchar_t> >
32 {
33     typedef std::wbuffer_convert<std::codecvt_utf8<wchar_t> > base;
34     typedef base::char_type   char_type;
35     typedef base::int_type    int_type;
36     typedef base::traits_type traits_type;
37 
38     explicit test_buf(std::streambuf* sb) : base(sb) {}
39 
40     char_type* eback() const {return base::eback();}
41     char_type* gptr()  const {return base::gptr();}
42     char_type* egptr() const {return base::egptr();}
43     void gbump(int n) {base::gbump(n);}
44 
45     virtual int_type underflow() {return base::underflow();}
46 };
47 
48 int main(int, char**)
49 {
50     {
51         std::ifstream bs("underflow.dat");
52         test_buf f(bs.rdbuf());
53         assert(f.eback() == 0);
54         assert(f.gptr() == 0);
55         assert(f.egptr() == 0);
56         assert(f.underflow() == L'1');
57         assert(f.eback() != 0);
58         assert(f.eback() == f.gptr());
59         assert(*f.gptr() == L'1');
60         assert(f.egptr() - f.eback() == 9);
61     }
62     {
63         std::ifstream bs("underflow.dat");
64         test_buf f(bs.rdbuf());
65         assert(f.eback() == 0);
66         assert(f.gptr() == 0);
67         assert(f.egptr() == 0);
68         assert(f.underflow() == L'1');
69         assert(f.eback() != 0);
70         assert(f.eback() == f.gptr());
71         assert(*f.gptr() == L'1');
72         assert(f.egptr() - f.eback() == 9);
73         f.gbump(8);
74         assert(f.sgetc() == L'9');
75         assert(f.eback()[0] == L'1');
76         assert(f.eback()[1] == L'2');
77         assert(f.eback()[2] == L'3');
78         assert(f.eback()[3] == L'4');
79         assert(f.gptr() - f.eback() == 8);
80         assert(*f.gptr() == L'9');
81         assert(f.egptr() - f.gptr() == 1);
82     }
83     {
84         std::ifstream bs("underflow_utf8.dat");
85         test_buf f(bs.rdbuf());
86         assert(f.sbumpc() == 0x4E51);
87         assert(f.sbumpc() == 0x4E52);
88         assert(f.sbumpc() == 0x4E53);
89         assert(f.sbumpc() == test_buf::traits_type::eof());
90     }
91 
92   return 0;
93 }
94