blob: e34bc844bd28651e97ae04908b9b79705cedd0e0 [file] [log] [blame]
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001//===----------------------------------------------------------------------===//
2//
Howard Hinnantf5256e12010-05-11 21:36:01 +00003// The LLVM Compiler Infrastructure
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004//
Howard Hinnantb64f8b02010-11-16 22:09:02 +00005// This file is dual licensed under the MIT and the University of Illinois Open
6// Source Licenses. See LICENSE.TXT for details.
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00007//
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
Marshall Clow83e2c4d2013-01-05 03:21:01 +000019#include "platform_support.h" // locale name macros
Howard Hinnantc0d0cba2011-10-03 15:23:59 +000020
Howard Hinnantbc8d3f92010-05-11 19:42:16 +000021template <class CharT>
22struct test_buf
23 : public std::basic_filebuf<CharT>
24{
25 typedef std::basic_filebuf<CharT> base;
26 typedef typename base::char_type char_type;
27 typedef typename base::int_type int_type;
28
29 char_type* eback() const {return base::eback();}
30 char_type* gptr() const {return base::gptr();}
31 char_type* egptr() const {return base::egptr();}
32 void gbump(int n) {base::gbump(n);}
33
34 virtual int_type underflow() {return base::underflow();}
35};
36
37int main()
38{
39 {
40 test_buf<char> f;
41 assert(f.open("underflow.dat", std::ios_base::in) != 0);
42 assert(f.is_open());
43 assert(f.eback() == 0);
44 assert(f.gptr() == 0);
45 assert(f.egptr() == 0);
46 assert(f.underflow() == '1');
47 assert(f.eback() != 0);
48 assert(f.eback() == f.gptr());
49 assert(*f.gptr() == '1');
50 assert(f.egptr() - f.eback() == 9);
51 }
52 {
53 test_buf<char> f;
54 assert(f.open("underflow.dat", std::ios_base::in) != 0);
55 assert(f.pubsetbuf(0, 0));
56 assert(f.is_open());
57 assert(f.eback() == 0);
58 assert(f.gptr() == 0);
59 assert(f.egptr() == 0);
60 assert(f.underflow() == '1');
61 assert(f.eback() != 0);
62 assert(f.eback() == f.gptr());
63 assert(*f.gptr() == '1');
64 assert(f.egptr() - f.eback() == 8);
65 f.gbump(8);
66 assert(f.sgetc() == '9');
67 assert(f.eback()[0] == '5');
68 assert(f.eback()[1] == '6');
69 assert(f.eback()[2] == '7');
70 assert(f.eback()[3] == '8');
71 assert(f.gptr() - f.eback() == 4);
72 assert(*f.gptr() == '9');
73 assert(f.egptr() - f.gptr() == 1);
74 }
75 {
76 test_buf<wchar_t> f;
77 assert(f.open("underflow.dat", std::ios_base::in) != 0);
78 assert(f.is_open());
79 assert(f.eback() == 0);
80 assert(f.gptr() == 0);
81 assert(f.egptr() == 0);
82 assert(f.underflow() == L'1');
83 assert(f.eback() != 0);
84 assert(f.eback() == f.gptr());
85 assert(*f.gptr() == L'1');
86 assert(f.egptr() - f.eback() == 9);
87 }
88 {
89 test_buf<wchar_t> f;
90 assert(f.pubsetbuf(0, 0));
91 assert(f.open("underflow.dat", std::ios_base::in) != 0);
92 assert(f.is_open());
93 assert(f.eback() == 0);
94 assert(f.gptr() == 0);
95 assert(f.egptr() == 0);
96 assert(f.underflow() == L'1');
97 assert(f.eback() != 0);
98 assert(f.eback() == f.gptr());
99 assert(*f.gptr() == L'1');
100 assert(f.egptr() - f.eback() == 8);
101 f.gbump(8);
102 assert(f.sgetc() == L'9');
103 assert(f.eback()[0] == L'5');
104 assert(f.eback()[1] == L'6');
105 assert(f.eback()[2] == L'7');
106 assert(f.eback()[3] == L'8');
107 assert(f.gptr() - f.eback() == 4);
108 assert(*f.gptr() == L'9');
109 assert(f.egptr() - f.gptr() == 1);
110 }
111 {
112 test_buf<wchar_t> f;
Howard Hinnantc0d0cba2011-10-03 15:23:59 +0000113 f.pubimbue(std::locale(LOCALE_en_US_UTF_8));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000114 assert(f.open("underflow_utf8.dat", std::ios_base::in) != 0);
115 assert(f.is_open());
116 assert(f.sbumpc() == 0x4E51);
117 assert(f.sbumpc() == 0x4E52);
118 assert(f.sbumpc() == 0x4E53);
119 assert(f.sbumpc() == -1);
120 }
Howard Hinnant256813f2010-08-22 00:26:48 +0000121}