blob: 1f6336277d018a6e282480460afaec3b795590ff [file] [log] [blame]
Howard Hinnant3e519522010-05-11 19:42:16 +00001//===----------------------------------------------------------------------===//
2//
Howard Hinnant5b08a8a2010-05-11 21:36:01 +00003// The LLVM Compiler Infrastructure
Howard Hinnant3e519522010-05-11 19:42:16 +00004//
5// This file is distributed under the University of Illinois Open Source
6// License. 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}