1// Copyright (C) 2004-2015 Free Software Foundation, Inc.
2//
3// This file is part of the GNU ISO C++ Library.  This library is free
4// software; you can redistribute it and/or modify it under the
5// terms of the GNU General Public License as published by the
6// Free Software Foundation; either version 3, or (at your option)
7// any later version.
8
9// This library is distributed in the hope that it will be useful,
10// but WITHOUT ANY WARRANTY; without even the implied warranty of
11// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12// GNU General Public License for more details.
13
14// You should have received a copy of the GNU General Public License along
15// with this library; see the file COPYING3.  If not see
16// <http://www.gnu.org/licenses/>.
17
18// 27.6.1.3 unformatted input functions
19
20#include <istream>
21#include <sstream>
22#include <testsuite_hooks.h>
23
24void
25test02()
26{
27  typedef std::char_traits<wchar_t>	traits_type;
28
29  bool test __attribute__((unused)) = true;
30  const wchar_t str_lit01[] = L"\t\t\t    sun*ra \n"
31  L"                            "
32  L"and his myth science arkestra present\n"
33  L"                            "
34  L"angles and demons @ play\n"
35  L"                            "
36  L"the nubians of plutonia";
37  std::wstring str01(str_lit01);
38  std::wstring strtmp;
39
40  std::wstringbuf sbuf_04(str01, std::ios_base::in);
41
42  std::wistream is_00(0);
43  std::wistream is_04(&sbuf_04);
44  std::ios_base::iostate state1, state2, statefail, stateeof;
45  statefail = std::ios_base::failbit;
46  stateeof = std::ios_base::eofbit;
47  wchar_t carray1[400] = L"";
48
49  // istream& getline(wchar_t* s, streamsize n, wchar_t delim)
50  // istream& getline(wchar_t* s, streamsize n)
51  state1 = is_00.rdstate();
52  is_00.getline(carray1, 20, L'*');
53  state2 = is_00.rdstate();
54  // make sure failbit was set, since we couldn't extract
55  // from the null streambuf...
56  VERIFY( state1 != state2 );
57  VERIFY( static_cast<bool>(state2 & statefail) );
58
59  VERIFY( is_04.gcount() == 0 );
60  state1 = is_04.rdstate();
61  is_04.getline(carray1, 1, L'\t'); // extracts, throws away
62  state2 = is_04.rdstate();
63  VERIFY( is_04.gcount() == 1 );
64  VERIFY( state1 == state2 );
65  VERIFY( state1 == 0 );
66  VERIFY( !traits_type::compare(L"", carray1, 1) );
67
68  state1 = is_04.rdstate();
69  is_04.getline(carray1, 20, L'*');
70  state2 = is_04.rdstate();
71  VERIFY( is_04.gcount() == 10 );
72  VERIFY( state1 == state2 );
73  VERIFY( state1 == 0 );
74  VERIFY( !traits_type::compare(L"\t\t    sun", carray1, 10) );
75
76  state1 = is_04.rdstate();
77  is_04.getline(carray1, 20);
78  state2 = is_04.rdstate();
79  VERIFY( is_04.gcount() == 4 );
80  VERIFY( state1 == state2 );
81  VERIFY( state1 == 0 );
82  VERIFY( !traits_type::compare(L"ra ", carray1, 4) );
83
84  state1 = is_04.rdstate();
85  is_04.getline(carray1, 65);
86  state2 = is_04.rdstate();
87  VERIFY( is_04.gcount() == 64 );
88  VERIFY( state1 != state2 );
89  VERIFY( state2 == statefail );
90  VERIFY( !traits_type::compare(
91  L"                            and his myth science arkestra presen",
92                                carray1, 65) );
93
94  is_04.clear();
95  state1 = is_04.rdstate();
96  is_04.getline(carray1, 120, L'|');
97  state2 = is_04.rdstate();
98  VERIFY( is_04.gcount() == 106 );
99  VERIFY( state1 != state2 );
100  VERIFY( state2 == stateeof );
101
102  is_04.clear();
103  state1 = is_04.rdstate();
104  is_04.getline(carray1, 100, L'|');
105  state2 = is_04.rdstate();
106  VERIFY( is_04.gcount() == 0 );
107  VERIFY( state1 != state2 );
108  VERIFY( static_cast<bool>(state2 & stateeof) );
109  VERIFY( static_cast<bool>(state2 & statefail) );
110}
111
112int
113main()
114{
115  test02();
116  return 0;
117}
118