xref: /llvm-project/libcxx/test/std/strings/basic.string/string.nonmembers/string.io/get_line.pass.cpp (revision f4c1258d5633fcf06385ff3fd1f4bf57ab971964)
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 // <string>
10 
11 // template<class charT, class traits, class Allocator>
12 //   basic_istream<charT,traits>&
13 //   getline(basic_istream<charT,traits>& is,
14 //           basic_string<charT,traits,Allocator>& str);
15 
16 #include <string>
17 #include <sstream>
18 #include <cassert>
19 
20 #include "min_allocator.h"
21 #include "test_macros.h"
22 
23 int main(int, char**)
24 {
25     {
26         std::istringstream in(" abc\n  def\n   ghij");
27         std::string s("initial text");
28         getline(in, s);
29         assert(in.good());
30         assert(s == " abc");
31         getline(in, s);
32         assert(in.good());
33         assert(s == "  def");
34         getline(in, s);
35         assert(in.eof());
36         assert(s == "   ghij");
37     }
38 #ifndef TEST_HAS_NO_WIDE_CHARACTERS
39     {
40         std::wistringstream in(L" abc\n  def\n   ghij");
41         std::wstring s(L"initial text");
42         getline(in, s);
43         assert(in.good());
44         assert(s == L" abc");
45         getline(in, s);
46         assert(in.good());
47         assert(s == L"  def");
48         getline(in, s);
49         assert(in.eof());
50         assert(s == L"   ghij");
51     }
52 #endif
53 #if TEST_STD_VER >= 11
54     {
55         typedef std::basic_string<char, std::char_traits<char>, min_allocator<char>> S;
56         std::istringstream in(" abc\n  def\n   ghij");
57         S s("initial text");
58         getline(in, s);
59         assert(in.good());
60         assert(s == " abc");
61         getline(in, s);
62         assert(in.good());
63         assert(s == "  def");
64         getline(in, s);
65         assert(in.eof());
66         assert(s == "   ghij");
67     }
68 #ifndef TEST_HAS_NO_WIDE_CHARACTERS
69     {
70         typedef std::basic_string<wchar_t, std::char_traits<wchar_t>, min_allocator<wchar_t>> S;
71         std::wistringstream in(L" abc\n  def\n   ghij");
72         S s(L"initial text");
73         getline(in, s);
74         assert(in.good());
75         assert(s == L" abc");
76         getline(in, s);
77         assert(in.good());
78         assert(s == L"  def");
79         getline(in, s);
80         assert(in.eof());
81         assert(s == L"   ghij");
82     }
83 #endif // TEST_HAS_NO_WIDE_CHARACTERS
84 #endif // TEST_STD_VER >= 11
85 #ifndef TEST_HAS_NO_EXCEPTIONS
86     {
87         std::basic_stringbuf<char> sb("hello");
88         std::basic_istream<char> is(&sb);
89         is.exceptions(std::ios_base::eofbit);
90 
91         std::basic_string<char> s;
92         bool threw = false;
93         try {
94             std::getline(is, s);
95         } catch (std::ios::failure const&) {
96             threw = true;
97         }
98 
99         assert(!is.bad());
100         assert(!is.fail());
101         assert( is.eof());
102         assert(threw);
103         assert(s == "hello");
104     }
105 #ifndef TEST_HAS_NO_WIDE_CHARACTERS
106     {
107         std::basic_stringbuf<wchar_t> sb(L"hello");
108         std::basic_istream<wchar_t> is(&sb);
109         is.exceptions(std::ios_base::eofbit);
110 
111         std::basic_string<wchar_t> s;
112         bool threw = false;
113         try {
114             std::getline(is, s);
115         } catch (std::ios::failure const&) {
116             threw = true;
117         }
118 
119         assert(!is.bad());
120         assert(!is.fail());
121         assert( is.eof());
122         assert(threw);
123         assert(s == L"hello");
124     }
125 #endif
126 
127     {
128         std::basic_stringbuf<char> sb;
129         std::basic_istream<char> is(&sb);
130         is.exceptions(std::ios_base::failbit);
131 
132         std::basic_string<char> s;
133         bool threw = false;
134         try {
135             std::getline(is, s);
136         } catch (std::ios::failure const&) {
137             threw = true;
138         }
139 
140         assert(!is.bad());
141         assert( is.fail());
142         assert( is.eof());
143         assert(threw);
144         assert(s == "");
145     }
146 #ifndef TEST_HAS_NO_WIDE_CHARACTERS
147     {
148         std::basic_stringbuf<wchar_t> sb;
149         std::basic_istream<wchar_t> is(&sb);
150         is.exceptions(std::ios_base::failbit);
151 
152         std::basic_string<wchar_t> s;
153         bool threw = false;
154         try {
155             std::getline(is, s);
156         } catch (std::ios::failure const&) {
157             threw = true;
158         }
159 
160         assert(!is.bad());
161         assert( is.fail());
162         assert( is.eof());
163         assert(threw);
164         assert(s == L"");
165     }
166 #endif
167 #endif // TEST_HAS_NO_EXCEPTIONS
168 
169     return 0;
170 }
171