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);
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\n  def\n   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.eof());
365a83710eSEric Fiselier         assert(s == "   ghij");
375a83710eSEric Fiselier     }
38f4c1258dSLouis Dionne #ifndef TEST_HAS_NO_WIDE_CHARACTERS
395a83710eSEric Fiselier     {
405a83710eSEric Fiselier         std::wistringstream in(L" abc\n  def\n   ghij");
415a83710eSEric Fiselier         std::wstring s(L"initial text");
42*98bb747cSArthur O'Dwyer         std::getline(in, s);
435a83710eSEric Fiselier         assert(in.good());
445a83710eSEric Fiselier         assert(s == L" abc");
45*98bb747cSArthur O'Dwyer         std::getline(in, s);
465a83710eSEric Fiselier         assert(in.good());
475a83710eSEric Fiselier         assert(s == L"  def");
48*98bb747cSArthur O'Dwyer         std::getline(in, s);
495a83710eSEric Fiselier         assert(in.eof());
505a83710eSEric Fiselier         assert(s == L"   ghij");
515a83710eSEric Fiselier     }
52f4c1258dSLouis Dionne #endif
53f2f2a639SEric Fiselier #if TEST_STD_VER >= 11
545a83710eSEric Fiselier     {
555a83710eSEric Fiselier         typedef std::basic_string<char, std::char_traits<char>, min_allocator<char>> S;
565a83710eSEric Fiselier         std::istringstream in(" abc\n  def\n   ghij");
575a83710eSEric Fiselier         S s("initial text");
58*98bb747cSArthur O'Dwyer         std::getline(in, s);
595a83710eSEric Fiselier         assert(in.good());
605a83710eSEric Fiselier         assert(s == " abc");
61*98bb747cSArthur O'Dwyer         std::getline(in, s);
625a83710eSEric Fiselier         assert(in.good());
635a83710eSEric Fiselier         assert(s == "  def");
64*98bb747cSArthur O'Dwyer         std::getline(in, s);
655a83710eSEric Fiselier         assert(in.eof());
665a83710eSEric Fiselier         assert(s == "   ghij");
675a83710eSEric Fiselier     }
68f4c1258dSLouis Dionne #ifndef TEST_HAS_NO_WIDE_CHARACTERS
695a83710eSEric Fiselier     {
705a83710eSEric Fiselier         typedef std::basic_string<wchar_t, std::char_traits<wchar_t>, min_allocator<wchar_t>> S;
715a83710eSEric Fiselier         std::wistringstream in(L" abc\n  def\n   ghij");
725a83710eSEric Fiselier         S s(L"initial text");
73*98bb747cSArthur O'Dwyer         std::getline(in, s);
745a83710eSEric Fiselier         assert(in.good());
755a83710eSEric Fiselier         assert(s == L" abc");
76*98bb747cSArthur O'Dwyer         std::getline(in, s);
775a83710eSEric Fiselier         assert(in.good());
785a83710eSEric Fiselier         assert(s == L"  def");
79*98bb747cSArthur O'Dwyer         std::getline(in, s);
805a83710eSEric Fiselier         assert(in.eof());
815a83710eSEric Fiselier         assert(s == L"   ghij");
825a83710eSEric Fiselier     }
83f4c1258dSLouis Dionne #endif // TEST_HAS_NO_WIDE_CHARACTERS
84f4c1258dSLouis Dionne #endif // TEST_STD_VER >= 11
85396145d0SLouis Dionne #ifndef TEST_HAS_NO_EXCEPTIONS
86396145d0SLouis Dionne     {
87396145d0SLouis Dionne         std::basic_stringbuf<char> sb("hello");
88396145d0SLouis Dionne         std::basic_istream<char> is(&sb);
89396145d0SLouis Dionne         is.exceptions(std::ios_base::eofbit);
90396145d0SLouis Dionne 
91396145d0SLouis Dionne         std::basic_string<char> s;
92396145d0SLouis Dionne         bool threw = false;
93396145d0SLouis Dionne         try {
94396145d0SLouis Dionne             std::getline(is, s);
95396145d0SLouis Dionne         } catch (std::ios::failure const&) {
96396145d0SLouis Dionne             threw = true;
97396145d0SLouis Dionne         }
98396145d0SLouis Dionne 
99396145d0SLouis Dionne         assert(!is.bad());
100396145d0SLouis Dionne         assert(!is.fail());
101396145d0SLouis Dionne         assert( is.eof());
102396145d0SLouis Dionne         assert(threw);
103396145d0SLouis Dionne         assert(s == "hello");
104396145d0SLouis Dionne     }
105f4c1258dSLouis Dionne #ifndef TEST_HAS_NO_WIDE_CHARACTERS
106396145d0SLouis Dionne     {
107396145d0SLouis Dionne         std::basic_stringbuf<wchar_t> sb(L"hello");
108396145d0SLouis Dionne         std::basic_istream<wchar_t> is(&sb);
109396145d0SLouis Dionne         is.exceptions(std::ios_base::eofbit);
110396145d0SLouis Dionne 
111396145d0SLouis Dionne         std::basic_string<wchar_t> s;
112396145d0SLouis Dionne         bool threw = false;
113396145d0SLouis Dionne         try {
114396145d0SLouis Dionne             std::getline(is, s);
115396145d0SLouis Dionne         } catch (std::ios::failure const&) {
116396145d0SLouis Dionne             threw = true;
117396145d0SLouis Dionne         }
118396145d0SLouis Dionne 
119396145d0SLouis Dionne         assert(!is.bad());
120396145d0SLouis Dionne         assert(!is.fail());
121396145d0SLouis Dionne         assert( is.eof());
122396145d0SLouis Dionne         assert(threw);
123396145d0SLouis Dionne         assert(s == L"hello");
124396145d0SLouis Dionne     }
125f4c1258dSLouis Dionne #endif
126396145d0SLouis Dionne 
127396145d0SLouis Dionne     {
128396145d0SLouis Dionne         std::basic_stringbuf<char> sb;
129396145d0SLouis Dionne         std::basic_istream<char> is(&sb);
130396145d0SLouis Dionne         is.exceptions(std::ios_base::failbit);
131396145d0SLouis Dionne 
132396145d0SLouis Dionne         std::basic_string<char> s;
133396145d0SLouis Dionne         bool threw = false;
134396145d0SLouis Dionne         try {
135396145d0SLouis Dionne             std::getline(is, s);
136396145d0SLouis Dionne         } catch (std::ios::failure const&) {
137396145d0SLouis Dionne             threw = true;
138396145d0SLouis Dionne         }
139396145d0SLouis Dionne 
140396145d0SLouis Dionne         assert(!is.bad());
141396145d0SLouis Dionne         assert( is.fail());
142396145d0SLouis Dionne         assert( is.eof());
143396145d0SLouis Dionne         assert(threw);
144396145d0SLouis Dionne         assert(s == "");
145396145d0SLouis Dionne     }
146f4c1258dSLouis Dionne #ifndef TEST_HAS_NO_WIDE_CHARACTERS
147396145d0SLouis Dionne     {
148396145d0SLouis Dionne         std::basic_stringbuf<wchar_t> sb;
149396145d0SLouis Dionne         std::basic_istream<wchar_t> is(&sb);
150396145d0SLouis Dionne         is.exceptions(std::ios_base::failbit);
151396145d0SLouis Dionne 
152396145d0SLouis Dionne         std::basic_string<wchar_t> s;
153396145d0SLouis Dionne         bool threw = false;
154396145d0SLouis Dionne         try {
155396145d0SLouis Dionne             std::getline(is, s);
156396145d0SLouis Dionne         } catch (std::ios::failure const&) {
157396145d0SLouis Dionne             threw = true;
158396145d0SLouis Dionne         }
159396145d0SLouis Dionne 
160396145d0SLouis Dionne         assert(!is.bad());
161396145d0SLouis Dionne         assert( is.fail());
162396145d0SLouis Dionne         assert( is.eof());
163396145d0SLouis Dionne         assert(threw);
164396145d0SLouis Dionne         assert(s == L"");
165396145d0SLouis Dionne     }
166f4c1258dSLouis Dionne #endif
167396145d0SLouis Dionne #endif // TEST_HAS_NO_EXCEPTIONS
1682df59c50SJF Bastien 
1692df59c50SJF Bastien     return 0;
1705a83710eSEric Fiselier }
171