• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //
2 //  Copyright (c) 2009-2011 Artyom Beilis (Tonkikh)
3 //
4 //  Distributed under the Boost Software License, Version 1.0. (See
5 //  accompanying file LICENSE_1_0.txt or copy at
6 //  http://www.boost.org/LICENSE_1_0.txt)
7 //
8 #ifndef BOOST_LOCALE_WITH_ICU
9 #include <iostream>
main()10 int main()
11 {
12         std::cout << "ICU is not build... Skipping" << std::endl;
13 }
14 #else
15 
16 #ifdef _MSC_VER
17 #define _CRT_SECURE_NO_WARNINGS
18 // Disable this "security crap"
19 #endif
20 
21 #include <boost/locale/formatting.hpp>
22 #include <boost/locale/format.hpp>
23 #include <boost/locale/date_time.hpp>
24 #include <boost/locale/generator.hpp>
25 #include "test_locale.hpp"
26 #include "test_locale_tools.hpp"
27 #include <sstream>
28 #include <iostream>
29 #include <iomanip>
30 #include <limits>
31 
32 #include <unicode/uversion.h>
33 
34 using namespace boost::locale;
35 
36 //#define TEST_DEBUG
37 #ifdef BOOST_MSVC
38 #define _CRT_SECURE_NO_WARNINGS
39 #endif
40 
41 #ifdef TEST_DEBUG
42 #undef BOOST_LOCALE_ENABLE_CHAR16_T
43 #undef BOOST_LOCALE_ENABLE_CHAR32_T
44 template<typename T>
print_diff(T const &,T const &,int)45 void print_diff(T const &,T const &,int)
46 {
47 }
48 template<>
print_diff(std::string const & l,std::string const & r,int line)49 void print_diff(std::string const &l,std::string const &r,int line)
50 {
51     if(l!=r) {
52         std::cerr << "----[" << l <<"]!=\n----["<<r<<"] in " << line << std::endl;
53     }
54 }
55 
56 #define TESTEQ(x,y) do { print_diff((x),(y),__LINE__); TEST((x)==(y)); } while(0)
57 #else
58 #define TESTEQ(x,y) TEST((x)==(y))
59 #endif
60 
61 #define TEST_FMT(manip,value,expected) \
62 do{ \
63     std::basic_ostringstream<CharType> ss; \
64     ss.imbue(loc); \
65     ss << manip << value; \
66     TESTEQ(ss.str(),to_correct_string<CharType>(expected,loc)); \
67 }while(0)
68 
69 #ifndef _LIBCPP_VERSION
parsing_fails()70 static bool parsing_fails()
71 {
72     return true;
73 }
74 #else
parsing_fails()75 static bool parsing_fails()
76 {
77     static bool checked=false;
78     static bool fails;
79     if(!checked) {
80         try {
81             std::istringstream ss("x");
82             ss.exceptions(std::ios_base::failbit);
83             int x;
84             ss>>x;
85             fails =false;
86         }
87         catch(std::ios_base::failure const &) {
88             fails=true;
89         }
90         catch(...) {
91             fails=false;
92         }
93         checked=true;
94         if(!fails) {
95             std::cerr << "!!! Warning: libc++ library does not throw an exception on failbit !!!" << std::endl;
96         }
97     }
98     return fails;
99 }
100 #endif
101 
102 
103 #define TEST_NOPAR(manip,actual,type)                           \
104 do{                                                             \
105     type v;                                                     \
106     std::basic_string<CharType> act=                            \
107         to_correct_string<CharType>(actual,loc);                \
108     {                                                           \
109         std::basic_istringstream<CharType> ss;                  \
110         ss.imbue(loc);                                          \
111         ss.str(act);                                            \
112         ss >> manip >> v ;                                      \
113         TEST(ss.fail());                                        \
114     }                                                           \
115     if(parsing_fails()){                                        \
116         std::basic_istringstream<CharType> ss;                  \
117         ss.imbue(loc);                                          \
118         ss.str(act);                                            \
119         ss.exceptions(std::ios_base::failbit);                  \
120         ss >> manip;                                            \
121         TEST_THROWS(ss >> v,std::ios_base::failure);            \
122     }                                                           \
123 }while(0)
124 
125 #define TEST_PAR(manip,type,actual,expected) \
126 do{ \
127     type v; \
128     {std::basic_istringstream<CharType> ss; \
129     ss.imbue(loc); \
130     ss.str(to_correct_string<CharType>(actual,loc)); \
131     ss >> manip >> v >> std::ws; \
132     TESTEQ(v,expected); \
133     TEST(ss.eof()); }\
134     {std::basic_istringstream<CharType> ss; \
135     ss.imbue(loc); \
136     ss.str(to_correct_string<CharType>(std::string(actual)+"@",loc)); \
137     CharType tmp_c; \
138     ss >> manip >> v >> std::skipws >> tmp_c; \
139     TESTEQ(v,expected); \
140     TEST(tmp_c=='@'); } \
141 }while(0)
142 
143 #define TEST_FP1(manip,value_in,str,type,value_out) \
144 do { \
145     TEST_FMT(manip,value_in,str); \
146     TEST_PAR(manip,type,str,value_out); \
147 }while(0)
148 
149 #define TEST_FP2(m1,m2,value_in,str,type,value_out) \
150 do { \
151     TEST_FMT(m1<<m2,value_in,str); \
152     TEST_PAR(m1>>m2,type,str,value_out);  \
153 }while(0)
154 
155 #define TEST_FP3(m1,m2,m3,value_in,str,type,value_out) \
156 do { \
157     TEST_FMT(m1<<m2<<m3,value_in,str); \
158     TEST_PAR(m1>>m2>>m3,type,str,value_out); \
159 }while(0)
160 
161 #define TEST_FP4(m1,m2,m3,m4,value_in,str,type,value_out) \
162 do { \
163     TEST_FMT(m1<<m2<<m3<<m4,value_in,str); \
164     TEST_PAR(m1>>m2>>m3>>m4,type,str,value_out); \
165 }while(0)
166 
167 
168 #define FORMAT(f,v,exp) \
169     do{\
170         std::basic_ostringstream<CharType> ss; \
171         ss.imbue(loc);  \
172         std::basic_string<CharType> fmt = to_correct_string<CharType>(f,loc); \
173         ss << boost::locale::basic_format<CharType>(fmt) % v; \
174         TESTEQ(ss.str(),to_correct_string<CharType>(exp,loc)); \
175         ss.str(to_correct_string<CharType>("",loc)); \
176         ss << boost::locale::basic_format<CharType>(boost::locale::translate(fmt.c_str())) % v; \
177         /*ss << boost::locale::basic_format<CharType>(fmt) % v; */ \
178         TESTEQ(ss.str(),to_correct_string<CharType>(exp,loc)); \
179         TESTEQ( (boost::locale::basic_format<CharType>(fmt) % v).str(loc),to_correct_string<CharType>(exp,loc)); \
180     } while(0)
181 
182 
183 #define TEST_MIN_MAX_FMT(type,minval,maxval)    \
184     do { \
185         TEST_FMT(as::number,std::numeric_limits<type>::min(),minval); \
186         TEST_FMT(as::number,std::numeric_limits<type>::max(),maxval); \
187     }while(0)
188 
189 #define TEST_MIN_MAX_PAR(type,minval,maxval)    \
190     do {\
191         TEST_PAR(as::number,type,minval,std::numeric_limits<type>::min()); \
192         TEST_PAR(as::number,type,maxval,std::numeric_limits<type>::max()); \
193     }while(0)
194 
195 #define TEST_MIN_MAX(type,minval,maxval)    \
196     do { \
197         TEST_MIN_MAX_FMT(type,minval,maxval); \
198         TEST_MIN_MAX_PAR(type,minval,maxval); \
199     }while(0)
200 
201 
202 #define BOOST_ICU_VER (U_ICU_VERSION_MAJOR_NUM*100 + U_ICU_VERSION_MINOR_NUM)
203 #define BOOST_ICU_EXACT_VER (U_ICU_VERSION_MAJOR_NUM*10000 + U_ICU_VERSION_MINOR_NUM  * 100 + U_ICU_VERSION_PATCHLEVEL_NUM)
204 
short_parsing_fails()205 bool short_parsing_fails()
206 {
207     static bool fails = false;
208     static bool get_result = false;
209     if(get_result)
210         return fails;
211     std::stringstream ss("65000");
212     ss.imbue(std::locale::classic());
213     short v=0;
214     ss >> v;
215     fails = ss.fail();
216     get_result = true;
217     return fails;
218 }
219 
220 template<typename CharType>
test_manip(std::string e_charset="UTF-8")221 void test_manip(std::string e_charset="UTF-8")
222 {
223     boost::locale::generator g;
224     std::locale loc=g("en_US."+e_charset);
225 
226     TEST_FP1(as::posix,1200.1,"1200.1",double,1200.1);
227     TEST_FP1(as::number,1200.1,"1,200.1",double,1200.1);
228     TEST_FMT(as::number<<std::setfill(CharType('_'))<<std::setw(6),1534,"_1,534");
229     TEST_FMT(as::number<<std::left<<std::setfill(CharType('_'))<<std::setw(6),1534,"1,534_");
230 
231     // Ranges
232     if(sizeof(short) == 2) {
233         TEST_MIN_MAX(short,"-32,768","32,767");
234         TEST_MIN_MAX(unsigned short,"0","65,535");
235         TEST_NOPAR(as::number,"-1",unsigned short);
236         if(short_parsing_fails()) {
237             TEST_NOPAR(as::number,"65,535",short);
238         }
239     }
240     if(sizeof(int)==4) {
241         TEST_MIN_MAX(int,"-2,147,483,648","2,147,483,647");
242         TEST_MIN_MAX(unsigned int,"0","4,294,967,295");
243         TEST_NOPAR(as::number,"-1",unsigned int);
244         TEST_NOPAR(as::number,"4,294,967,295",int);
245     }
246     if(sizeof(long)==4) {
247         TEST_MIN_MAX(long,"-2,147,483,648","2,147,483,647");
248         TEST_MIN_MAX(unsigned long,"0","4,294,967,295");
249         TEST_NOPAR(as::number,"-1",unsigned long);
250         TEST_NOPAR(as::number,"4,294,967,295",long);
251     }
252     if(sizeof(long)==8) {
253         TEST_MIN_MAX(long,"-9,223,372,036,854,775,808","9,223,372,036,854,775,807");
254         TEST_MIN_MAX_FMT(unsigned long,"0","18446744073709551615"); // Unsupported range by icu - ensure fallback
255         TEST_NOPAR(as::number,"-1",unsigned long);
256     }
257     #ifndef BOOST_NO_LONG_LONG
258     if(sizeof(long long)==8) {
259         TEST_MIN_MAX(long long,"-9,223,372,036,854,775,808","9,223,372,036,854,775,807");
260         // we can't really parse this as ICU does not support this range, only format
261         TEST_MIN_MAX_FMT(unsigned long long,"0","18446744073709551615"); // Unsupported range by icu - ensure fallback
262         TEST_FMT(as::number,9223372036854775807ULL,"9,223,372,036,854,775,807");
263         TEST_FMT(as::number,9223372036854775808ULL,"9223372036854775808"); // Unsupported range by icu - ensure fallback
264         TEST_NOPAR(as::number,"-1",unsigned long long);
265     }
266     #endif
267 
268 
269 
270     TEST_FP3(as::number,std::left,std::setw(3),15,"15 ",int,15);
271     TEST_FP3(as::number,std::right,std::setw(3),15," 15",int,15);
272     TEST_FP3(as::number,std::setprecision(3),std::fixed,13.1,"13.100",double,13.1);
273     #if BOOST_ICU_VER < 5601
274     // bug #13276
275     TEST_FP3(as::number,std::setprecision(3),std::scientific,13.1,"1.310E1",double,13.1);
276     #endif
277 
278     TEST_NOPAR(as::number,"",int);
279     TEST_NOPAR(as::number,"--3",int);
280     TEST_NOPAR(as::number,"y",int);
281 
282     TEST_FP1(as::percent,0.1,"10%",double,0.1);
283     TEST_FP3(as::percent,std::fixed,std::setprecision(1),0.10,"10.0%",double,0.1);
284 
285     TEST_NOPAR(as::percent,"1",double);
286 
287     TEST_FP1(as::currency,1345,"$1,345.00",int,1345);
288     TEST_FP1(as::currency,1345.34,"$1,345.34",double,1345.34);
289 
290     TEST_NOPAR(as::currency,"$",double);
291 
292 
293     #if BOOST_ICU_VER >= 402
294     TEST_FP2(as::currency,as::currency_national,1345,"$1,345.00",int,1345);
295     TEST_FP2(as::currency,as::currency_national,1345.34,"$1,345.34",double,1345.34);
296     TEST_FP2(as::currency,as::currency_iso,1345,"USD1,345.00",int,1345);
297     TEST_FP2(as::currency,as::currency_iso,1345.34,"USD1,345.34",double,1345.34);
298     #endif
299     TEST_FP1(as::spellout,10,"ten",int,10);
300     #if 402 <= BOOST_ICU_VER && BOOST_ICU_VER < 408
301     if(e_charset=="UTF-8") {
302         TEST_FMT(as::ordinal,1,"1\xcb\xa2\xe1\xb5\x97"); // 1st with st as ligatures
303     }
304     #else
305         TEST_FMT(as::ordinal,1,"1st");
306     #endif
307 
308     time_t a_date = 3600*24*(31+4); // Feb 5th
309     time_t a_time = 3600*15+60*33; // 15:33:05
310     time_t a_timesec = 13;
311     time_t a_datetime = a_date + a_time + a_timesec;
312 
313     TEST_FP2(as::date,                as::gmt,a_datetime,"Feb 5, 1970",time_t,a_date);
314     TEST_FP3(as::date,as::date_short ,as::gmt,a_datetime,"2/5/70",time_t,a_date);
315     TEST_FP3(as::date,as::date_medium,as::gmt,a_datetime,"Feb 5, 1970",time_t,a_date);
316     TEST_FP3(as::date,as::date_long  ,as::gmt,a_datetime,"February 5, 1970",time_t,a_date);
317     TEST_FP3(as::date,as::date_full  ,as::gmt,a_datetime,"Thursday, February 5, 1970",time_t,a_date);
318 
319     TEST_NOPAR(as::date>>as::date_short,"aa/bb/cc",double);
320 
321 #if BOOST_ICU_VER >= 5901
322 #define GMT_FULL "Greenwich Mean Time"
323 #else
324 #define GMT_FULL "GMT"
325 #endif
326 
327     TEST_FP2(as::time,                as::gmt,a_datetime,"3:33:13 PM",time_t,a_time+a_timesec);
328     TEST_FP3(as::time,as::time_short ,as::gmt,a_datetime,"3:33 PM",time_t,a_time);
329     TEST_FP3(as::time,as::time_medium,as::gmt,a_datetime,"3:33:13 PM",time_t,a_time+a_timesec);
330     #if BOOST_ICU_VER >= 408
331     TEST_FP3(as::time,as::time_long  ,as::gmt,a_datetime,"3:33:13 PM GMT",time_t,a_time+a_timesec);
332         #if BOOST_ICU_EXACT_VER != 40800
333             // know bug #8675
334             TEST_FP3(as::time,as::time_full  ,as::gmt,a_datetime,"3:33:13 PM " GMT_FULL,time_t,a_time+a_timesec);
335         #endif
336     #else
337     TEST_FP3(as::time,as::time_long  ,as::gmt,a_datetime,"3:33:13 PM GMT+00:00",time_t,a_time+a_timesec);
338     TEST_FP3(as::time,as::time_full  ,as::gmt,a_datetime,"3:33:13 PM GMT+00:00",time_t,a_time+a_timesec);
339     #endif
340 
341     TEST_NOPAR(as::time,"AM",double);
342 
343     TEST_FP2(as::time,                as::time_zone("GMT+01:00"),a_datetime,"4:33:13 PM",time_t,a_time+a_timesec);
344     TEST_FP3(as::time,as::time_short ,as::time_zone("GMT+01:00"),a_datetime,"4:33 PM",time_t,a_time);
345     TEST_FP3(as::time,as::time_medium,as::time_zone("GMT+01:00"),a_datetime,"4:33:13 PM",time_t,a_time+a_timesec);
346 
347 #if U_ICU_VERSION_MAJOR_NUM >= 52
348 #define GMT_P100 "GMT+1"
349 #else
350 #define GMT_P100 "GMT+01:00"
351 #endif
352 
353 
354 #if U_ICU_VERSION_MAJOR_NUM >= 50
355 #define PERIOD ","
356 #define ICUAT " at"
357 #else
358 #define PERIOD ""
359 #define ICUAT ""
360 #endif
361 
362     TEST_FP3(as::time,as::time_long  ,as::time_zone("GMT+01:00"),a_datetime,"4:33:13 PM "  GMT_P100,time_t,a_time+a_timesec);
363     #if BOOST_ICU_VER == 308 && defined(__CYGWIN__)
364     // Known faliture ICU issue
365     #else
366     TEST_FP3(as::time,as::time_full  ,as::time_zone("GMT+01:00"),a_datetime,"4:33:13 PM GMT+01:00",time_t,a_time+a_timesec);
367     #endif
368 
369     TEST_FP2(as::datetime,                                as::gmt,a_datetime,"Feb 5, 1970" PERIOD  " 3:33:13 PM",time_t,a_datetime);
370     TEST_FP4(as::datetime,as::date_short ,as::time_short ,as::gmt,a_datetime,"2/5/70" PERIOD " 3:33 PM",time_t,a_date+a_time);
371     TEST_FP4(as::datetime,as::date_medium,as::time_medium,as::gmt,a_datetime,"Feb 5, 1970" PERIOD " 3:33:13 PM",time_t,a_datetime);
372     #if BOOST_ICU_VER >= 408
373     TEST_FP4(as::datetime,as::date_long  ,as::time_long  ,as::gmt,a_datetime,"February 5, 1970" ICUAT " 3:33:13 PM GMT",time_t,a_datetime);
374         #if BOOST_ICU_EXACT_VER != 40800
375             // know bug #8675
376             TEST_FP4(as::datetime,as::date_full  ,as::time_full  ,as::gmt,a_datetime,"Thursday, February 5, 1970" ICUAT " 3:33:13 PM " GMT_FULL,time_t,a_datetime);
377         #endif
378     #else
379     TEST_FP4(as::datetime,as::date_long  ,as::time_long  ,as::gmt,a_datetime,"February 5, 1970" PERIOD " 3:33:13 PM GMT+00:00",time_t,a_datetime);
380     TEST_FP4(as::datetime,as::date_full  ,as::time_full  ,as::gmt,a_datetime,"Thursday, February 5, 1970" PERIOD " 3:33:13 PM GMT+00:00",time_t,a_datetime);
381     #endif
382 
383     time_t now=time(0);
384     time_t lnow = now + 3600 * 4;
385     char local_time_str[256];
386     std::string format="%H:%M:%S";
387     std::basic_string<CharType> format_string(format.begin(),format.end());
388     strftime(local_time_str,sizeof(local_time_str),format.c_str(),gmtime(&lnow));
389     TEST_FMT(as::ftime(format_string),now,local_time_str);
390     TEST_FMT(as::ftime(format_string)<<as::gmt<<as::local_time,now,local_time_str);
391 
392     std::string marks =
393         "aAbB"
394         "cdeh"
395         "HIjm"
396         "Mnpr"
397         "RStT"
398         "xXyY"
399         "Z%";
400 
401     std::string result[]= {
402         "Thu","Thursday","Feb","February",  // aAbB
403         #if BOOST_ICU_VER >= 408
404         "Thursday, February 5, 1970" ICUAT  " 3:33:13 PM " GMT_FULL, // c
405         #else
406         "Thursday, February 5, 1970 3:33:13 PM GMT+00:00", // c
407         #endif
408         "05","5","Feb", // deh
409         "15","03","36","02", // HIjm
410         "33","\n","PM", "03:33:13 PM",// Mnpr
411         "15:33","13","\t","15:33:13", // RStT
412         "Feb 5, 1970","3:33:13 PM","70","1970", // xXyY
413         #if BOOST_ICU_VER >= 408
414         GMT_FULL // Z
415         #else
416         "GMT+00:00" // Z
417         #endif
418         ,"%" }; // %
419 
420     for(unsigned i=0;i<marks.size();i++) {
421         format_string.clear();
422         format_string+=static_cast<CharType>('%');
423         format_string+=static_cast<CharType>(marks[i]);
424         TEST_FMT(as::ftime(format_string)<<as::gmt,a_datetime,result[i]);
425     }
426 
427     std::string sample_f[]={
428         "Now is %A, %H o'clo''ck ' or not ' ",
429         "'test %H'",
430         "%H'",
431         "'%H'"
432     };
433     std::string expected_f[] = {
434         "Now is Thursday, 15 o'clo''ck ' or not ' ",
435         "'test 15'",
436         "15'",
437         "'15'"
438     };
439 
440     for(unsigned i=0;i<sizeof(sample_f)/sizeof(sample_f[0]);i++) {
441         format_string.assign(sample_f[i].begin(),sample_f[i].end());
442         TEST_FMT(as::ftime(format_string)<<as::gmt,a_datetime,expected_f[i]);
443     }
444 
445 }
446 
447 template<typename CharType>
test_format(std::string charset="UTF-8")448 void test_format(std::string charset="UTF-8")
449 {
450     boost::locale::generator g;
451     std::locale loc=g("en_US."+charset);
452 
453     FORMAT("{3} {1} {2}", 1 % 2 % 3,"3 1 2");
454     FORMAT("{1} {2}", "hello" % 2,"hello 2");
455     FORMAT("{1}",1200.1,"1200.1");
456     FORMAT("Test {1,num}",1200.1,"Test 1,200.1");
457     FORMAT("{{}} {1,number}",1200.1,"{} 1,200.1");
458     #if BOOST_ICU_VER < 5601
459     // bug #13276
460     FORMAT("{1,num=sci,p=3}",13.1,"1.310E1");
461     FORMAT("{1,num=scientific,p=3}",13.1,"1.310E1");
462     #endif
463     FORMAT("{1,num=fix,p=3}",13.1,"13.100");
464     FORMAT("{1,num=fixed,p=3}",13.1,"13.100");
465     FORMAT("{1,<,w=3,num}",-1,"-1 ");
466     FORMAT("{1,>,w=3,num}",1,"  1");
467     FORMAT("{per,1}",0.1,"10%");
468     FORMAT("{percent,1}",0.1,"10%");
469     FORMAT("{1,cur}",1234,"$1,234.00");
470     FORMAT("{1,currency}",1234,"$1,234.00");
471     if(charset=="UTF-8") {
472         if(U_ICU_VERSION_MAJOR_NUM >=4)
473             FORMAT("{1,cur,locale=de_DE}",10,"10,00\xC2\xA0€");
474         else
475             FORMAT("{1,cur,locale=de_DE}",10,"10,00 €");
476     }
477     #if BOOST_ICU_VER >= 402
478     FORMAT("{1,cur=nat}",1234,"$1,234.00");
479     FORMAT("{1,cur=national}",1234,"$1,234.00");
480     FORMAT("{1,cur=iso}",1234,"USD1,234.00");
481     #endif
482     FORMAT("{1,spell}",10,"ten");
483     FORMAT("{1,spellout}",10,"ten");
484     #if 402 <= BOOST_ICU_VER && BOOST_ICU_VER < 408
485     if(charset=="UTF-8") {
486         FORMAT("{1,ord}",1,"1\xcb\xa2\xe1\xb5\x97");
487         FORMAT("{1,ordinal}",1,"1\xcb\xa2\xe1\xb5\x97");
488     }
489     #else
490     FORMAT("{1,ord}",1,"1st");
491     FORMAT("{1,ordinal}",1,"1st");
492     #endif
493 
494     time_t now=time(0);
495     time_t lnow = now + 3600 * 4;
496     char local_time_str[256];
497     std::string format="'%H:%M:%S'";
498     std::basic_string<CharType> format_string(format.begin(),format.end());
499     strftime(local_time_str,sizeof(local_time_str),format.c_str(),gmtime(&lnow));
500 
501     FORMAT("{1,ftime='''%H:%M:%S'''}",now,local_time_str);
502     FORMAT("{1,local,ftime='''%H:%M:%S'''}",now,local_time_str);
503     FORMAT("{1,ftime='''%H:%M:%S'''}",now,local_time_str);
504 
505     time_t a_date = 3600*24*(31+4); // Feb 5th
506     time_t a_time = 3600*15+60*33; // 15:33:05
507     time_t a_timesec = 13;
508     time_t a_datetime = a_date + a_time + a_timesec;
509     FORMAT("{1,date,gmt};{1,time,gmt};{1,datetime,gmt};{1,dt,gmt}",a_datetime,
510             "Feb 5, 1970;3:33:13 PM;Feb 5, 1970" PERIOD " 3:33:13 PM;Feb 5, 1970" PERIOD " 3:33:13 PM");
511     #if BOOST_ICU_VER >= 408
512     FORMAT("{1,time=short,gmt};{1,time=medium,gmt};{1,time=long,gmt};{1,date=full,gmt}",a_datetime,
513             "3:33 PM;3:33:13 PM;3:33:13 PM GMT;Thursday, February 5, 1970");
514     FORMAT("{1,time=s,gmt};{1,time=m,gmt};{1,time=l,gmt};{1,date=f,gmt}",a_datetime,
515             "3:33 PM;3:33:13 PM;3:33:13 PM GMT;Thursday, February 5, 1970");
516     #else
517     FORMAT("{1,time=short,gmt};{1,time=medium,gmt};{1,time=long,gmt};{1,date=full,gmt}",a_datetime,
518             "3:33 PM;3:33:13 PM;3:33:13 PM GMT+00:00;Thursday, February 5, 1970");
519     FORMAT("{1,time=s,gmt};{1,time=m,gmt};{1,time=l,gmt};{1,date=f,gmt}",a_datetime,
520             "3:33 PM;3:33:13 PM;3:33:13 PM GMT+00:00;Thursday, February 5, 1970");
521     #endif
522     FORMAT("{1,time=s,tz=GMT+01:00}",a_datetime,"4:33 PM");
523     FORMAT("{1,time=s,timezone=GMT+01:00}",a_datetime,"4:33 PM");
524 
525     FORMAT("{1,gmt,ftime='%H'''}",a_datetime,"15'");
526     FORMAT("{1,gmt,ftime='''%H'}",a_datetime,"'15");
527     FORMAT("{1,gmt,ftime='%H o''clock'}",a_datetime,"15 o'clock");
528 
529     // Test not a year of the week
530     a_datetime=1388491200; // 2013-12-31 12:00 - check we don't use week of year
531 
532     FORMAT("{1,gmt,ftime='%Y'}",a_datetime,"2013");
533     FORMAT("{1,gmt,ftime='%y'}",a_datetime,"13");
534     FORMAT("{1,gmt,ftime='%D'}",a_datetime,"12/31/13");
535 }
536 
537 
main()538 int main()
539 {
540     try {
541         boost::locale::time_zone::global("GMT+4:00");
542         std::cout << "Testing char, UTF-8" << std::endl;
543         test_manip<char>();
544         test_format<char>();
545         std::cout << "Testing char, ISO8859-1" << std::endl;
546         test_manip<char>("ISO8859-1");
547         test_format<char>("ISO8859-1");
548 
549         std::cout << "Testing wchar_t" << std::endl;
550         test_manip<wchar_t>();
551         test_format<wchar_t>();
552 
553         #ifdef BOOST_LOCALE_ENABLE_CHAR16_T
554         std::cout << "Testing char16_t" << std::endl;
555         test_manip<char16_t>();
556         test_format<char16_t>();
557         #endif
558 
559         #ifdef BOOST_LOCALE_ENABLE_CHAR32_T
560         std::cout << "Testing char32_t" << std::endl;
561         test_manip<char32_t>();
562         test_format<char32_t>();
563         #endif
564 
565     }
566     catch(std::exception const &e) {
567         std::cerr << "Failed " << e.what() << std::endl;
568         return EXIT_FAILURE;
569     }
570     FINALIZE();
571 
572 }
573 
574 #endif // NOICU
575 // vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4
576 // boostinspect:noascii
577