15a83710eSEric Fiselier //===----------------------------------------------------------------------===//
25a83710eSEric Fiselier //
357b08b09SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
457b08b09SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
557b08b09SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
65a83710eSEric Fiselier //
75a83710eSEric Fiselier //===----------------------------------------------------------------------===//
85a83710eSEric Fiselier
95a83710eSEric Fiselier // <string>
105a83710eSEric Fiselier
115a83710eSEric Fiselier // template<class charT, class traits, class Allocator>
125a83710eSEric Fiselier // basic_istream<charT,traits>&
135a83710eSEric Fiselier // getline(basic_istream<charT,traits>& is,
145a83710eSEric Fiselier // basic_string<charT,traits,Allocator>& str, charT delim);
155a83710eSEric Fiselier
165a83710eSEric Fiselier #include <string>
175a83710eSEric Fiselier #include <sstream>
185a83710eSEric Fiselier #include <cassert>
195a83710eSEric Fiselier
205a83710eSEric Fiselier #include "min_allocator.h"
21396145d0SLouis Dionne #include "test_macros.h"
225a83710eSEric Fiselier
main(int,char **)232df59c50SJF Bastien int main(int, char**)
245a83710eSEric Fiselier {
255a83710eSEric Fiselier {
265a83710eSEric Fiselier std::istringstream in(" abc* def** ghij");
275a83710eSEric Fiselier std::string s("initial text");
28*98bb747cSArthur O'Dwyer std::getline(in, s, '*');
295a83710eSEric Fiselier assert(in.good());
305a83710eSEric Fiselier assert(s == " abc");
31*98bb747cSArthur O'Dwyer std::getline(in, s, '*');
325a83710eSEric Fiselier assert(in.good());
335a83710eSEric Fiselier assert(s == " def");
34*98bb747cSArthur O'Dwyer std::getline(in, s, '*');
355a83710eSEric Fiselier assert(in.good());
365a83710eSEric Fiselier assert(s == "");
37*98bb747cSArthur O'Dwyer std::getline(in, s, '*');
385a83710eSEric Fiselier assert(in.eof());
395a83710eSEric Fiselier assert(s == " ghij");
405a83710eSEric Fiselier }
41f4c1258dSLouis Dionne #ifndef TEST_HAS_NO_WIDE_CHARACTERS
425a83710eSEric Fiselier {
435a83710eSEric Fiselier std::wistringstream in(L" abc* def** ghij");
445a83710eSEric Fiselier std::wstring s(L"initial text");
45*98bb747cSArthur O'Dwyer std::getline(in, s, L'*');
465a83710eSEric Fiselier assert(in.good());
475a83710eSEric Fiselier assert(s == L" abc");
48*98bb747cSArthur O'Dwyer std::getline(in, s, L'*');
495a83710eSEric Fiselier assert(in.good());
505a83710eSEric Fiselier assert(s == L" def");
51*98bb747cSArthur O'Dwyer std::getline(in, s, L'*');
525a83710eSEric Fiselier assert(in.good());
535a83710eSEric Fiselier assert(s == L"");
54*98bb747cSArthur O'Dwyer std::getline(in, s, L'*');
555a83710eSEric Fiselier assert(in.eof());
565a83710eSEric Fiselier assert(s == L" ghij");
575a83710eSEric Fiselier }
58f4c1258dSLouis Dionne #endif
59f2f2a639SEric Fiselier #if TEST_STD_VER >= 11
605a83710eSEric Fiselier {
615a83710eSEric Fiselier typedef std::basic_string<char, std::char_traits<char>, min_allocator<char>> S;
625a83710eSEric Fiselier std::istringstream in(" abc* def** ghij");
635a83710eSEric Fiselier S s("initial text");
64*98bb747cSArthur O'Dwyer std::getline(in, s, '*');
655a83710eSEric Fiselier assert(in.good());
665a83710eSEric Fiselier assert(s == " abc");
67*98bb747cSArthur O'Dwyer std::getline(in, s, '*');
685a83710eSEric Fiselier assert(in.good());
695a83710eSEric Fiselier assert(s == " def");
70*98bb747cSArthur O'Dwyer std::getline(in, s, '*');
715a83710eSEric Fiselier assert(in.good());
725a83710eSEric Fiselier assert(s == "");
73*98bb747cSArthur O'Dwyer std::getline(in, s, '*');
745a83710eSEric Fiselier assert(in.eof());
755a83710eSEric Fiselier assert(s == " ghij");
765a83710eSEric Fiselier }
77f4c1258dSLouis Dionne #ifndef TEST_HAS_NO_WIDE_CHARACTERS
785a83710eSEric Fiselier {
795a83710eSEric Fiselier typedef std::basic_string<wchar_t, std::char_traits<wchar_t>, min_allocator<wchar_t>> S;
805a83710eSEric Fiselier std::wistringstream in(L" abc* def** ghij");
815a83710eSEric Fiselier S s(L"initial text");
82*98bb747cSArthur O'Dwyer std::getline(in, s, L'*');
835a83710eSEric Fiselier assert(in.good());
845a83710eSEric Fiselier assert(s == L" abc");
85*98bb747cSArthur O'Dwyer std::getline(in, s, L'*');
865a83710eSEric Fiselier assert(in.good());
875a83710eSEric Fiselier assert(s == L" def");
88*98bb747cSArthur O'Dwyer std::getline(in, s, L'*');
895a83710eSEric Fiselier assert(in.good());
905a83710eSEric Fiselier assert(s == L"");
91*98bb747cSArthur O'Dwyer std::getline(in, s, L'*');
925a83710eSEric Fiselier assert(in.eof());
935a83710eSEric Fiselier assert(s == L" ghij");
945a83710eSEric Fiselier }
95f4c1258dSLouis Dionne #endif // TEST_HAS_NO_WIDE_CHARACTERS
96f4c1258dSLouis Dionne #endif // TEST_STD_VER >= 11
97396145d0SLouis Dionne #ifndef TEST_HAS_NO_EXCEPTIONS
98396145d0SLouis Dionne {
99396145d0SLouis Dionne std::basic_stringbuf<char> sb("hello");
100396145d0SLouis Dionne std::basic_istream<char> is(&sb);
101396145d0SLouis Dionne is.exceptions(std::ios::eofbit);
102396145d0SLouis Dionne
103396145d0SLouis Dionne std::basic_string<char> s;
104396145d0SLouis Dionne bool threw = false;
105396145d0SLouis Dionne try {
106396145d0SLouis Dionne std::getline(is, s, '\n');
107396145d0SLouis Dionne } catch (std::ios::failure const&) {
108396145d0SLouis Dionne threw = true;
109396145d0SLouis Dionne }
110396145d0SLouis Dionne
111396145d0SLouis Dionne assert(!is.bad());
112396145d0SLouis Dionne assert(!is.fail());
113396145d0SLouis Dionne assert( is.eof());
114396145d0SLouis Dionne assert(threw);
115396145d0SLouis Dionne assert(s == "hello");
116396145d0SLouis Dionne }
117f4c1258dSLouis Dionne #ifndef TEST_HAS_NO_WIDE_CHARACTERS
118396145d0SLouis Dionne {
119396145d0SLouis Dionne std::basic_stringbuf<wchar_t> sb(L"hello");
120396145d0SLouis Dionne std::basic_istream<wchar_t> is(&sb);
121396145d0SLouis Dionne is.exceptions(std::ios::eofbit);
122396145d0SLouis Dionne
123396145d0SLouis Dionne std::basic_string<wchar_t> s;
124396145d0SLouis Dionne bool threw = false;
125396145d0SLouis Dionne try {
126396145d0SLouis Dionne std::getline(is, s, L'\n');
127396145d0SLouis Dionne } catch (std::ios::failure const&) {
128396145d0SLouis Dionne threw = true;
129396145d0SLouis Dionne }
130396145d0SLouis Dionne
131396145d0SLouis Dionne assert(!is.bad());
132396145d0SLouis Dionne assert(!is.fail());
133396145d0SLouis Dionne assert( is.eof());
134396145d0SLouis Dionne assert(threw);
135396145d0SLouis Dionne assert(s == L"hello");
136396145d0SLouis Dionne }
137f4c1258dSLouis Dionne #endif // TEST_HAS_NO_WIDE_CHARACTERS
138396145d0SLouis Dionne {
139396145d0SLouis Dionne std::basic_stringbuf<char> sb;
140396145d0SLouis Dionne std::basic_istream<char> is(&sb);
141396145d0SLouis Dionne is.exceptions(std::ios::failbit);
142396145d0SLouis Dionne
143396145d0SLouis Dionne std::basic_string<char> s;
144396145d0SLouis Dionne bool threw = false;
145396145d0SLouis Dionne try {
146396145d0SLouis Dionne std::getline(is, s, '\n');
147396145d0SLouis Dionne } catch (std::ios::failure const&) {
148396145d0SLouis Dionne threw = true;
149396145d0SLouis Dionne }
150396145d0SLouis Dionne
151396145d0SLouis Dionne assert(!is.bad());
152396145d0SLouis Dionne assert( is.fail());
153396145d0SLouis Dionne assert( is.eof());
154396145d0SLouis Dionne assert(threw);
155396145d0SLouis Dionne assert(s == "");
156396145d0SLouis Dionne }
157f4c1258dSLouis Dionne #ifndef TEST_HAS_NO_WIDE_CHARACTERS
158396145d0SLouis Dionne {
159396145d0SLouis Dionne std::basic_stringbuf<wchar_t> sb;
160396145d0SLouis Dionne std::basic_istream<wchar_t> is(&sb);
161396145d0SLouis Dionne is.exceptions(std::ios::failbit);
162396145d0SLouis Dionne
163396145d0SLouis Dionne std::basic_string<wchar_t> s;
164396145d0SLouis Dionne bool threw = false;
165396145d0SLouis Dionne try {
166396145d0SLouis Dionne std::getline(is, s, L'\n');
167396145d0SLouis Dionne } catch (std::ios::failure const&) {
168396145d0SLouis Dionne threw = true;
169396145d0SLouis Dionne }
170396145d0SLouis Dionne
171396145d0SLouis Dionne assert(!is.bad());
172396145d0SLouis Dionne assert( is.fail());
173396145d0SLouis Dionne assert( is.eof());
174396145d0SLouis Dionne assert(threw);
175396145d0SLouis Dionne assert(s == L"");
176396145d0SLouis Dionne }
177f4c1258dSLouis Dionne #endif // TEST_HAS_NO_WIDE_CHARACTERS
178396145d0SLouis Dionne #endif // TEST_HAS_NO_EXCEPTIONS
1792df59c50SJF Bastien
1802df59c50SJF Bastien return 0;
1815a83710eSEric Fiselier }
182