underflow.pass.cpp revision b64f8b07c104c6cc986570ac8ee0ed16a9f23976
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// <fstream>
11
12// int_type underflow();
13
14// This test is not entirely portable
15
16#include <fstream>
17#include <cassert>
18
19template <class CharT>
20struct test_buf
21    : public std::basic_filebuf<CharT>
22{
23    typedef std::basic_filebuf<CharT> base;
24    typedef typename base::char_type  char_type;
25    typedef typename base::int_type   int_type;
26
27    char_type* eback() const {return base::eback();}
28    char_type* gptr()  const {return base::gptr();}
29    char_type* egptr() const {return base::egptr();}
30    void gbump(int n) {base::gbump(n);}
31
32    virtual int_type underflow() {return base::underflow();}
33};
34
35int main()
36{
37    {
38        test_buf<char> f;
39        assert(f.open("underflow.dat", std::ios_base::in) != 0);
40        assert(f.is_open());
41        assert(f.eback() == 0);
42        assert(f.gptr() == 0);
43        assert(f.egptr() == 0);
44        assert(f.underflow() == '1');
45        assert(f.eback() != 0);
46        assert(f.eback() == f.gptr());
47        assert(*f.gptr() == '1');
48        assert(f.egptr() - f.eback() == 9);
49    }
50    {
51        test_buf<char> f;
52        assert(f.open("underflow.dat", std::ios_base::in) != 0);
53        assert(f.pubsetbuf(0, 0));
54        assert(f.is_open());
55        assert(f.eback() == 0);
56        assert(f.gptr() == 0);
57        assert(f.egptr() == 0);
58        assert(f.underflow() == '1');
59        assert(f.eback() != 0);
60        assert(f.eback() == f.gptr());
61        assert(*f.gptr() == '1');
62        assert(f.egptr() - f.eback() == 8);
63        f.gbump(8);
64        assert(f.sgetc() == '9');
65        assert(f.eback()[0] == '5');
66        assert(f.eback()[1] == '6');
67        assert(f.eback()[2] == '7');
68        assert(f.eback()[3] == '8');
69        assert(f.gptr() - f.eback() == 4);
70        assert(*f.gptr() == '9');
71        assert(f.egptr() - f.gptr() == 1);
72    }
73    {
74        test_buf<wchar_t> f;
75        assert(f.open("underflow.dat", std::ios_base::in) != 0);
76        assert(f.is_open());
77        assert(f.eback() == 0);
78        assert(f.gptr() == 0);
79        assert(f.egptr() == 0);
80        assert(f.underflow() == L'1');
81        assert(f.eback() != 0);
82        assert(f.eback() == f.gptr());
83        assert(*f.gptr() == L'1');
84        assert(f.egptr() - f.eback() == 9);
85    }
86    {
87        test_buf<wchar_t> f;
88        assert(f.pubsetbuf(0, 0));
89        assert(f.open("underflow.dat", std::ios_base::in) != 0);
90        assert(f.is_open());
91        assert(f.eback() == 0);
92        assert(f.gptr() == 0);
93        assert(f.egptr() == 0);
94        assert(f.underflow() == L'1');
95        assert(f.eback() != 0);
96        assert(f.eback() == f.gptr());
97        assert(*f.gptr() == L'1');
98        assert(f.egptr() - f.eback() == 8);
99        f.gbump(8);
100        assert(f.sgetc() == L'9');
101        assert(f.eback()[0] == L'5');
102        assert(f.eback()[1] == L'6');
103        assert(f.eback()[2] == L'7');
104        assert(f.eback()[3] == L'8');
105        assert(f.gptr() - f.eback() == 4);
106        assert(*f.gptr() == L'9');
107        assert(f.egptr() - f.gptr() == 1);
108    }
109    {
110        test_buf<wchar_t> f;
111        f.pubimbue(std::locale("en_US.UTF-8"));
112        assert(f.open("underflow_utf8.dat", std::ios_base::in) != 0);
113        assert(f.is_open());
114        assert(f.sbumpc() == 0x4E51);
115        assert(f.sbumpc() == 0x4E52);
116        assert(f.sbumpc() == 0x4E53);
117        assert(f.sbumpc() == -1);
118    }
119}
120