1 | /* Copyright (c) 2002,2003,2005 CrystalClear Software, Inc. |
2 | * Use, modification and distribution is subject to the |
3 | * Boost Software License, Version 1.0. (See accompanying |
4 | * file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt) |
5 | * Author: Jeff Garland, Bart Garst |
6 | */ |
7 | |
8 | #include <sstream> |
9 | #include <iostream> |
10 | #include <fstream> |
11 | |
12 | #include "boost/date_time/gregorian/greg_month.hpp" |
13 | #include "boost/date_time/gregorian/greg_facet.hpp" |
14 | #include "boost/date_time/date_format_simple.hpp" |
15 | #include "boost/date_time/gregorian/gregorian.hpp" |
16 | #include "../testfrmwk.hpp" |
17 | |
18 | #ifndef BOOST_DATE_TIME_NO_LOCALE |
19 | |
20 | const char* const de_short_month_names[]={"Jan" ,"Feb" ,"Mar" ,"Apr" ,"Mai" ,"Jun" ,"Jul" ,"Aug" ,"Sep" ,"Okt" ,"Nov" ,"Dez" , "NAM" }; |
21 | |
22 | const char* const de_long_month_names[]={"Januar" ,"Februar" ,"Marz" ,"April" ,"Mai" ,"Juni" ,"Juli" ,"August" ,"September" ,"Oktober" ,"November" ,"Dezember" ,"NichtDerMonat" }; |
23 | const char* const de_special_value_names[]={"NichtDatumzeit" ,"-unbegrenztheit" , "+unbegrenztheit" }; |
24 | |
25 | const char* const de_short_weekday_names[]={"Son" , "Mon" , "Die" ,"Mit" , "Don" , "Fre" , "Sam" }; |
26 | |
27 | const char* const de_long_weekday_names[]={"Sonntag" , "Montag" , "Dienstag" ,"Mittwoch" , "Donnerstag" , "Freitag" , "Samstag" }; |
28 | |
29 | #endif |
30 | |
31 | /** Not used for now |
32 | const char* const es_short_month_names[]={"Ene","Feb","Mar","Abr","Pue","Jun","Jul","Ago","Sep","Oct","Nov","Dic", "NAM"}; |
33 | |
34 | const char* const es_long_month_names[]={"Enero","Febrero","Marcha","Abril","Pueda","Junio","Julio","Agosto","Septiembre","Octubre","Noviembre","Diciembre","NoAMes"}; |
35 | const char* const es_special_value_names[]={"NoUnRatoDeLaFacha","-infinito", "+infinito"}; |
36 | **/ |
37 | int |
38 | main() |
39 | { |
40 | // std::locale native(""); |
41 | // std::cout << "native: " << native.name() << std::endl; |
42 | //#ifndef BOOST_NO_STD_LOCALE |
43 | #ifndef BOOST_DATE_TIME_NO_LOCALE |
44 | |
45 | using namespace boost::gregorian; |
46 | |
47 | typedef greg_facet_config facet_config; |
48 | typedef boost::date_time::all_date_names_put<facet_config> date_facet; |
49 | typedef boost::date_time::date_names_put<facet_config> date_facet_base; |
50 | typedef boost::date_time::ostream_month_formatter<date_facet_base> month_formatter; |
51 | |
52 | { |
53 | // special_values tests |
54 | std::stringstream ss; |
55 | date_facet_base* f = new date_facet_base(); |
56 | std::locale loc(std::locale::classic(), f); |
57 | ss.imbue(loc: loc); |
58 | date d(not_a_date_time); |
59 | ss << d; |
60 | check(testname: "Special value, stream out nadt" , testcond: ss.str() == std::string("not-a-date-time" )); |
61 | ss.str(s: "" ); |
62 | d = date(neg_infin); |
63 | ss << d; |
64 | check(testname: "Special value, stream out neg_infin" , testcond: ss.str() == std::string("-infinity" )); |
65 | ss.str(s: "" ); |
66 | d = date(pos_infin); |
67 | ss << d; |
68 | check(testname: "Special value, stream out pos_infin" , testcond: ss.str() == std::string("+infinity" )); |
69 | } |
70 | |
71 | date_facet gdnp(de_short_month_names, de_long_month_names, |
72 | de_special_value_names, de_long_weekday_names, |
73 | de_long_weekday_names, |
74 | '.', |
75 | boost::date_time::ymd_order_dmy); |
76 | |
77 | std::stringstream ss; |
78 | std::ostreambuf_iterator<char> coi(ss); |
79 | gdnp.put_month_short(oitr&: coi, moy: Oct); |
80 | check(testname: "check german short month: " + ss.str(), |
81 | testcond: ss.str() == std::string("Okt" )); |
82 | |
83 | ss.str(s: "" ); //reset string stream |
84 | greg_month mo(Oct); |
85 | month_formatter::format_month(month: mo, os&: ss, f: gdnp); |
86 | check(testname: "check german short month: " + ss.str(), |
87 | testcond: ss.str() == std::string("Okt" )); |
88 | ss.str(s: "" ); //reset string stream |
89 | // month_formatter::format_month(mo, ss, gdnp); |
90 | // check("check german long month: " + ss.str(), |
91 | // ss.str() == std::string("Oktober")); |
92 | |
93 | |
94 | greg_year_month_day ymd(2002,Oct,1); |
95 | typedef boost::date_time::ostream_ymd_formatter<greg_year_month_day, date_facet_base> ymd_formatter; |
96 | ss.str(s: "" ); //reset string stream |
97 | ymd_formatter::ymd_put(ymd, os&: ss, f: gdnp); |
98 | check(testname: "check ymd: " + ss.str(), |
99 | testcond: ss.str() == std::string("01.Okt.2002" )); |
100 | |
101 | |
102 | typedef boost::date_time::ostream_date_formatter<date, date_facet_base> datef; |
103 | |
104 | std::stringstream os; |
105 | date d1(2002, Oct, 1); |
106 | datef::date_put(d: d1, os, f: gdnp); |
107 | check(testname: "ostream low level check string:" +os.str(), |
108 | testcond: os.str() == std::string("01.Okt.2002" )); |
109 | |
110 | // //Locale tests |
111 | std::locale global; |
112 | std::cout << "global: " << global.name() << std::endl; |
113 | |
114 | // put a facet into a locale |
115 | //check for a facet p319 |
116 | check(testname: "no registered facet here" , |
117 | testcond: !std::has_facet<date_facet>(loc: global)); |
118 | |
119 | std::locale global2(global, |
120 | new date_facet(de_short_month_names, |
121 | de_long_month_names, |
122 | de_special_value_names, |
123 | de_long_weekday_names, |
124 | de_long_weekday_names)); |
125 | |
126 | check(testname: "facet registered here" , |
127 | testcond: std::has_facet<boost::date_time::date_names_put<facet_config> >(loc: global2)); |
128 | |
129 | std::stringstream os2; |
130 | os2.imbue(loc: global2); |
131 | datef::date_put(d: d1, os&: os2); |
132 | check(testname: "check string imbued ostream: " +os2.str(), |
133 | testcond: os2.str() == std::string("2002-Okt-01" )); |
134 | |
135 | date infin(pos_infin); |
136 | os2.str(s: "" ); //clear stream |
137 | datef::date_put(d: infin, os&: os2); |
138 | check(testname: "check string imbued ostream: " +os2.str(), |
139 | testcond: os2.str() == std::string("+unbegrenztheit" )); |
140 | |
141 | os2.str(s: "" ); //clear stream |
142 | os2 << infin; |
143 | check(testname: "check string imbued ostream: " +os2.str(), |
144 | testcond: os2.str() == std::string("+unbegrenztheit" )); |
145 | |
146 | |
147 | date nadt(not_a_date_time); |
148 | os2.str(s: "" ); //clear stream |
149 | datef::date_put(d: nadt, os&: os2); |
150 | check(testname: "check string imbued ostream: " +os2.str(), |
151 | testcond: os2.str() == std::string("NichtDatumzeit" )); |
152 | |
153 | |
154 | std::stringstream os3; |
155 | os3 << d1; |
156 | check(testname: "check any old ostream: " +os3.str(), |
157 | testcond: os3.str() == std::string("2002-Oct-01" )); |
158 | |
159 | std::ofstream f("test_facet_file.out" ); |
160 | f << d1 << std::endl; |
161 | |
162 | // // date formatter that takes locale and gets facet from locale |
163 | std::locale german_dates1(global, |
164 | new date_facet(de_short_month_names, |
165 | de_long_month_names, |
166 | de_special_value_names, |
167 | de_short_weekday_names, |
168 | de_long_weekday_names, |
169 | '.', |
170 | boost::date_time::ymd_order_dmy, |
171 | boost::date_time::month_as_integer)); |
172 | |
173 | os3.imbue(loc: german_dates1); |
174 | os3.str(s: "" ); |
175 | os3 << d1; |
176 | check(testname: "check date order: " +os3.str(), |
177 | testcond: os3.str() == std::string("01.10.2002" )); |
178 | |
179 | std::locale german_dates2(global, |
180 | new date_facet(de_short_month_names, |
181 | de_long_month_names, |
182 | de_special_value_names, |
183 | de_short_weekday_names, |
184 | de_long_weekday_names, |
185 | ' ', |
186 | boost::date_time::ymd_order_iso, |
187 | boost::date_time::month_as_short_string)); |
188 | |
189 | os3.imbue(loc: german_dates2); |
190 | os3.str(s: "" ); |
191 | os3 << d1; |
192 | check(testname: "check date order: " +os3.str(), |
193 | testcond: os3.str() == std::string("2002 Okt 01" )); |
194 | |
195 | std::locale german_dates3(global, |
196 | new date_facet(de_short_month_names, |
197 | de_long_month_names, |
198 | de_special_value_names, |
199 | de_short_weekday_names, |
200 | de_long_weekday_names, |
201 | ' ', |
202 | boost::date_time::ymd_order_us, |
203 | boost::date_time::month_as_long_string)); |
204 | |
205 | os3.imbue(loc: german_dates3); |
206 | os3.str(s: "" ); |
207 | os3 << d1; |
208 | check(testname: "check date order: " +os3.str(), |
209 | testcond: os3.str() == std::string("Oktober 01 2002" )); |
210 | |
211 | date_period dp(d1, date_duration(3)); |
212 | os3.str(s: "" ); |
213 | os3 << dp; |
214 | check(testname: "check date period: " +os3.str(), |
215 | testcond: os3.str() == std::string("[Oktober 01 2002/Oktober 03 2002]" )); |
216 | |
217 | |
218 | /*******************************************************************/ |
219 | /* Streaming operations for date durations */ |
220 | /*******************************************************************/ |
221 | |
222 | date_duration dur(26); |
223 | std::stringstream ss2; |
224 | ss2 << dur; |
225 | check(testname: "date_duration stream out" , testcond: ss2.str() == std::string("26" )); |
226 | |
227 | dur = date_duration(boost::date_time::pos_infin); |
228 | ss2.str(s: "" ); |
229 | ss2 << dur; |
230 | check(testname: "date_duration stream out" , testcond: ss2.str() == std::string("+infinity" )); |
231 | |
232 | /*******************************************************************/ |
233 | /* Streaming operations for date generator functions */ |
234 | /*******************************************************************/ |
235 | |
236 | partial_date pd(26, Jun); |
237 | //std::stringstream ss2; |
238 | ss2.str(s: "" ); |
239 | ss2 << pd; |
240 | check(testname: "partial date stream out" , testcond: ss2.str() == std::string("26 Jun" )); |
241 | |
242 | ss2.str(s: "" ); |
243 | nth_kday_of_month nkm(nth_kday_of_month::second, Friday, Sep); |
244 | ss2 << nkm; |
245 | check(testname: "nth kday of month" , testcond: ss2.str() == std::string("second Fri of Sep" )); |
246 | |
247 | ss2.str(s: "" ); |
248 | first_kday_of_month fkm(Saturday, May); |
249 | ss2 << fkm; |
250 | check(testname: "first kday of month" , testcond: ss2.str() == std::string("first Sat of May" )); |
251 | |
252 | ss2.str(s: "" ); |
253 | last_kday_of_month lkm(Monday, Aug); |
254 | ss2 << lkm; |
255 | check(testname: "last kday of month" , testcond: ss2.str() == std::string("last Mon of Aug" )); |
256 | |
257 | ss2.str(s: "" ); |
258 | first_kday_after fka(Thursday);//fkb.get_date(d) |
259 | ss2 << fka; |
260 | check(testname: "first kday after" , testcond: ss2.str() == std::string("Thu after" )); |
261 | |
262 | ss2.str(s: "" ); |
263 | first_kday_before fkb(Tuesday); // same ^ |
264 | ss2 << fkb; |
265 | check(testname: "first kday after" , testcond: ss2.str() == std::string("Tue before" )); |
266 | |
267 | std::cout << pd << '\n' |
268 | << nkm << '\n' |
269 | << fkm << '\n' |
270 | << lkm << '\n' |
271 | << fka << '\n' |
272 | << fkb << '\n' |
273 | << std::endl; |
274 | |
275 | /*******************************************************************/ |
276 | /* Input Streaming for greg_month */ |
277 | /*******************************************************************/ |
278 | { |
279 | std::stringstream ss1("January" ); |
280 | std::stringstream ss2m("dec" ); // misspelled |
281 | std::stringstream german("Okt" ); |
282 | german.imbue(loc: global2); |
283 | greg_month m(3); |
284 | ss1 >> m; |
285 | check(testname: "Stream in month" , testcond: m == greg_month(Jan)); |
286 | #ifndef BOOST_NO_STD_WSTRING |
287 | std::wstringstream ws1(L"Dec" ); |
288 | ws1 >> m; |
289 | check(testname: "Wide Stream in month" , testcond: m == greg_month(Dec)); |
290 | #else |
291 | check("Wide Stream in not supported by this compiler" , false); |
292 | #endif // BOOST_NO_STD_WSTRING |
293 | german >> m; |
294 | check(testname: "Stream in German month" , testcond: m == greg_month(Oct)); |
295 | try{ |
296 | ss2m >> m; // misspelled |
297 | check(testname: "Bad month exception NOT thrown (misspelled name)" , testcond: false); |
298 | }catch(bad_month&){ |
299 | check(testname: "Bad month exception caught (misspelled name)" , testcond: true); |
300 | }catch(...){ |
301 | check(testname: "Bad month exception NOT caught (misspelled name)" , testcond: false); |
302 | } |
303 | } |
304 | /*******************************************************************/ |
305 | /* Input Streaming for greg_weekday */ |
306 | /*******************************************************************/ |
307 | { |
308 | std::stringstream ss1("Sun" ); |
309 | std::stringstream ss2w("Wensday" ); // misspelled |
310 | std::stringstream german("Mittwoch" ); // Wednesday |
311 | german.imbue(loc: global2); |
312 | greg_weekday wd(Friday); //something not Sunday... |
313 | ss1 >> wd; |
314 | check(testname: "Stream in weekday" , testcond: wd == greg_weekday(Sunday)); |
315 | #ifndef BOOST_NO_STD_WSTRING |
316 | std::wstringstream ws1(L"Saturday" ); |
317 | ws1 >> wd; |
318 | check(testname: "Wide Stream in weekday" , testcond: wd == greg_weekday(Saturday)); |
319 | #else |
320 | check("Wide Stream in not supported by this compiler" , false); |
321 | #endif // BOOST_NO_STD_WSTRING |
322 | german >> wd; |
323 | check(testname: "Stream in German weekday" , testcond: wd == greg_weekday(Wednesday)); |
324 | try{ |
325 | ss2w >> wd; |
326 | check(testname: "Bad weekday exception NOT thrown (misspelled name)" , testcond: false); |
327 | }catch(bad_weekday&){ |
328 | check(testname: "Bad weekday exception caught (misspelled name)" , testcond: true); |
329 | }catch(...){ |
330 | check(testname: "Bad weekday exception NOT caught (misspelled name)" , testcond: false); |
331 | } |
332 | } |
333 | |
334 | #else |
335 | check("No tests executed - Locales not supported by this compiler" , false); |
336 | |
337 | #endif //BOOST_DATE_TIME_NO_LOCALE |
338 | |
339 | return printTestStats(); |
340 | |
341 | } |
342 | |
343 | |