1313// getline(basic_istream<charT,traits>& is,
1414// basic_string<charT,traits,Allocator>& str);
1515
16- #include < string>
17- #include < sstream>
1816#include < cassert>
17+ #include < sstream>
18+ #include < string>
1919
20+ #include " make_string.h"
2021#include " min_allocator.h"
22+ #include " stream_types.h"
2123#include " test_macros.h"
2224
23- template <template <class > class Alloc >
24- void test_string () {
25- using S = std::basic_string<char , std::char_traits<char >, Alloc<char > >;
26- #ifndef TEST_HAS_NO_WIDE_CHARACTERS
27- using WS = std::basic_string<wchar_t , std::char_traits<wchar_t >, Alloc<wchar_t > >;
28- #endif
29- {
30- std::istringstream in (" abc\n def\n ghij" );
31- S s (" initial text" );
32- std::getline (in, s);
33- assert (in.good ());
34- assert (s == " abc" );
35- std::getline (in, s);
36- assert (in.good ());
37- assert (s == " def" );
38- std::getline (in, s);
39- assert (in.eof ());
40- assert (s == " ghij" );
41- }
42- #ifndef TEST_HAS_NO_WIDE_CHARACTERS
25+ template <class CharT , class Alloc , class Stream , class Streambuf >
26+ void test () {
27+ using string_type = std::basic_string<CharT, std::char_traits<CharT>, Alloc>;
28+ using stream_type = std::basic_istream<CharT>;
29+ using streambuf_type = Streambuf;
30+
4331 {
44- std::wistringstream in (L" abc\n def\n ghij" );
45- WS s (L" initial text" );
32+ streambuf_type sb (MAKE_CSTRING (CharT, " abc\n def\n ghij" ));
33+ stream_type in (&sb);
34+ string_type s (MAKE_CSTRING (CharT, " initial text" ));
4635 std::getline (in, s);
4736 assert (in.good ());
48- assert (s == L " abc" );
37+ assert (s == MAKE_CSTRING (CharT, " abc" ) );
4938 std::getline (in, s);
5039 assert (in.good ());
51- assert (s == L " def" );
40+ assert (s == MAKE_CSTRING (CharT, " def" ) );
5241 std::getline (in, s);
5342 assert (in.eof ());
54- assert (s == L " ghij" );
43+ assert (s == MAKE_CSTRING (CharT, " ghij" ) );
5544 }
56- #endif
57-
5845#ifndef TEST_HAS_NO_EXCEPTIONS
5946 {
60- std::basic_stringbuf< char > sb (" hello" );
61- std::basic_istream< char > is (&sb);
47+ streambuf_type sb (MAKE_CSTRING (CharT, " hello" ) );
48+ stream_type is (&sb);
6249 is.exceptions (std::ios_base::eofbit);
6350
64- S s;
51+ string_type s;
6552 bool threw = false ;
6653 try {
6754 std::getline (is, s);
@@ -73,15 +60,14 @@ void test_string() {
7360 assert (!is.fail ());
7461 assert (is.eof ());
7562 assert (threw);
76- assert (s == " hello" );
63+ assert (s == MAKE_CSTRING (CharT, " hello" ) );
7764 }
78- # ifndef TEST_HAS_NO_WIDE_CHARACTERS
7965 {
80- std::basic_stringbuf< wchar_t > sb (L" hello " );
81- std::basic_istream< wchar_t > is (&sb);
82- is.exceptions (std::ios_base::eofbit );
66+ streambuf_type sb (MAKE_CSTRING (CharT, " " ) );
67+ stream_type is (&sb);
68+ is.exceptions (std::ios_base::failbit );
8369
84- WS s;
70+ string_type s;
8571 bool threw = false ;
8672 try {
8773 std::getline (is, s);
@@ -90,61 +76,52 @@ void test_string() {
9076 }
9177
9278 assert (!is.bad ());
93- assert (! is.fail ());
79+ assert (is.fail ());
9480 assert (is.eof ());
9581 assert (threw);
96- assert (s == L" hello " );
82+ assert (s == MAKE_CSTRING (CharT, " " ) );
9783 }
98- # endif
84+ #endif // TEST_HAS_NO_EXCEPTIONS
85+ }
9986
87+ template <template <class > class Alloc >
88+ void test_alloc () {
89+ test<char , Alloc<char >, std::basic_istringstream<char >, std::basic_stringbuf<char > >();
90+ test<char , Alloc<char >, std::basic_istringstream<char >, non_buffering_streambuf<char > >();
91+ #ifndef TEST_HAS_NO_WIDE_CHARACTERS
92+ test<wchar_t , Alloc<wchar_t >, std::basic_istringstream<wchar_t >, std::basic_stringbuf<wchar_t > >();
93+ test<wchar_t , Alloc<wchar_t >, std::basic_istringstream<wchar_t >, non_buffering_streambuf<wchar_t > >();
94+ #endif
95+ }
96+ /*
97+ void test_tiny_allocator() {
10098 {
101- std::basic_stringbuf<char > sb;
102- std::basic_istream<char > is (&sb);
103- is.exceptions (std::ios_base::failbit);
104-
105- S s;
106- bool threw = false ;
107- try {
108- std::getline (is, s);
109- } catch (std::ios::failure const &) {
110- threw = true ;
111- }
112-
113- assert (!is.bad ());
114- assert (is.fail ());
115- assert (is.eof ());
116- assert (threw);
117- assert (s == " " );
99+ std::string in_str =
100+ "this is a too long line for the string that has to be longer because the implementation is broken\n";
101+ std::istringstream iss(in_str);
102+ std::basic_string<char, std::char_traits<char>, tiny_size_allocator<40, char>> str;
103+ std::getline(iss, str);
104+ assert(str == std::string_view{in_str}.substr(0, str.max_size()));
105+ assert(iss.rdstate() & std::ios::failbit);
118106 }
119- # ifndef TEST_HAS_NO_WIDE_CHARACTERS
120107 {
121- std::basic_stringbuf<wchar_t > sb;
122- std::basic_istream<wchar_t > is (&sb);
123- is.exceptions (std::ios_base::failbit);
124-
125- WS s;
126- bool threw = false ;
127- try {
128- std::getline (is, s);
129- } catch (std::ios::failure const &) {
130- threw = true ;
131- }
132-
133- assert (!is.bad ());
134- assert (is.fail ());
135- assert (is.eof ());
136- assert (threw);
137- assert (s == L" " );
108+ std::string in_str =
109+ "this is a too long line for the string that has to be longer because the implementation is broken";
110+ std::istringstream iss(in_str);
111+ std::basic_string<char, std::char_traits<char>, tiny_size_allocator<40, char>> str;
112+ std::getline(iss, str);
113+ assert(str == std::string_view{in_str}.substr(0, str.max_size()));
114+ assert(iss.rdstate() & std::ios::failbit);
138115 }
139- # endif
140- #endif // TEST_HAS_NO_EXCEPTIONS
141116}
117+ */
142118
143119int main (int , char **) {
144- test_string <std::allocator>();
120+ test_alloc <std::allocator>();
145121#if TEST_STD_VER >= 11
146- test_string <min_allocator>();
122+ test_alloc <min_allocator>();
147123#endif
124+ // test_tiny_allocator();
148125
149126 return 0 ;
150127}
0 commit comments