838f1ba853e476cde90e1e8615f6ec6dd3a01ec2
[platform/framework/web/crosswalk.git] / src / third_party / icu / source / test / intltest / miscdtfm.cpp
1 /***********************************************************************
2  * Copyright (c) 1997-2011, International Business Machines Corporation
3  * and others. All Rights Reserved.
4  ***********************************************************************/
5  
6 #include "unicode/utypes.h"
7
8 #if !UCONFIG_NO_FORMATTING
9
10 #include "miscdtfm.h"
11
12 #include "unicode/format.h"
13 #include "unicode/decimfmt.h"
14 #include "unicode/datefmt.h"
15 #include "unicode/smpdtfmt.h"
16 #include "unicode/dtfmtsym.h"
17 #include "unicode/locid.h"
18 #include "unicode/msgfmt.h"
19 #include "unicode/numfmt.h"
20 #include "unicode/choicfmt.h"
21 #include "unicode/gregocal.h"
22
23 // *****************************************************************************
24 // class DateFormatMiscTests
25 // *****************************************************************************
26
27 #define CASE(id,test) case id: name = #test; if (exec) { logln(#test "---"); logln((UnicodeString)""); test(); } break;
28
29 void 
30 DateFormatMiscTests::runIndexedTest( int32_t index, UBool exec, const char* &name, char* /*par*/ )
31 {
32     // if (exec) logln((UnicodeString)"TestSuite DateFormatMiscTests");
33     switch (index) {
34         CASE(0, test4097450)
35         CASE(1, test4099975)
36         CASE(2, test4117335)
37
38         default: name = ""; break;
39     }
40 }
41
42 UBool 
43 DateFormatMiscTests::failure(UErrorCode status, const char* msg)
44 {
45     if(U_FAILURE(status)) {
46         errcheckln(status, UnicodeString("FAIL: ") + msg + " failed, error " + u_errorName(status));
47         return TRUE;
48     }
49
50     return FALSE;
51 }
52
53 /*
54  * @bug 4097450
55  */
56 void
57 DateFormatMiscTests::test4097450()
58 {
59     //
60     // Date parse requiring 4 digit year.
61     //
62     UnicodeString  dstring [] = {
63         UnicodeString("97"),
64         UnicodeString("1997"),  
65         UnicodeString("97"),
66         UnicodeString("1997"),
67         UnicodeString("01"),
68         UnicodeString("2001"),  
69         UnicodeString("01"),
70         UnicodeString("2001"),  
71         UnicodeString("1"),
72         UnicodeString("1"),
73         UnicodeString("11"),  
74         UnicodeString("11"),
75         UnicodeString("111"), 
76         UnicodeString("111")
77     };
78     
79     UnicodeString dformat [] = {
80         UnicodeString("yy"),  
81         UnicodeString("yy"),
82         UnicodeString("yyyy"),
83         UnicodeString("yyyy"),
84         UnicodeString("yy"),  
85         UnicodeString("yy"),
86         UnicodeString("yyyy"),
87         UnicodeString("yyyy"),
88         UnicodeString("yy"),
89         UnicodeString("yyyy"),
90         UnicodeString("yy"),
91         UnicodeString("yyyy"), 
92         UnicodeString("yy"),
93         UnicodeString("yyyy")
94     };
95     
96 /*    UBool dresult [] = {
97         TRUE, 
98         FALSE, 
99         FALSE,  
100         TRUE,
101         TRUE, 
102         FALSE, 
103         FALSE,  
104         TRUE,
105         FALSE,
106         FALSE,
107         TRUE, 
108         FALSE,
109         FALSE, 
110         FALSE
111     };*/
112
113     UErrorCode status = U_ZERO_ERROR;
114     SimpleDateFormat *formatter;
115     SimpleDateFormat *resultFormatter = new SimpleDateFormat((UnicodeString)"yyyy", status);
116     if (U_FAILURE(status)) {
117         dataerrln("Fail new SimpleDateFormat: %s", u_errorName(status));
118         return;
119     }
120
121     logln("Format\tSource\tResult");
122     logln("-------\t-------\t-------");
123     for (int i = 0; i < 14/*dstring.length*/; i++)
124     {
125         log(dformat[i] + "\t" + dstring[i] + "\t");
126         formatter = new SimpleDateFormat(dformat[i], status);
127         if(failure(status, "new SimpleDateFormat")) return;
128         //try {
129         UnicodeString str;
130         FieldPosition pos(FieldPosition::DONT_CARE);
131         logln(resultFormatter->format(formatter->parse(dstring[i], status), str, pos));
132         failure(status, "resultFormatter->format");
133             //if ( !dresult[i] ) System.out.print("   <-- error!");
134         /*}
135         catch (ParseException exception) {
136             //if ( dresult[i] ) System.out.print("   <-- error!");
137             System.out.print("exception --> " + exception);
138         }*/
139         delete formatter;
140         logln();
141     }
142
143     delete resultFormatter;
144 }
145
146 /*
147  * @bug 4099975
148  */
149 void
150 DateFormatMiscTests::test4099975()
151 {
152     /** 
153      * Test Constructor SimpleDateFormat::SimpleDateFormat (const UnicodeString & pattern, 
154      *                                    const DateFormatSymbols & formatData, UErrorCode & status )
155      * The DateFormatSymbols object is NOT adopted; Modifying the original DateFormatSymbols
156      * should not change the SimpleDateFormat's behavior.
157      */
158     UDate d = Calendar::getNow();
159     {
160         UErrorCode status = U_ZERO_ERROR;
161         DateFormatSymbols* symbols = new DateFormatSymbols(Locale::getUS(), status);
162         if (U_FAILURE(status)) {
163             dataerrln("Unable to create DateFormatSymbols - %s", u_errorName(status));
164             return;     
165         }
166         SimpleDateFormat *df = new SimpleDateFormat(UnicodeString("E hh:mm"), *symbols, status);
167         if(failure(status, "new SimpleDateFormat")) return;
168         UnicodeString format0;
169         format0 = df->format(d, format0);
170         UnicodeString localizedPattern0;
171         localizedPattern0 = df->toLocalizedPattern(localizedPattern0, status);
172         failure(status, "df->toLocalizedPattern");
173         symbols->setLocalPatternChars(UnicodeString("abcdefghijklmonpqr")); // change value of field
174         UnicodeString format1;
175         format1 = df->format(d, format1);
176         if (format0 != format1) {
177             errln(UnicodeString("Formats are different. format0: ") + format0 
178                 + UnicodeString("; format1: ") + format1);
179         }
180         UnicodeString localizedPattern1;
181         localizedPattern1 = df->toLocalizedPattern(localizedPattern1, status);
182         failure(status, "df->toLocalizedPattern");
183         if (localizedPattern0 != localizedPattern1) {
184             errln(UnicodeString("Pattern has been changed. localizedPattern0: ") + localizedPattern0 
185                 + UnicodeString("; localizedPattern1: ") + localizedPattern1);
186         }
187         delete symbols;
188         delete df;
189     }
190     /*
191      * Test void SimpleDateFormat::setDateFormatSymbols (  const DateFormatSymbols & newFormatSymbols ) 
192      * Modifying the original DateFormatSymbols should not change the SimpleDateFormat's behavior.
193      */
194     {
195         UErrorCode status = U_ZERO_ERROR;
196         DateFormatSymbols* symbols = new DateFormatSymbols(Locale::getUS(), status);
197         if(failure(status, "new DateFormatSymbols")) return;
198         SimpleDateFormat *df = new SimpleDateFormat(UnicodeString("E hh:mm"), status);
199         if(failure(status, "new SimpleDateFormat")) return;
200         df->setDateFormatSymbols(*symbols);
201         UnicodeString format0;
202         format0 = df->format(d, format0);
203         UnicodeString localizedPattern0;
204         localizedPattern0 = df->toLocalizedPattern(localizedPattern0, status);
205         failure(status, "df->toLocalizedPattern");
206         symbols->setLocalPatternChars(UnicodeString("abcdefghijklmonpqr")); // change value of field
207         UnicodeString format1;
208         format1 = df->format(d, format1);
209         if (format0 != format1) {
210             errln(UnicodeString("Formats are different. format0: ") + format0 
211                 + UnicodeString("; format1: ") + format1);
212         }
213         UnicodeString localizedPattern1;
214         localizedPattern1 = df->toLocalizedPattern(localizedPattern1, status);
215         failure(status, "df->toLocalizedPattern");
216         if (localizedPattern0 != localizedPattern1) {
217             errln(UnicodeString("Pattern has been changed. localizedPattern0: ") + localizedPattern0 
218                 + UnicodeString("; localizedPattern1: ") + localizedPattern1);
219         }
220         delete symbols;
221         delete df;
222
223     }
224     //Test the pointer version of the constructor (and the adoptDateFormatSymbols method)
225     {
226         UErrorCode status = U_ZERO_ERROR;
227         DateFormatSymbols* symbols = new DateFormatSymbols(Locale::getUS(), status);
228         if(failure(status, "new DateFormatSymbols")) return;
229         SimpleDateFormat *df = new SimpleDateFormat(UnicodeString("E hh:mm"), symbols, status);
230         if(failure(status, "new SimpleDateFormat")) return;
231         UnicodeString format0;
232         format0 = df->format(d, format0);
233         UnicodeString localizedPattern0;
234         localizedPattern0 = df->toLocalizedPattern(localizedPattern0, status);
235         failure(status, "df->toLocalizedPattern");
236         symbols->setLocalPatternChars(UnicodeString("abcdefghijklmonpqr")); // change value of field
237         UnicodeString format1;
238         format1 = df->format(d, format1);
239         if (format0 != format1) {
240             errln(UnicodeString("Formats are different. format0: ") + format0 
241                 + UnicodeString("; format1: ") + format1);
242         }
243         UnicodeString localizedPattern1;
244         localizedPattern1 = df->toLocalizedPattern(localizedPattern1, status);
245         failure(status, "df->toLocalizedPattern");
246         if (localizedPattern0 == localizedPattern1) {
247             errln(UnicodeString("Pattern should have been changed. localizedPattern0: ") + localizedPattern0 
248                 + UnicodeString("; localizedPattern1: ") + localizedPattern1);
249         }
250         //delete symbols; the caller is no longer responsible for deleting the symbols
251         delete df;
252     }
253     //
254     {
255         UErrorCode status = U_ZERO_ERROR;
256         DateFormatSymbols* symbols = new DateFormatSymbols(Locale::getUS(), status);
257         failure(status, "new DateFormatSymbols");
258         SimpleDateFormat *df = new SimpleDateFormat(UnicodeString("E hh:mm"), status);
259         if(failure(status, "new SimpleDateFormat")) return;
260         df-> adoptDateFormatSymbols(symbols);
261         UnicodeString format0;
262         format0 = df->format(d, format0);
263         UnicodeString localizedPattern0;
264         localizedPattern0 = df->toLocalizedPattern(localizedPattern0, status);
265         failure(status, "df->toLocalizedPattern");
266         symbols->setLocalPatternChars(UnicodeString("abcdefghijklmonpqr")); // change value of field
267         UnicodeString format1;
268         format1 = df->format(d, format1);
269         if (format0 != format1) {
270             errln(UnicodeString("Formats are different. format0: ") + format0 
271                 + UnicodeString("; format1: ") + format1);
272         }
273         UnicodeString localizedPattern1;
274         localizedPattern1 = df->toLocalizedPattern(localizedPattern1, status);
275         failure(status, "df->toLocalizedPattern");
276         if (localizedPattern0 == localizedPattern1) {
277             errln(UnicodeString("Pattern should have been changed. localizedPattern0: ") + localizedPattern0 
278                 + UnicodeString("; localizedPattern1: ") + localizedPattern1);
279         }
280         //delete symbols; the caller is no longer responsible for deleting the symbols
281         delete df;
282     }
283 }
284
285 /*
286  * @test @(#)bug4117335.java    1.1 3/5/98
287  *
288  * @bug 4117335
289  */
290 void
291 DateFormatMiscTests::test4117335()
292 {
293     //UnicodeString bc = "\u7d00\u5143\u524d";
294     UChar bcC [] = {
295         0x7D00,
296         0x5143,
297         0x524D
298     };
299     UnicodeString bc(bcC, 3, 3);
300
301     //UnicodeString ad = "\u897f\u66a6";
302     UChar adC [] = {
303         0x897F,
304         0x66A6
305     };
306     UnicodeString ad(adC, 2, 2);
307     
308     //UnicodeString jstLong = "\u65e5\u672c\u6a19\u6e96\u6642";
309     UChar jstLongC [] = {
310         0x65e5,
311         0x672c,
312         0x6a19,
313         0x6e96,
314         0x6642
315     };
316     UChar jdtLongC [] = {0x65E5, 0x672C, 0x590F, 0x6642, 0x9593};
317
318     UnicodeString jstLong(jstLongC, 5, 5);
319
320 //    UnicodeString jstShort = "JST";
321     
322     UnicodeString tzID = "Asia/Tokyo";
323
324     UnicodeString jdtLong(jdtLongC, 5, 5);
325  
326 //    UnicodeString jdtShort = "JDT";
327     UErrorCode status = U_ZERO_ERROR;
328     DateFormatSymbols *symbols = new DateFormatSymbols(Locale::getJapan(), status);
329     if(U_FAILURE(status)) {
330       dataerrln("Failure creating DateFormatSymbols, %s", u_errorName(status));
331       delete symbols;
332       return;
333     }
334     failure(status, "new DateFormatSymbols");
335     int32_t eraCount = 0;
336     const UnicodeString *eras = symbols->getEraNames(eraCount);
337     
338     logln(UnicodeString("BC = ") + eras[0]);
339     if (eras[0] != bc) {
340         errln("*** Should have been " + bc);
341         //throw new Exception("Error in BC");
342     }
343
344     logln(UnicodeString("AD = ") + eras[1]);
345     if (eras[1] != ad) {
346         errln("*** Should have been " + ad);
347         //throw new Exception("Error in AD");
348     }
349
350     int32_t rowCount, colCount;
351     const UnicodeString **zones = symbols->getZoneStrings(rowCount, colCount);
352     //don't hard code the index .. compute it.
353     int32_t index = -1;
354     for (int32_t i = 0; i < rowCount; ++i) {
355         if (tzID == (zones[i][0])) {
356             index = i;
357             break;
358         }
359     }
360     logln(UnicodeString("Long zone name = ") + zones[index][1]);
361     if (zones[index][1] != jstLong) {
362         errln("*** Should have been " + prettify(jstLong)+ " but it is: " + prettify(zones[index][1]));
363         //throw new Exception("Error in long TZ name");
364     }
365 //    logln(UnicodeString("Short zone name = ") + zones[index][2]);
366 //    if (zones[index][2] != jstShort) {
367 //        errln("*** Should have been " + prettify(jstShort) + " but it is: " + prettify(zones[index][2]));
368 //        //throw new Exception("Error in short TZ name");
369 //    }
370     logln(UnicodeString("Long zone name = ") + zones[index][3]);
371     if (zones[index][3] != jdtLong) {
372         errln("*** Should have been " + prettify(jstLong) + " but it is: " + prettify(zones[index][3]));
373         //throw new Exception("Error in long TZ name");
374     }
375 //    logln(UnicodeString("SHORT zone name = ") + zones[index][4]);
376 //    if (zones[index][4] != jdtShort) {
377 //        errln("*** Should have been " + prettify(jstShort)+ " but it is: " + prettify(zones[index][4]));
378 //        //throw new Exception("Error in short TZ name");
379 //    }
380     delete symbols;
381
382 }
383
384 #endif /* #if !UCONFIG_NO_FORMATTING */