1// 2003-07-06 Benjamin Kosnik <bkoz@redhat.com> 2 3// Copyright (C) 2003-2015 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#include <locale> 21#include <sstream> 22#include <ostream> 23#include <testsuite_hooks.h> 24 25class numpunct_checked : public std::numpunct<char> 26{ 27 typedef std::numpunct<char> base; 28 29public: 30 explicit 31 numpunct_checked(std::size_t refs = 0): base(refs) { } 32 33 string_type 34 base_truename() const 35 { return base::do_truename(); } 36 37protected: 38 virtual string_type 39 do_truename() const 40 { return base::do_truename() + "st"; } 41}; 42 43// Changing caches deletes old cache, adds new one. 44void test01() 45{ 46 using namespace std; 47 48 bool test __attribute__((unused)) = true; 49 const string empty; 50 const string basestr("true"); 51 const string derivedstr("truest"); 52 53 const locale loc(locale::classic(), new numpunct_checked); 54 stringbuf sbuf; 55 ostream os(&sbuf); 56 os.setf(ios_base::boolalpha); 57 58 // Pre-cache sanity check. 59 const numpunct<char>& np = use_facet<numpunct<char> >(loc); 60 VERIFY( np.truename() == derivedstr ); 61 62 // Cache. 63 os.imbue(loc); 64 os << true; 65 VERIFY( sbuf.str() == derivedstr ); 66 67 // Re-cache. 68 sbuf.str(empty); 69 os.imbue(locale::classic()); 70 os << true; 71 VERIFY( sbuf.str() == basestr ); 72 73 // Cache new locale again. 74 sbuf.str(empty); 75 os.imbue(loc); 76 os << true; 77 VERIFY( sbuf.str() == derivedstr ); 78 79 // Post-cache sanity check, make sure that base class is still fine. 80 VERIFY( np.truename() == derivedstr ); 81 const numpunct_checked& npd = static_cast<const numpunct_checked&>(np); 82 VERIFY( npd.base_truename() == basestr ); 83} 84 85int main() 86{ 87 test01(); 88 return 0; 89} 90