• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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
runIndexedTest(int32_t index,UBool exec,const char * & name,char *)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
failure(UErrorCode status,const char * msg)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
test4097450()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
test4099975()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
test4117335()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 */
385