1// 1999-07-01 bkoz
2
3// Copyright (C) 1999, 2000, 2001, 2002, 2003, 2009
4// Free Software Foundation, Inc.
5//
6// This file is part of the GNU ISO C++ Library.  This library is free
7// software; you can redistribute it and/or modify it under the
8// terms of the GNU General Public License as published by the
9// Free Software Foundation; either version 3, or (at your option)
10// any later version.
11
12// This library is distributed in the hope that it will be useful,
13// but WITHOUT ANY WARRANTY; without even the implied warranty of
14// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15// GNU General Public License for more details.
16
17// You should have received a copy of the GNU General Public License along
18// with this library; see the file COPYING3.  If not see
19// <http://www.gnu.org/licenses/>.
20
21// 21.3.7.9 inserters and extractors
22
23// NB: This file is predicated on sstreams, istreams, and ostreams
24// working, not to mention other major details like char_traits, and
25// all of the string class.
26
27// { dg-require-fileio "" }
28
29#include <string>
30#include <fstream>
31#include <iostream>
32#include <testsuite_hooks.h>
33
34// testing basic_filebuf::xsputn via stress testing with large strings
35// based on a bug report libstdc++ 9
36// mode == out
37void test05(std::size_t size)
38{
39  bool test __attribute__((unused)) = true;
40  const char filename[] = "inserters_extractors-1.txt";
41  const char fillc = 'f';
42  std::ofstream ofs(filename);
43  std::string str(size, fillc);
44
45  // sanity checks
46  VERIFY( str.size() == size );
47  VERIFY( ofs.good() );
48
49  // stress test
50  ofs << str << std::endl;
51  if (!ofs.good())
52    test = false;
53
54  ofs << str << std::endl;
55  if (!ofs.good())
56    test = false;
57
58  VERIFY( str.size() == size );
59  VERIFY( ofs.good() );
60
61  ofs.close();
62
63  // sanity check on the written file
64  std::ifstream ifs(filename);
65  std::size_t count = 0;
66  char c;
67  while (count <= (2 * size) + 4)
68    {
69      ifs >> c;
70      if (ifs.good() && c == fillc)
71	{
72	  ++count;
73	  c = '0';
74	}
75      else
76	break;
77    }
78
79  VERIFY( count == 2 * size );
80}
81
82int main()
83{
84  test05(1);
85  test05(1000);
86  test05(10000);
87  return 0;
88}
89