1// 2000-08-31 Benjamin Kosnik <bkoz@redhat.com>
2
3// Copyright (C) 2000, 2002, 2003, 2009 Free Software Foundation
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// 22.1.1.1.2 - class locale::facet [lib.locale.facet]
21
22#include <cwchar> // for mbstate_t
23#include <locale>
24#include <stdexcept>
25#include <string>
26#include <iterator>
27#include <limits>
28#include <testsuite_hooks.h>
29
30// 1 a class if a facet if it is publicly derived from another facet
31typedef std::istreambuf_iterator<char>		input_iterator;
32typedef std::ostreambuf_iterator<char>		output_iterator;
33
34class gnu_collate: public std::collate<char> { };
35class gnu_ctype: public std::ctype<char> { };
36class gnu_codecvt: public std::codecvt<char, char, std::mbstate_t> { };
37class gnu_moneypunct: public std::moneypunct<char> { };
38class gnu_moneypunct_true: public std::moneypunct<char, true> { };
39class gnu_money_get: public std::money_get<char> { };
40class gnu_money_put: public std::money_put<char> { };
41class gnu_numpunct: public std::numpunct<char> { };
42class gnu_num_get: public std::num_get<char> { };
43class gnu_num_put: public std::num_put<char> { };
44class gnu_time_get: public std::time_get<char> { };
45class gnu_time_put: public std::time_put<char> { };
46class gnu_messages: public std::messages<char> { };
47
48class gnu_collate_byname: public std::collate_byname<char>
49{
50public:
51  explicit
52  gnu_collate_byname(const char* c, size_t refs = 0)
53  : std::collate_byname<char>(c, refs) { }
54};
55
56class gnu_ctype_byname: public std::ctype_byname<char>
57{
58public:
59  explicit
60  gnu_ctype_byname(const char* c, size_t refs = 0)
61  : std::ctype_byname<char>(c, refs) { }
62};
63
64class gnu_moneypunct_byname_true: public std::moneypunct_byname<char, true>
65{
66public:
67  explicit
68  gnu_moneypunct_byname_true(const char* c, size_t refs = 0)
69  : std::moneypunct_byname<char, true>(c, refs) { }
70};
71
72class gnu_moneypunct_byname_false: public std::moneypunct_byname<char, false>
73{
74public:
75  explicit
76  gnu_moneypunct_byname_false(const char* c, size_t refs = 0)
77  : std::moneypunct_byname<char, false>(c, refs) { }
78};
79
80
81class gnu_money_get_in: public std::money_get<char, input_iterator>
82{
83public:
84  explicit
85  gnu_money_get_in(size_t refs = 0)
86  : std::money_get<char, input_iterator>(refs) { }
87};
88
89class gnu_money_put_out: public std::money_put<char, output_iterator>
90{
91public:
92  explicit
93  gnu_money_put_out(size_t refs = 0)
94  : std::money_put<char, output_iterator>(refs) { }
95};
96
97class gnu_numpunct_byname: public std::numpunct_byname<char>
98{
99public:
100  explicit
101  gnu_numpunct_byname(const char* c, size_t refs = 0)
102  : std::numpunct_byname<char>(c, refs) { }
103};
104
105class gnu_num_get_in: public std::num_get<char, input_iterator>
106{
107public:
108  explicit
109  gnu_num_get_in(size_t refs = 0)
110  : std::num_get<char, input_iterator>(refs) { }
111};
112
113class gnu_num_put_out: public std::num_put<char, output_iterator>
114{
115public:
116  explicit
117  gnu_num_put_out(size_t refs = 0)
118  : std::num_put<char, output_iterator>(refs) { }
119};
120
121class gnu_time_get_byname: public std::time_get_byname<char>
122{
123public:
124  explicit
125  gnu_time_get_byname(const char* c, size_t refs = 0)
126  : std::time_get_byname<char>(c, refs) { }
127};
128
129class gnu_time_get_in: public std::time_get<char, input_iterator>
130{
131public:
132  explicit
133  gnu_time_get_in(size_t refs = 0)
134  : std::time_get<char, input_iterator>(refs) { }
135};
136
137class gnu_time_put_byname: public std::time_put_byname<char>
138{
139public:
140  explicit
141  gnu_time_put_byname(const char* c, size_t refs = 0)
142  : std::time_put_byname<char>(c, refs) { }
143};
144
145class gnu_time_put_out: public std::time_put<char, output_iterator>
146{
147public:
148  explicit
149  gnu_time_put_out(size_t refs = 0)
150  : std::time_put<char, output_iterator>(refs) { }
151};
152
153class gnu_messages_byname: public std::messages_byname<char>
154{
155public:
156  explicit
157  gnu_messages_byname(const char* c, size_t refs = 0)
158  : std::messages_byname<char>(c, refs) { }
159};
160
161
162// 2 or if it is a class derived from locale:;facet and containing a
163// publicly-accessible declaration as follows:
164class gnu_facet: public std::locale::facet
165{
166public:
167  static std::locale::id id;
168};
169
170std::locale::id gnu_facet::id;
171
172void test01()
173{
174  bool test __attribute__((unused)) = true;
175  const std::string name_no("*");
176  const std::string name_c("C");
177
178  try
179    {
180      gnu_collate 			obj01;
181      gnu_ctype 			obj02;
182      gnu_codecvt 			obj03;
183      gnu_moneypunct			obj04;
184      gnu_moneypunct_true		obj05;
185      gnu_money_get			obj06;
186      gnu_money_put			obj07;
187      gnu_numpunct			obj08;
188      gnu_num_get			obj09;
189      gnu_num_put			obj10;
190      gnu_time_get			obj11;
191      gnu_time_put			obj12;
192      gnu_messages			obj13;
193      gnu_time_put_out			obj14(0);
194      gnu_time_put_byname		obj15("C", 0);
195      gnu_time_get_in			obj16(0);
196      gnu_time_get_byname		obj17("C", 0);
197      gnu_num_put_out			obj18(0);
198      gnu_num_get_in			obj19(0);
199      gnu_numpunct_byname		obj20("C", 0);
200      gnu_money_put_out			obj21(0);
201      gnu_money_get_in			obj22(0);
202      gnu_moneypunct_byname_false	obj23("C", 0);
203      gnu_moneypunct_byname_true	obj24("C", 0);
204      gnu_ctype_byname			obj25("C", 0);
205      gnu_collate_byname		obj26("C", 0);
206      gnu_messages_byname		obj27("C", 0);
207    }
208  catch (std::runtime_error& obj)
209    {
210      // named locale not valid
211      VERIFY( false );
212    }
213  catch (std::exception& obj)
214    {
215      // some other error
216      VERIFY( false );
217    }
218
219  // 2
220  try
221    {
222      gnu_facet 			obj28;
223    }
224  catch (std::runtime_error& obj)
225    {
226      // named locale not valid
227      VERIFY( false );
228    }
229  catch (std::exception& obj)
230    {
231      // some other error
232      VERIFY( false );
233    }
234}
235
236int main ()
237{
238  test01();
239  return 0;
240}
241