1// { dg-require-namedlocale "" } 2 3// 2000-09-13 Benjamin Kosnik <bkoz@redhat.com> 4 5// Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2009 6// Free Software Foundation 7// 8// This file is part of the GNU ISO C++ Library. This library is free 9// software; you can redistribute it and/or modify it under the 10// terms of the GNU General Public License as published by the 11// Free Software Foundation; either version 3, or (at your option) 12// any later version. 13 14// This library is distributed in the hope that it will be useful, 15// but WITHOUT ANY WARRANTY; without even the implied warranty of 16// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17// GNU General Public License for more details. 18 19// You should have received a copy of the GNU General Public License along 20// with this library; see the file COPYING3. If not see 21// <http://www.gnu.org/licenses/>. 22 23// 22.1.1.2 locale constructors and destructors [lib.locale.cons] 24 25#include <cwchar> // for mbstate_t 26#include <locale> 27#include <stdexcept> 28#include <typeinfo> 29#include <testsuite_hooks.h> 30 31typedef std::codecvt<char, char, std::mbstate_t> c_codecvt; 32 33#ifdef _GLIBCXX_USE_WCHAR_T 34typedef std::codecvt<wchar_t, char, std::mbstate_t> w_codecvt; 35#endif 36 37class gnu_codecvt: public c_codecvt { }; 38 39class gnu_facet: public std::locale::facet 40{ 41public: 42 static std::locale::id id; 43}; 44 45std::locale::id gnu_facet::id; 46 47void test01() 48{ 49 using namespace std; 50 bool test __attribute__((unused)) = true; 51 52 // construct a locale object with the C facet 53 const locale loc01 = locale::classic(); 54 55 // 1 56 // template <class Facet> locale(const locale& other, Facet* f) 57 // construct a locale object with the specialized facet. 58 locale loc02(locale::classic(), new gnu_codecvt); 59 VERIFY( loc01 != loc02 ); 60 VERIFY( loc02.name() == "*" ); 61 try 62 { 63 VERIFY( has_facet<gnu_codecvt>(loc02) ); 64 VERIFY( has_facet<c_codecvt>(loc02) ); 65#ifdef _GLIBCXX_USE_WCHAR_T 66 VERIFY( has_facet<w_codecvt>(loc02) ); 67#endif 68 } 69 catch(...) 70 { VERIFY( false ); } 71 72 try 73 { use_facet<gnu_facet>(loc02); } 74 catch(bad_cast& obj) 75 { VERIFY( true ); } 76 catch(...) 77 { VERIFY( false ); } 78 79 // 2 80 // locale() throw() 81 locale loc03; 82 VERIFY( loc03 == loc01 ); 83 VERIFY( loc03.name() == "C" ); 84 locale loc04 = locale::global(loc02); 85 locale loc05; 86 VERIFY( loc05 != loc03 ); 87 VERIFY( loc05 == loc02 ); 88 89 // 3 90 // explicit locale(const char* std_name) 91 locale loc06 = locale("fr_FR"); 92 VERIFY( loc06 != loc01 ); 93 VERIFY( loc06 != loc02 ); 94 VERIFY( loc06.name() == "fr_FR"); 95 locale loc07(""); 96 VERIFY( loc07 != loc02 ); 97 VERIFY( loc07.name() != "" ); 98 try 99 { locale loc08(static_cast<const char*>(NULL)); } 100 catch(runtime_error& obj) 101 { VERIFY( true ); } 102 catch(...) 103 { VERIFY( false ); } 104 105 try 106 { locale loc08("saturn_SUN*RA"); } 107 catch(runtime_error& obj) 108 { VERIFY( true ); } 109 catch(...) 110 { VERIFY( false ); } 111 112 // 4 113 // locale(const locale& other, const char* std_name, category) 114 { 115 // This is the same as 5 only use "C" for loc("C") 116 locale loc09(loc06, "C", locale::ctype); 117 VERIFY( loc09.name() != "fr_FR" ); 118 VERIFY( loc09.name() != "C" ); 119 VERIFY( loc09.name() != "*" ); 120 VERIFY( loc09 != loc01 ); 121 VERIFY( loc09 != loc06 ); 122 123 locale loc10(loc02, "C", locale::ctype); 124 VERIFY( loc10.name() == "*" ); 125 VERIFY( loc10 != loc01 ); // As not named, even tho facets same... 126 VERIFY( loc10 != loc02 ); 127 128 locale loc11(loc01, "C", locale::ctype); 129 VERIFY( loc11.name() == "C" ); 130 VERIFY( loc11 == loc01 ); 131 132 try 133 { locale loc12(loc01, static_cast<const char*>(NULL), locale::ctype); } 134 catch(runtime_error& obj) 135 { VERIFY( true ); } 136 catch(...) 137 { VERIFY( false ); } 138 139 try 140 { locale loc13(loc01, "localized by the wu-tang clan", locale::ctype); } 141 catch(runtime_error& obj) 142 { VERIFY( true ); } 143 catch(...) 144 { VERIFY( false ); } 145 146 locale loc14(loc06, "C", locale::none); 147 VERIFY( loc14.name() == "fr_FR" ); 148 VERIFY( loc14 == loc06 ); 149 150 locale loc15(loc06, "C", locale::collate ); 151 VERIFY( loc15.name() != "fr_FR" ); 152 VERIFY( loc15.name() != "C" ); 153 VERIFY( loc15.name() != "*" ); 154 VERIFY( loc15.name() != loc09.name() ); 155 VERIFY( loc15 != loc01 ); 156 VERIFY( loc15 != loc06 ); 157 VERIFY( loc15 != loc09 ); 158 } 159 160 // 5 161 // locale(const locale& other, const locale& one, category) 162 { 163 // This is the exact same as 4, with locale("C") for "C" 164 locale loc09(loc06, loc01, locale::ctype); 165 VERIFY( loc09.name() != "fr_FR" ); 166 VERIFY( loc09.name() != "C" ); 167 VERIFY( loc09.name() != "*" ); 168 VERIFY( loc09 != loc01 ); 169 VERIFY( loc09 != loc06 ); 170 171 locale loc10(loc02, loc01, locale::ctype); 172 VERIFY( loc10.name() == "*" ); 173 VERIFY( loc10 != loc01 ); // As not named, even tho facets same... 174 VERIFY( loc10 != loc02 ); 175 176 locale loc11(loc01, loc01, locale::ctype); 177 VERIFY( loc11.name() == "C" ); 178 VERIFY( loc11 == loc01 ); 179 180 try 181 { locale loc12(loc01, static_cast<const char*>(NULL), locale::ctype); } 182 catch(runtime_error& obj) 183 { VERIFY( true ); } 184 catch(...) 185 { VERIFY( false ); } 186 187 try 188 { locale loc13(loc01, locale("wu-tang clan"), locale::ctype); } 189 catch(runtime_error& obj) 190 { VERIFY( true ); } 191 catch(...) 192 { VERIFY( false ); } 193 194 locale loc14(loc06, loc01, locale::none); 195 VERIFY( loc14.name() == "fr_FR" ); 196 VERIFY( loc14 == loc06 ); 197 198 locale loc15(loc06, loc01, locale::collate); 199 VERIFY( loc15.name() != "fr_FR" ); 200 VERIFY( loc15.name() != "C" ); 201 VERIFY( loc15.name() != "*" ); 202 VERIFY( loc15.name() != loc09.name() ); 203 VERIFY( loc15 != loc01 ); 204 VERIFY( loc15 != loc06 ); 205 VERIFY( loc15 != loc09 ); 206 } 207} 208 209int main() 210{ 211 test01(); 212 return 0; 213} 214