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