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// Requires 396145d in the built library.
10// XFAIL: using-built-library-before-llvm-9
11
12// <istream>
13
14// int_type get();
15
16#include <istream>
17#include <cassert>
18#include <streambuf>
19
20#include "test_macros.h"
21
22template <class CharT>
23struct testbuf
24 : public std::basic_streambuf<CharT>
25{
26 typedef std::basic_string<CharT> string_type;
27 typedef std::basic_streambuf<CharT> base;
28private:
29 string_type str_;
30public:
31
32 testbuf() {}
33 testbuf(const string_type& str)
34 : str_(str)
35 {
36 base::setg(const_cast<CharT*>(str_.data()),
37 const_cast<CharT*>(str_.data()),
38 const_cast<CharT*>(str_.data()) + str_.size());
39 }
40
41 CharT* eback() const {return base::eback();}
42 CharT* gptr() const {return base::gptr();}
43 CharT* egptr() const {return base::egptr();}
44};
45
46int main(int, char**)
47{
48 {
49 testbuf<char> sb(" ");
50 std::istream is(&sb);
51 char c = static_cast<char>(is.get());
52 assert(!is.eof());
53 assert(!is.fail());
54 assert(c == ' ');
55 assert(is.gcount() == 1);
56 }
57 {
58 testbuf<char> sb(" abc");
59 std::istream is(&sb);
60 char c = static_cast<char>(is.get());
61 assert(!is.eof());
62 assert(!is.fail());
63 assert(c == ' ');
64 assert(is.gcount() == 1);
65 c = static_cast<char>(is.get());
66 assert(!is.eof());
67 assert(!is.fail());
68 assert(c == 'a');
69 assert(is.gcount() == 1);
70 c = static_cast<char>(is.get());
71 assert(!is.eof());
72 assert(!is.fail());
73 assert(c == 'b');
74 assert(is.gcount() == 1);
75 c = static_cast<char>(is.get());
76 assert(!is.eof());
77 assert(!is.fail());
78 assert(c == 'c');
79 assert(is.gcount() == 1);
80 }
81#ifndef TEST_HAS_NO_WIDE_CHARACTERS
82 {
83 testbuf<wchar_t> sb(L" abc");
84 std::wistream is(&sb);
85 wchar_t c = is.get();
86 assert(!is.eof());
87 assert(!is.fail());
88 assert(c == L' ');
89 assert(is.gcount() == 1);
90 c = is.get();
91 assert(!is.eof());
92 assert(!is.fail());
93 assert(c == L'a');
94 assert(is.gcount() == 1);
95 c = is.get();
96 assert(!is.eof());
97 assert(!is.fail());
98 assert(c == L'b');
99 assert(is.gcount() == 1);
100 c = is.get();
101 assert(!is.eof());
102 assert(!is.fail());
103 assert(c == L'c');
104 assert(is.gcount() == 1);
105 }
106#endif
107#ifndef TEST_HAS_NO_EXCEPTIONS
108 {
109 testbuf<char> sb("rrrrrrrrr");
110 std::basic_istream<char> is(&sb);
111 is.exceptions(std::ios_base::eofbit);
112
113 bool threw = false;
114 try {
115 while (true) {
116 is.get();
117 if (is.eof())
118 break;
119 }
120 } catch (std::ios_base::failure const&) {
121 threw = true;
122 }
123
124 assert(!is.bad());
125 assert( is.fail());
126 assert( is.eof());
127 assert(threw);
128 }
129#ifndef TEST_HAS_NO_WIDE_CHARACTERS
130 {
131 testbuf<wchar_t> sb(L"rrrrrrrrr");
132 std::basic_istream<wchar_t> is(&sb);
133 is.exceptions(std::ios_base::eofbit);
134
135 bool threw = false;
136 try {
137 while (true) {
138 is.get();
139 if (is.eof())
140 break;
141 }
142 } catch (std::ios_base::failure const&) {
143 threw = true;
144 }
145
146 assert(!is.bad());
147 assert( is.fail());
148 assert( is.eof());
149 assert(threw);
150 }
151#endif
152#endif // TEST_HAS_NO_EXCEPTIONS
153
154 return 0;
155}
156

source code of libcxx/test/std/input.output/iostream.format/input.streams/istream.unformatted/get.pass.cpp