+++ /dev/null
-// 1999-08-16 bkoz
-
-// Copyright (C) 1999, 2000, 2002 Free Software Foundation
-//
-// This file is part of the GNU ISO C++ Library. This library is free
-// software; you can redistribute it and/or modify it under the
-// terms of the GNU General Public License as published by the
-// Free Software Foundation; either version 2, or (at your option)
-// any later version.
-
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-
-// You should have received a copy of the GNU General Public License along
-// with this library; see the file COPYING. If not, write to the Free
-// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
-// USA.
-
-// 27.6.2.5.4 basic_ostream character inserters
-
-#include <string>
-#include <ostream>
-#include <sstream>
-#include <fstream>
-#include <testsuite_hooks.h>
-
-// ofstream
-bool test01()
-{
- bool test = true;
- std::string str01;
- const int size = 1000;
- const char name_02[] = "ostream_inserter_char-1.txt";
-
- // initialize string
- for(int i=0 ; i < size; i++) {
- str01 += '1';
- str01 += '2';
- str01 += '3';
- str01 += '4';
- str01 += '5';
- str01 += '6';
- str01 += '7';
- str01 += '8';
- str01 += '9';
- str01 += '\n';
- }
- std::ofstream f(name_02);
-
- f << str01;
- f.close();
-
- VERIFY( test );
- return test;
-}
-
-// ostringstream width() != zero
-// left
-bool test02(void)
-{
- bool test = true;
- std::string tmp;
-
- std::string str01 = "";
- std::ostringstream oss01;
- oss01.width(5);
- oss01.fill('0');
- oss01.flags(std::ios_base::left);
- oss01 << str01;
- tmp = oss01.str();
- VERIFY( tmp == "00000" );
-
- std::string str02 = "1";
- std::ostringstream oss02;
- oss02.width(5);
- oss02.fill('0');
- oss02.flags(std::ios_base::left);
- oss02 << str02;
- tmp = oss02.str();
- VERIFY( tmp == "10000" );
-
- std::string str03 = "909909";
- std::ostringstream oss03;
- oss03.width(5);
- oss03.fill('0');
- oss03.flags(std::ios_base::left);
- oss03 << str03;
- tmp = oss03.str();
- VERIFY( tmp == "909909" );
- return test;
-}
-
-// width() != zero
-// right
-bool test03(void)
-{
- bool test = true;
- std::string tmp;
-
- std::string str01 = "";
- std::ostringstream oss01;
- oss01.width(5);
- oss01.fill('0');
- oss01.flags(std::ios_base::right);
- oss01 << str01;
- tmp = oss01.str();
- VERIFY( tmp == "00000" );
-
- std::string str02 = "1";
- std::ostringstream oss02;
- oss02.width(5);
- oss02.fill('0');
- oss02.flags(std::ios_base::right);
- oss02 << str02;
- tmp = oss02.str();
- VERIFY( tmp == "00001" );
-
- std::string str03 = "909909";
- std::ostringstream oss03;
- oss03.width(5);
- oss03.fill('0');
- oss03.flags(std::ios_base::right);
- oss03 << str03;
- tmp = oss03.str();
- VERIFY( tmp == "909909" );
- return test;
-}
-
-// stringstream and large strings
-bool test04()
-{
- bool test = true;
- std::string str_01;
- const std::string str_02("coltrane playing 'softly as a morning sunrise'");
- const std::string str_03("coltrane");
- std::string str_tmp;
- const int i_max=250;
-
- std::ostringstream oss_01(std::ios_base::out);
- std::ostringstream oss_02(str_01, std::ios_base::out);
-
- std::ios_base::iostate state1, state2, statefail;
- statefail = std::ios_base::failbit;
-
- // template<_CharT, _Traits>
- // basic_ostream& operator<<(ostream&, const char*)
- for (int i = 0; i < i_max; ++i)
- oss_02 << "Test: " << i << std::endl;
- str_tmp = oss_02.str();
- VERIFY( !oss_02.bad() );
- VERIFY( oss_02.good() );
- VERIFY( str_tmp != str_01 );
- VERIFY( str_tmp.size() == 2390 );
- return test;
-}
-
-// ostringstream and large strings number 2
-bool test05()
-{
- bool test = true;
- std::string str05, str10;
-
- typedef std::ostream::pos_type pos_type;
- typedef std::ostream::off_type off_type;
- std::string str01;
- const int size = 1000;
-
- // initialize string
- for(int i=0 ; i < size; i++) {
- str01 += '1';
- str01 += '2';
- str01 += '3';
- str01 += '4';
- str01 += '5';
- str01 += '6';
- str01 += '7';
- str01 += '8';
- str01 += '9';
- str01 += '\n';
- }
-
- // test 1: out
- std::ostringstream sstr01(str01, std::ios_base::out);
- std::ostringstream sstr02;
- sstr02 << str01;
- str05 = sstr01.str();
- str10 = sstr02.str();
- VERIFY( str05 == str01 );
- VERIFY( str10 == str01 );
-
- // test 2: in | out
- std::ostringstream sstr04(str01, std::ios_base::out | std::ios_base::in);
- std::ostringstream sstr05(std::ios_base::in | std::ios_base::out);
- sstr05 << str01;
- str05 = sstr04.str();
- str10 = sstr05.str();
- VERIFY( str05 == str01 );
- VERIFY( str10 == str01 );
- return test;
-}
-
-
-// ostringstream and positioning, multiple writes
-// http://gcc.gnu.org/ml/libstdc++/2000-q1/msg00326.html
-void test06()
-{
- bool test = true;
- const char carray01[] = "mos def & talib kweli are black star";
-
- // normal
- std::ostringstream ostr1("mos def");
- VERIFY( ostr1.str() == "mos def" );
- ostr1 << " & talib kweli"; // should overwrite first part of buffer
- VERIFY( ostr1.str() == " & talib kweli" );
- ostr1 << " are black star"; // should append to string from above
- VERIFY( ostr1.str() != carray01 );
- VERIFY( ostr1.str() == " & talib kweli are black star" );
-
- // appending
- std::ostringstream ostr2("blackalicious",
- std::ios_base::out | std::ios_base::ate);
- VERIFY( ostr2.str() == "blackalicious" );
- ostr2 << " NIA "; // should not overwrite first part of buffer
- VERIFY( ostr2.str() == "blackalicious NIA " );
- ostr2 << "4: deception (5:19)"; // should append to full string from above
- VERIFY( ostr2.str() == "blackalicious NIA 4: deception (5:19)" );
-}
-
-// Global counter, needs to be reset after use.
-bool used;
-
-class gnu_ctype : public std::ctype<wchar_t>
-{
-protected:
- char_type
- do_widen(char c) const
- {
- used = true;
- return std::ctype<wchar_t>::do_widen(c);
- }
-
- const char*
- do_widen(const char* low, const char* high, char_type* dest) const
- {
- used = true;
- return std::ctype<wchar_t>::do_widen(low, high, dest);
- }
-};
-
-// 27.6.2.5.4 - Character inserter template functions
-// [lib.ostream.inserters.character]
-void test07()
-{
-#if _GLIBCPP_USE_WCHAR_T
- using namespace std;
- bool test = true;
-
- const char* buffer = "SFPL 5th floor, outside carrol, the Asian side";
-
- wostringstream oss;
- oss.imbue(locale(locale::classic(), new gnu_ctype));
-
- // 1
- // template<class charT, class traits>
- // basic_ostream<charT,traits>& operator<<(basic_ostream<charT,traits>& out,
- // const char* s);
- used = false;
- oss << buffer;
- VERIFY( used ); // Only required for char_type != char
- wstring str = oss.str();
- wchar_t c1 = oss.widen(buffer[0]);
- VERIFY( str[0] == c1 );
- wchar_t c2 = oss.widen(buffer[1]);
- VERIFY( str[1] == c2 );
-
- // 2
- // template<class charT, class traits>
- // basic_ostream<charT,traits>& operator<<(basic_ostream<charT,traits>& out,
- // char c);
- used = false;
- oss.str(wstring());
- oss << 'b';
- VERIFY( used ); // Only required for char_type != char
- str = oss.str();
- wchar_t c3 = oss.widen('b');
- VERIFY( str[0] == c3 );
-#endif
-}
-
-void test08()
-{
- bool test = true;
- char* pt = NULL;
-
- // 1
- std::ostringstream oss;
- oss << pt;
- VERIFY( oss.bad() );
- VERIFY( oss.str().size() == 0 );
-
- oss.clear();
- oss << "";
- VERIFY( oss.good() );
-
-#if _GLIBCPP_USE_WCHAR_T
- // 2
- std::wostringstream woss;
- woss << pt;
- VERIFY( woss.bad() );
- VERIFY( woss.str().size() == 0 );
-
- woss.clear();
- woss << "";
- VERIFY( woss.good() );
-
- // 3
- wchar_t* wt = NULL;
- woss.clear();
- woss << wt;
- VERIFY( woss.bad() );
- VERIFY( woss.str().size() == 0 );
-
- woss.clear();
- woss << L"";
- VERIFY( woss.good() );
-#endif
-}
-
-int main()
-{
- test01();
- test02();
- test03();
- test04();
- test05();
- test06();
- test07();
- test08();
- return 0;
-}