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