]> git.saurik.com Git - apple/icu.git/blob - icuSources/test/intltest/dtptngts.cpp
ICU-400.39.tar.gz
[apple/icu.git] / icuSources / test / intltest / dtptngts.cpp
1 /********************************************************************
2 * COPYRIGHT:
3 * Copyright (c) 2008-2009, International Business Machines Corporation and
4 * others. All Rights Reserved.
5 ********************************************************************/
6
7 #include "unicode/utypes.h"
8
9 #if !UCONFIG_NO_FORMATTING
10
11 #include <stdio.h>
12 #include <stdlib.h>
13 #include "dtptngts.h"
14
15 #include "unicode/calendar.h"
16 #include "unicode/smpdtfmt.h"
17 #include "unicode/dtfmtsym.h"
18 #include "unicode/dtptngen.h"
19 #include "loctest.h"
20
21
22 // This is an API test, not a unit test. It doesn't test very many cases, and doesn't
23 // try to test the full functionality. It just calls each function in the class and
24 // verifies that it works on a basic level.
25
26 void IntlTestDateTimePatternGeneratorAPI::runIndexedTest( int32_t index, UBool exec, const char* &name, char* /*par*/ )
27 {
28 if (exec) logln("TestSuite DateTimePatternGeneratorAPI");
29 switch (index) {
30 TESTCASE(0, testAPI);
31 default: name = ""; break;
32 }
33 }
34
35 #define MAX_LOCALE 8
36
37 /**
38 * Test various generic API methods of DateTimePatternGenerator for API coverage.
39 */
40 void IntlTestDateTimePatternGeneratorAPI::testAPI(/*char *par*/)
41 {
42 UnicodeString patternData[] = {
43 UnicodeString("yM"),
44 UnicodeString("yMMM"),
45 UnicodeString("yMd"),
46 UnicodeString("yMMMd"),
47 UnicodeString("Md"),
48 UnicodeString("MMMd"),
49 UnicodeString("yQQQ"),
50 UnicodeString("hhmm"),
51 UnicodeString("HHmm"),
52 UnicodeString("jjmm"),
53 UnicodeString("mmss"),
54 UnicodeString("yyyyMMMM"),
55 UnicodeString(),
56 };
57
58 const char* testLocale[MAX_LOCALE][4] = {
59 {"en", "US", "", ""},
60 {"en", "US", "", "calendar=japanese"},
61 {"zh", "Hans", "CN", ""},
62 {"de", "DE", "", ""},
63 {"fi", "", "", ""},
64 {"ja", "", "", ""},
65 {"ja", "", "", "calendar=japanese"},
66 {"zh", "TW", "", "calendar=roc"},
67 };
68
69 UnicodeString patternResults[] = {
70 UnicodeString("1/1999"), // en_US
71 UnicodeString("Jan 1999"),
72 UnicodeString("1/13/1999"),
73 UnicodeString("Jan 13, 1999"),
74 UnicodeString("1/13"),
75 UnicodeString("Jan 13"),
76 UnicodeString("Q1 1999"),
77 UnicodeString("11:58 PM"),
78 UnicodeString("23:58"),
79 UnicodeString("11:58 PM"), // en_US 9: jjmm
80 UnicodeString("58:59"),
81 UnicodeString("January 1999"), // en_US 11: yyyyMMMM
82
83 // currently the following for en_US@calendar=japanese just verify the correct fallback behavior for ticket:5702;
84 // however some are not the "correct" results. To fix that, root needs better DateTimePatterns/availableFormats
85 // data; cldrbug #1994 is for that.
86 UnicodeString("H 11-01"), // en_US@calendar=japanese 0: yM
87 UnicodeString("H 11 Jan"), // en_US@calendar=japanese 1: yMMM
88 UnicodeString("H 11-01-13"), // en_US@calendar=japanese 2: yMd
89 UnicodeString("H 11 Jan 13"), // en_US@calendar=japanese 3: yMMMd
90 UnicodeString("1-13"), // en_US@calendar=japanese 4: Md
91 UnicodeString("Jan 13"), // en_US@calendar=japanese 5: MMMd
92 UnicodeString("H 11 Q1"), // en_US@calendar=japanese 6: yQQQ
93 UnicodeString("11:58 PM"), // en_US@calendar=japanese 7: hhmm
94 UnicodeString("23:58"), // en_US@calendar=japanese 8: HHmm
95 UnicodeString("23:58"), // en_US@calendar=japanese 9: jjmm
96 UnicodeString("58:59"), // en_US@calendar=japanese 10: mmss
97 UnicodeString("H 11 January"), // en_US@calendar=japanese 11: yyyyMMMM
98
99 UnicodeString("1999-1", -1, US_INV), // zh_Hans_CN: yM
100 CharsToUnicodeString("1999\\u5E741\\u6708"), // zh_Hans_CN: yMMM -> yyyy\u5E74MMM (fixed expected result per ticket:6626:)
101 CharsToUnicodeString("1999\\u5E741\\u670813\\u65E5"),
102 CharsToUnicodeString("1999\\u5E741\\u670813\\u65E5"), // zh_Hans_CN: yMMMd -> yyyy\u5E74MMMd\u65E5 (fixed expected result per ticket:6626:)
103 UnicodeString("1-13"),
104 CharsToUnicodeString("1\\u670813\\u65E5"), // zh_Hans_CN: MMMd -> MMMd\u65E5 (fixed expected result per ticket:6626:)
105 CharsToUnicodeString("1999\\u5E741\\u5B63"),
106 CharsToUnicodeString("\\u4E0B\\u534811:58"),
107 UnicodeString("23:58"),
108 CharsToUnicodeString("\\u4E0B\\u534811:58"), // zh_Hans_CN 9: jjmm
109 UnicodeString("58:59"),
110 CharsToUnicodeString("1999\\u5E741\\u6708"), // zh_Hans_CN 11: yyyyMMMM -> yyyy\u5E74MMM
111
112 UnicodeString("1999-1"), // de_DE
113 UnicodeString("Jan 1999"),
114 UnicodeString("13.1.1999"),
115 UnicodeString("13. Jan 1999"),
116 UnicodeString("13.1."),
117 UnicodeString("13. Jan"),
118 UnicodeString("Q1 1999"),
119 UnicodeString("11:58 nachm."),
120 UnicodeString("23:58"),
121 UnicodeString("23:58"), // de 9: jjmm
122 UnicodeString("58:59"),
123 UnicodeString("Januar 1999"), // de 11: yyyyMMMM
124
125 UnicodeString("1.1999"), // fi 0: yM (fixed expected result per ticket:6626:)
126 UnicodeString("tammi 1999"), // fi 1: yMMM
127 UnicodeString("13.1.1999"),
128 UnicodeString("13. tammikuuta 1999"), // fi 3: yMMMd
129 UnicodeString("13.1."),
130 UnicodeString("13. tammikuuta"), // fi 5: MMMd
131 UnicodeString("1. nelj. 1999"),
132 UnicodeString("11.58 ip."), // fi 7: hhmm
133 UnicodeString("23.58"),
134 UnicodeString("23.58"), // fi 9: jjmm
135 UnicodeString("58.59"),
136 UnicodeString("tammikuu 1999"), // fi 11: yyyyMMMM
137
138 UnicodeString("1999/1"), // ja 0: yM -> y/M
139 CharsToUnicodeString("1999\\u5E741\\u6708"), // ja 1: yMMM -> y\u5E74M\u6708
140 UnicodeString("1999/1/13"), // ja 2: yMd -> y/M/d
141 CharsToUnicodeString("1999\\u5E741\\u670813\\u65E5"), // ja 3: yMMMd -> y\u5E74M\u6708d\u65E5
142 UnicodeString("1/13"), // ja 4: Md -> M/d
143 CharsToUnicodeString("1\\u670813\\u65E5"), // ja 5: MMMd -> M\u6708d\u65E5
144 UnicodeString("1999Q1"), // ja 6: yQQQ -> yQQQ
145 CharsToUnicodeString("\\u5348\\u5F8C11:58"), // ja 7: hhmm
146 UnicodeString("23:58"), // ja 8: HHmm -> HH:mm
147 UnicodeString("23:58"), // ja 9: jjmm
148 UnicodeString("58:59"), // ja 10: mmss -> mm:ss
149 CharsToUnicodeString("1999\\u5E741\\u6708"), // ja 11: yyyyMMMM -> y\u5E74M\u6708
150
151 CharsToUnicodeString("\\u5E73\\u621011/1"), // ja@japanese 0: yM -> Gy/m
152 CharsToUnicodeString("\\u5E73\\u621011\\u5E741\\u6708"), // ja@japanese 1: yMMM -> Gy\u5E74M\u6708
153 CharsToUnicodeString("\\u5E73\\u621011/1/13"), // ja@japanese 2: yMd -> Gy/m/d
154 CharsToUnicodeString("\\u5E73\\u621011\\u5E741\\u670813\\u65E5"), // ja@japanese 3: yMMMd -> Gy\u5E74M\u6708d\u65E5
155 UnicodeString("1/13"), // ja@japanese 4: Md -> M/d
156 CharsToUnicodeString("1\\u670813\\u65E5"), // ja@japanese 5: MMMd -> M\u6708d\u65E5
157 CharsToUnicodeString("\\u5E73\\u621011/Q1"), // ja@japanese 6: yQQQ -> Gy/QQQ
158 CharsToUnicodeString("\\u5348\\u5F8C11:58"), // ja@japanese 7: hhmm ->
159 UnicodeString("23:58"), // ja@japanese 8: HHmm -> HH:mm (as for ja)
160 UnicodeString("23:58"), // ja@japanese 9: jjmm
161 UnicodeString("58:59"), // ja@japanese 10: mmss -> mm:ss (as for ja)
162 CharsToUnicodeString("\\u5E73\\u621011\\u5E741\\u6708"), // ja@japanese 11: yyyyMMMM -> Gyyyy\u5E74M\u6708
163
164 CharsToUnicodeString("\\u6C11\\u570B88/1"), // zh_TW@roc 0: yM -> Gy/M
165 CharsToUnicodeString("\\u6C11\\u570B88\\u5E741\\u6708"), // zh_TW@roc 1: yMMM -> Gy\u5E74M\u6708
166 CharsToUnicodeString("\\u6C11\\u570B88/1/13"), // zh_TW@roc 2: yMd -> Gy/M/d
167 CharsToUnicodeString("\\u6C11\\u570B88\\u5E741\\u670813\\u65E5"), // zh_TW@roc 3: yMMMd -> Gy\u5E74M\u6708d\u65E5
168 UnicodeString("1/13"), // zh_TW@roc 4: Md -> M/d
169 CharsToUnicodeString("1\\u670813\\u65E5"), // zh_TW@roc 5: MMMd ->M\u6708d\u65E5
170 CharsToUnicodeString("\\u6C11\\u570B88 1\\u5B63"), // zh_TW@roc 6: yQQQ -> Gy QQQ
171 CharsToUnicodeString("\\u4E0B\\u534811:58"), // zh_TW@roc 7: hhmm ->
172 UnicodeString("23:58"), // zh_TW@roc 8: HHmm ->
173 CharsToUnicodeString("\\u4E0B\\u534811:58"), // zh_TW@roc 9: jjmm
174 UnicodeString("58:59"), // zh_TW@roc 10: mmss ->
175 CharsToUnicodeString("\\u6C11\\u570B88\\u5E741\\u6708"), // zh_TW@roc 11: yyyyMMMM -> Gy\u5E74M\u670
176
177 UnicodeString(),
178 };
179
180 UnicodeString patternTests2[] = {
181 UnicodeString("yyyyMMMdd"),
182 UnicodeString("yMMMdd"),
183 UnicodeString("EyyyyMMMdd"),
184 UnicodeString("yyyyMMdd"),
185 UnicodeString("yyyyMMM"),
186 UnicodeString("yyyyMM"),
187 UnicodeString("yyMM"),
188 UnicodeString("yMMMMMd"),
189 UnicodeString("EEEEEMMMMMd"),
190 UnicodeString("MMMd"),
191 UnicodeString("MMMdhmm"),
192 UnicodeString("EMMMdhmms"),
193 UnicodeString("MMdhmm"),
194 UnicodeString("EEEEMMMdhmms"),
195 UnicodeString("yyyyMMMddhhmmss"),
196 UnicodeString("EyyyyMMMddhhmmss"),
197 UnicodeString("hmm"),
198 UnicodeString("hhmm"),
199 UnicodeString(""),
200 };
201 UnicodeString patternResults2[] = {
202 UnicodeString("Oct 14, 1999"),
203 UnicodeString("Oct 14, 1999"),
204 UnicodeString("Thu, Oct 14, 1999"),
205 UnicodeString("10/14/1999"),
206 UnicodeString("Oct 1999"),
207 UnicodeString("10/1999"),
208 UnicodeString("10/99"),
209 UnicodeString("O 14, 1999"),
210 UnicodeString("T, O 14"),
211 UnicodeString("Oct 14"),
212 UnicodeString("Oct 14 6:58 AM"),
213 UnicodeString("Thu, Oct 14 6:58:59 AM"),
214 UnicodeString("10/14 6:58 AM"),
215 UnicodeString("Thursday, Oct 14 6:58:59 AM"),
216 UnicodeString("Oct 14, 1999 06:58:59 AM"),
217 UnicodeString("Thu, Oct 14, 1999 06:58:59 AM"),
218 UnicodeString("6:58 AM"),
219 UnicodeString("06:58 AM"),
220 UnicodeString(""),
221 };
222
223 // results for getSkeletons() and getPatternForSkeleton()
224 const UnicodeString testSkeletonsResults[] = {
225 UnicodeString("HH:mm"),
226 UnicodeString("MMMMd"),
227 UnicodeString("MMMMMd"),
228 };
229
230 const UnicodeString testBaseSkeletonsResults[] = {
231 UnicodeString("Hm"),
232 UnicodeString("MMMd"),
233 UnicodeString("MMMd"),
234 };
235
236 UnicodeString newDecimal(" "); // space
237 UnicodeString newAppendItemName("hrs.");
238 UnicodeString newAppendItemFormat("{1} {0}");
239 UnicodeString newDateTimeFormat("{1} {0}");
240 UErrorCode status = U_ZERO_ERROR;
241 UnicodeString conflictingPattern;
242 UDateTimePatternConflict conflictingStatus;
243
244 // ======= Test CreateInstance with default locale
245 logln("Testing DateTimePatternGenerator createInstance from default locale");
246
247 DateTimePatternGenerator *instFromDefaultLocale=DateTimePatternGenerator::createInstance(status);
248 if (U_FAILURE(status)) {
249 dataerrln("ERROR: Could not create DateTimePatternGenerator (default) - exitting");
250 return;
251 }
252 else {
253 delete instFromDefaultLocale;
254 }
255
256 // ======= Test CreateInstance with given locale
257 logln("Testing DateTimePatternGenerator createInstance from French locale");
258 status = U_ZERO_ERROR;
259 DateTimePatternGenerator *instFromLocale=DateTimePatternGenerator::createInstance(Locale::getFrench(), status);
260 if (U_FAILURE(status)) {
261 dataerrln("ERROR: Could not create DateTimePatternGenerator (Locale::getFrench()) - exitting");
262 return;
263 }
264
265 // ======= Test clone DateTimePatternGenerator
266 logln("Testing DateTimePatternGenerator::clone()");
267 status = U_ZERO_ERROR;
268
269
270 UnicodeString decimalSymbol = instFromLocale->getDecimal();
271 UnicodeString newDecimalSymbol = UnicodeString("*");
272 decimalSymbol = instFromLocale->getDecimal();
273 instFromLocale->setDecimal(newDecimalSymbol);
274 DateTimePatternGenerator *cloneDTPatternGen=instFromLocale->clone();
275 decimalSymbol = cloneDTPatternGen->getDecimal();
276 if (decimalSymbol != newDecimalSymbol) {
277 errln("ERROR: inconsistency is found in cloned object.");
278 }
279 if ( !(*cloneDTPatternGen == *instFromLocale) ) {
280 errln("ERROR: inconsistency is found in cloned object.");
281 }
282
283 if ( *cloneDTPatternGen != *instFromLocale ) {
284 errln("ERROR: inconsistency is found in cloned object.");
285 }
286
287 delete instFromLocale;
288 delete cloneDTPatternGen;
289
290 // ======= Test simple use cases
291 logln("Testing simple use cases");
292 status = U_ZERO_ERROR;
293 Locale deLocale=Locale::getGermany();
294 UDate sampleDate=LocaleTest::date(99, 9, 13, 23, 58, 59);
295 DateTimePatternGenerator *gen = DateTimePatternGenerator::createInstance(deLocale, status);
296 if (U_FAILURE(status)) {
297 dataerrln("ERROR: Could not create DateTimePatternGenerator (Locale::getGermany()) - exitting");
298 return;
299 }
300 UnicodeString findPattern = gen->getBestPattern(UnicodeString("MMMddHmm"), status);
301 SimpleDateFormat *format = new SimpleDateFormat(findPattern, deLocale, status);
302 if (U_FAILURE(status)) {
303 dataerrln("ERROR: Could not create SimpleDateFormat (Locale::getGermany())");
304 delete gen;
305 return;
306 }
307 TimeZone *zone = TimeZone::createTimeZone(UnicodeString("ECT"));
308 if (zone==NULL) {
309 dataerrln("ERROR: Could not create TimeZone ECT");
310 delete gen;
311 delete format;
312 return;
313 }
314 format->setTimeZone(*zone);
315 UnicodeString dateReturned, expectedResult;
316 dateReturned.remove();
317 dateReturned = format->format(sampleDate, dateReturned, status);
318 expectedResult=UnicodeString("14. Okt 8:58", -1, US_INV);
319 if ( dateReturned != expectedResult ) {
320 errln("ERROR: Simple test in getBestPattern with Locale::getGermany()).");
321 }
322 // add new pattern
323 status = U_ZERO_ERROR;
324 conflictingStatus = gen->addPattern(UnicodeString("d'. von' MMMM", -1, US_INV), true, conflictingPattern, status);
325 if (U_FAILURE(status)) {
326 errln("ERROR: Could not addPattern - d\'. von\' MMMM");
327 }
328 status = U_ZERO_ERROR;
329 UnicodeString testPattern=gen->getBestPattern(UnicodeString("MMMMdd"), status);
330 testPattern=gen->getBestPattern(UnicodeString("MMMddHmm"), status);
331 format->applyPattern(gen->getBestPattern(UnicodeString("MMMMddHmm"), status));
332 dateReturned.remove();
333 dateReturned = format->format(sampleDate, dateReturned, status);
334 expectedResult=UnicodeString("14. von Oktober 8:58", -1, US_INV);
335 if ( dateReturned != expectedResult ) {
336 errln("ERROR: Simple test addPattern failed!: d\'. von\' MMMM ");
337 }
338 delete format;
339
340 // get a pattern and modify it
341 format = (SimpleDateFormat *)DateFormat::createDateTimeInstance(DateFormat::kFull, DateFormat::kFull,
342 deLocale);
343 format->setTimeZone(*zone);
344 UnicodeString pattern;
345 pattern = format->toPattern(pattern);
346 dateReturned.remove();
347 dateReturned = format->format(sampleDate, dateReturned, status);
348 expectedResult=UnicodeString("Donnerstag, 14. Oktober 1999 08:58:59 Frankreich");
349 if ( dateReturned != expectedResult ) {
350 errln("ERROR: Simple test uses full date format.");
351 errln(UnicodeString(" Got: ") + dateReturned + UnicodeString(" Expected: ") + expectedResult);
352 }
353
354 // modify it to change the zone.
355 UnicodeString newPattern = gen->replaceFieldTypes(pattern, UnicodeString("vvvv"), status);
356 format->applyPattern(newPattern);
357 dateReturned.remove();
358 dateReturned = format->format(sampleDate, dateReturned, status);
359 expectedResult=UnicodeString("Donnerstag, 14. Oktober 1999 08:58:59 Frankreich");
360 if ( dateReturned != expectedResult ) {
361 errln("ERROR: Simple test modify the timezone!");
362 errln(UnicodeString(" Got: ")+ dateReturned + UnicodeString(" Expected: ") + expectedResult);
363 }
364
365 // setDeciaml(), getDeciaml()
366 gen->setDecimal(newDecimal);
367 if (newDecimal != gen->getDecimal()) {
368 errln("ERROR: unexpected result from setDecimal() and getDecimal()!.\n");
369 }
370
371 // setAppenItemName() , getAppendItemName()
372 gen->setAppendItemName(UDATPG_HOUR_FIELD, newAppendItemName);
373 if (newAppendItemName != gen->getAppendItemName(UDATPG_HOUR_FIELD)) {
374 errln("ERROR: unexpected result from setAppendItemName() and getAppendItemName()!.\n");
375 }
376
377 // setAppenItemFormat() , getAppendItemFormat()
378 gen->setAppendItemFormat(UDATPG_HOUR_FIELD, newAppendItemFormat);
379 if (newAppendItemFormat != gen->getAppendItemFormat(UDATPG_HOUR_FIELD)) {
380 errln("ERROR: unexpected result from setAppendItemFormat() and getAppendItemFormat()!.\n");
381 }
382
383 // setDateTimeFormat() , getDateTimeFormat()
384 gen->setDateTimeFormat(newDateTimeFormat);
385 if (newDateTimeFormat != gen->getDateTimeFormat()) {
386 errln("ERROR: unexpected result from setDateTimeFormat() and getDateTimeFormat()!.\n");
387 }
388
389 // ======== Test getSkeleton and getBaseSkeleton
390 status = U_ZERO_ERROR;
391 pattern = UnicodeString("dd-MMM");
392 UnicodeString expectedSkeleton = UnicodeString("MMMdd");
393 UnicodeString expectedBaseSkeleton = UnicodeString("MMMd");
394 UnicodeString retSkeleton = gen->getSkeleton(pattern, status);
395 if(U_FAILURE(status) || retSkeleton != expectedSkeleton ) {
396 errln("ERROR: Unexpected result from getSkeleton().\n");
397 errln(UnicodeString(" Got: ") + retSkeleton + UnicodeString(" Expected: ") + expectedSkeleton );
398 }
399 retSkeleton = gen->getBaseSkeleton(pattern, status);
400 if(U_FAILURE(status) || retSkeleton != expectedBaseSkeleton) {
401 errln("ERROR: Unexpected result from getBaseSkeleton().\n");
402 errln(UnicodeString(" Got: ") + retSkeleton + UnicodeString(" Expected:")+ expectedBaseSkeleton);
403 }
404
405 pattern = UnicodeString("dd/MMMM/yy");
406 expectedSkeleton = UnicodeString("yyMMMMdd");
407 expectedBaseSkeleton = UnicodeString("yMMMd");
408 retSkeleton = gen->getSkeleton(pattern, status);
409 if(U_FAILURE(status) || retSkeleton != expectedSkeleton ) {
410 errln("ERROR: Unexpected result from getSkeleton().\n");
411 errln(UnicodeString(" Got: ") + retSkeleton + UnicodeString(" Expected: ") + expectedSkeleton );
412 }
413 retSkeleton = gen->getBaseSkeleton(pattern, status);
414 if(U_FAILURE(status) || retSkeleton != expectedBaseSkeleton) {
415 errln("ERROR: Unexpected result from getBaseSkeleton().\n");
416 errln(UnicodeString(" Got: ") + retSkeleton + UnicodeString(" Expected:")+ expectedBaseSkeleton);
417 }
418 delete format;
419 delete zone;
420 delete gen;
421
422 {
423 // Trac# 6104
424 status = U_ZERO_ERROR;
425 pattern = UnicodeString("YYYYMMM");
426 UnicodeString expR = CharsToUnicodeString("1999\\u5E741\\u6708"); // fixed expected result per ticket:6626:
427 Locale loc("ja");
428 UDate testDate1= LocaleTest::date(99, 0, 13, 23, 58, 59);
429 DateTimePatternGenerator *patGen=DateTimePatternGenerator::createInstance(loc, status);
430 if(U_FAILURE(status)) {
431 dataerrln("ERROR: Could not create DateTimePatternGenerator");
432 return;
433 }
434 UnicodeString bPattern = patGen->getBestPattern(pattern, status);
435 UnicodeString rDate;
436 SimpleDateFormat sdf(bPattern, loc, status);
437 rDate.remove();
438 rDate = sdf.format(testDate1, rDate);
439
440 logln(UnicodeString(" ja locale with skeleton: YYYYMMM Best Pattern:") + bPattern);
441 logln(UnicodeString(" Formatted date:") + rDate);
442
443 if ( expR!= rDate ) {
444 errln(UnicodeString("\nERROR: Test Japanese month hack Got: ") + rDate +
445 UnicodeString(" Expected: ") + expR );
446 }
447
448 delete patGen;
449 }
450 { // Trac# 6104
451 Locale loc("zh");
452 UnicodeString expR = CharsToUnicodeString("1999\\u5E741\\u6708"); // fixed expected result per ticket:6626:
453 UDate testDate1= LocaleTest::date(99, 0, 13, 23, 58, 59);
454 DateTimePatternGenerator *patGen=DateTimePatternGenerator::createInstance(loc, status);
455 if(U_FAILURE(status)) {
456 dataerrln("ERROR: Could not create DateTimePatternGenerator");
457 return;
458 }
459 UnicodeString bPattern = patGen->getBestPattern(pattern, status);
460 UnicodeString rDate;
461 SimpleDateFormat sdf(bPattern, loc, status);
462 rDate.remove();
463 rDate = sdf.format(testDate1, rDate);
464
465 logln(UnicodeString(" zh locale with skeleton: YYYYMMM Best Pattern:") + bPattern);
466 logln(UnicodeString(" Formatted date:") + rDate);
467 if ( expR!= rDate ) {
468 errln(UnicodeString("\nERROR: Test Chinese month hack Got: ") + rDate +
469 UnicodeString(" Expected: ") + expR );
470 }
471 delete patGen;
472 }
473
474 {
475 // Trac# 6172 duplicate time pattern
476 status = U_ZERO_ERROR;
477 pattern = UnicodeString("hmv");
478 UnicodeString expR = UnicodeString("h:mm a v"); // avail formats has hm -> "h:mm a" (fixed expected result per ticket:6626:)
479 Locale loc("en");
480 DateTimePatternGenerator *patGen=DateTimePatternGenerator::createInstance(loc, status);
481 if(U_FAILURE(status)) {
482 dataerrln("ERROR: Could not create DateTimePatternGenerator");
483 return;
484 }
485 UnicodeString bPattern = patGen->getBestPattern(pattern, status);
486 logln(UnicodeString(" en locale with skeleton: hmv Best Pattern:") + bPattern);
487
488 if ( expR!= bPattern ) {
489 errln(UnicodeString("\nERROR: Test EN time format Got: ") + bPattern +
490 UnicodeString(" Expected: ") + expR );
491 }
492
493 delete patGen;
494 }
495
496
497 // ======= Test various skeletons.
498 logln("Testing DateTimePatternGenerator with various skeleton");
499
500 status = U_ZERO_ERROR;
501 int32_t localeIndex=0;
502 int32_t resultIndex=0;
503 UnicodeString resultDate;
504 UDate testDate= LocaleTest::date(99, 0, 13, 23, 58, 59);
505 while (localeIndex < MAX_LOCALE )
506 {
507 int32_t dataIndex=0;
508 UnicodeString bestPattern;
509
510 Locale loc(testLocale[localeIndex][0], testLocale[localeIndex][1], testLocale[localeIndex][2], testLocale[localeIndex][3]);
511 logln("\n\n Locale: %s_%s_%s@%s", testLocale[localeIndex][0], testLocale[localeIndex][1], testLocale[localeIndex][2], testLocale[localeIndex][3]);
512 DateTimePatternGenerator *patGen=DateTimePatternGenerator::createInstance(loc, status);
513 if(U_FAILURE(status)) {
514 dataerrln("ERROR: Could not create DateTimePatternGenerator with locale index:%d . - exitting\n", localeIndex);
515 return;
516 }
517 while (patternData[dataIndex].length() > 0) {
518 log(patternData[dataIndex]);
519 bestPattern = patGen->getBestPattern(patternData[dataIndex++], status);
520 logln(UnicodeString(" -> ") + bestPattern);
521
522 SimpleDateFormat sdf(bestPattern, loc, status);
523 resultDate.remove();
524 resultDate = sdf.format(testDate, resultDate);
525 if ( resultDate != patternResults[resultIndex] ) {
526 errln(UnicodeString("\nERROR: Test various skeletons[") + (dataIndex-1) + UnicodeString("], localeIndex ") + localeIndex +
527 UnicodeString(". Got: ") + resultDate + UnicodeString(" Expected: ") + patternResults[resultIndex] );
528 }
529
530 resultIndex++;
531 }
532 delete patGen;
533 localeIndex++;
534 }
535
536 // ======= More tests ticket#6110
537 logln("Testing DateTimePatternGenerator with various skeleton");
538
539 status = U_ZERO_ERROR;
540 localeIndex=0;
541 resultIndex=0;
542 testDate= LocaleTest::date(99, 9, 13, 23, 58, 59);
543 {
544 int32_t dataIndex=0;
545 UnicodeString bestPattern;
546 logln("\n\n Test various skeletons for English locale...");
547 DateTimePatternGenerator *patGen=DateTimePatternGenerator::createInstance(Locale::getEnglish(), status);
548 if(U_FAILURE(status)) {
549 dataerrln("ERROR: Could not create DateTimePatternGenerator with locale English . - exitting\n");
550 return;
551 }
552 TimeZone *enZone = TimeZone::createTimeZone(UnicodeString("ECT/GMT"));
553 if (enZone==NULL) {
554 dataerrln("ERROR: Could not create TimeZone ECT");
555 delete patGen;
556 return;
557 }
558 SimpleDateFormat *enFormat = (SimpleDateFormat *)DateFormat::createDateTimeInstance(DateFormat::kFull,
559 DateFormat::kFull, Locale::getEnglish());
560 enFormat->setTimeZone(*enZone);
561 while (patternTests2[dataIndex].length() > 0) {
562 logln(patternTests2[dataIndex]);
563 bestPattern = patGen->getBestPattern(patternTests2[dataIndex], status);
564 logln(UnicodeString(" -> ") + bestPattern);
565 enFormat->applyPattern(bestPattern);
566 resultDate.remove();
567 resultDate = enFormat->format(testDate, resultDate);
568 if ( resultDate != patternResults2[resultIndex] ) {
569 errln(UnicodeString("\nERROR: Test various skeletons[") + dataIndex
570 + UnicodeString("]. Got: ") + resultDate + UnicodeString(" Expected: ") +
571 patternResults2[resultIndex] );
572 }
573 dataIndex++;
574 resultIndex++;
575 }
576 delete patGen;
577 delete enZone;
578 delete enFormat;
579 }
580
581
582
583 // ======= Test random skeleton
584 DateTimePatternGenerator *randDTGen= DateTimePatternGenerator::createInstance(status);
585 if (U_FAILURE(status)) {
586 dataerrln("ERROR: Could not create DateTimePatternGenerator (Locale::getFrench()) - exitting");
587 return;
588 }
589 UChar newChar;
590 int32_t i;
591 for (i=0; i<10; ++i) {
592 UnicodeString randomSkeleton;
593 int32_t len = rand() % 20;
594 for (int32_t j=0; j<len; ++j ) {
595 while ((newChar = (UChar)(rand()%0x7f))>=(UChar)0x20) {
596 randomSkeleton += newChar;
597 }
598 }
599 UnicodeString bestPattern = randDTGen->getBestPattern(randomSkeleton, status);
600 }
601 delete randDTGen;
602
603 // UnicodeString randomString=Unicode
604 // ======= Test getStaticClassID()
605
606 logln("Testing getStaticClassID()");
607 status = U_ZERO_ERROR;
608 DateTimePatternGenerator *test= DateTimePatternGenerator::createInstance(status);
609
610 if(test->getDynamicClassID() != DateTimePatternGenerator::getStaticClassID()) {
611 errln("ERROR: getDynamicClassID() didn't return the expected value");
612 }
613 delete test;
614
615 // ====== Test createEmptyInstance()
616
617 logln("Testing createEmptyInstance()");
618 status = U_ZERO_ERROR;
619
620 test = DateTimePatternGenerator::createEmptyInstance(status);
621 if(U_FAILURE(status)) {
622 errln("ERROR: Fail to create an empty instance ! - exitting.\n");
623 delete test;
624 return;
625 }
626
627 conflictingStatus = test->addPattern(UnicodeString("MMMMd"), true, conflictingPattern, status);
628 status = U_ZERO_ERROR;
629 testPattern=test->getBestPattern(UnicodeString("MMMMdd"), status);
630 conflictingStatus = test->addPattern(UnicodeString("HH:mm"), true, conflictingPattern, status);
631 conflictingStatus = test->addPattern(UnicodeString("MMMMMd"), true, conflictingPattern, status); //duplicate pattern
632 StringEnumeration *output=NULL;
633 output = test->getRedundants(status);
634 expectedResult=UnicodeString("MMMMd");
635 if (output != NULL) {
636 output->reset(status);
637 const UnicodeString *dupPattern=output->snext(status);
638 if ( (dupPattern==NULL) || (*dupPattern != expectedResult) ) {
639 errln("ERROR: Fail in getRedundants !\n");
640 }
641 }
642
643 // ======== Test getSkeletons and getBaseSkeletons
644 StringEnumeration* ptrSkeletonEnum = test->getSkeletons(status);
645 if(U_FAILURE(status)) {
646 errln("ERROR: Fail to get skeletons !\n");
647 }
648 UnicodeString returnPattern, *ptrSkeleton;
649 ptrSkeletonEnum->reset(status);
650 int32_t count=ptrSkeletonEnum->count(status);
651 for (i=0; i<count; ++i) {
652 ptrSkeleton = (UnicodeString *)ptrSkeletonEnum->snext(status);
653 returnPattern = test->getPatternForSkeleton(*ptrSkeleton);
654 if ( returnPattern != testSkeletonsResults[i] ) {
655 errln(UnicodeString("ERROR: Unexpected result from getSkeletons and getPatternForSkeleton\nGot: ") + returnPattern
656 + UnicodeString("\nExpected: ") + testSkeletonsResults[i]
657 + UnicodeString("\n"));
658 }
659 }
660 StringEnumeration* ptrBaseSkeletonEnum = test->getBaseSkeletons(status);
661 if(U_FAILURE(status)) {
662 errln("ERROR: Fail to get base skeletons !\n");
663 }
664 count=ptrBaseSkeletonEnum->count(status);
665 for (i=0; i<count; ++i) {
666 ptrSkeleton = (UnicodeString *)ptrBaseSkeletonEnum->snext(status);
667 if ( *ptrSkeleton != testBaseSkeletonsResults[i] ) {
668 errln("ERROR: Unexpected result from getBaseSkeletons() !\n");
669 }
670 }
671
672 // ========= DateTimePatternGenerator sample code in Userguide
673 // set up the generator
674 Locale locale = Locale::getFrench();
675 status = U_ZERO_ERROR;
676 DateTimePatternGenerator *generator = DateTimePatternGenerator::createInstance( locale, status);
677
678 // get a pattern for an abbreviated month and day
679 pattern = generator->getBestPattern(UnicodeString("MMMd"), status);
680 SimpleDateFormat formatter(pattern, locale, status);
681
682 zone = TimeZone::createTimeZone(UnicodeString("GMT"));
683 formatter.setTimeZone(*zone);
684 // use it to format (or parse)
685 UnicodeString formatted;
686 formatted = formatter.format(Calendar::getNow(), formatted, status);
687 // for French, the result is "13 sept."
688 formatted.remove();
689 // cannot use the result from getNow() because the value change evreyday.
690 testDate= LocaleTest::date(99, 0, 13, 23, 58, 59);
691 formatted = formatter.format(testDate, formatted, status);
692 expectedResult=UnicodeString("14 janv.");
693 if ( formatted != expectedResult ) {
694 errln("ERROR: Userguide sample code result!");
695 errln(UnicodeString(" Got: ")+ formatted + UnicodeString(" Expected: ") + expectedResult);
696 }
697
698 delete zone;
699 delete output;
700 delete ptrSkeletonEnum;
701 delete ptrBaseSkeletonEnum;
702 delete test;
703 delete generator;
704 }
705
706 #endif /* #if !UCONFIG_NO_FORMATTING */