1 /********************************************************************
3 * Copyright (c) 2008-2009, International Business Machines Corporation and
4 * others. All Rights Reserved.
5 ********************************************************************/
7 #include "unicode/utypes.h"
9 #if !UCONFIG_NO_FORMATTING
15 #include "unicode/calendar.h"
16 #include "unicode/smpdtfmt.h"
17 #include "unicode/dtfmtsym.h"
18 #include "unicode/dtptngen.h"
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.
26 void IntlTestDateTimePatternGeneratorAPI::runIndexedTest( int32_t index
, UBool exec
, const char* &name
, char* /*par*/ )
28 if (exec
) logln("TestSuite DateTimePatternGeneratorAPI");
31 default: name
= ""; break;
38 * Test various generic API methods of DateTimePatternGenerator for API coverage.
40 void IntlTestDateTimePatternGeneratorAPI::testAPI(/*char *par*/)
42 UnicodeString patternData
[] = {
44 UnicodeString("yMMM"),
46 UnicodeString("yMMMd"),
48 UnicodeString("MMMd"),
49 UnicodeString("yQQQ"),
50 UnicodeString("hhmm"),
51 UnicodeString("HHmm"),
52 UnicodeString("jjmm"),
53 UnicodeString("mmss"),
54 UnicodeString("yyyyMMMM"),
58 const char* testLocale
[MAX_LOCALE
][4] = {
60 {"en", "US", "", "calendar=japanese"},
61 {"zh", "Hans", "CN", ""},
65 {"ja", "", "", "calendar=japanese"},
66 {"zh", "TW", "", "calendar=roc"},
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
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
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
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
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
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
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
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
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"),
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"),
223 // results for getSkeletons() and getPatternForSkeleton()
224 const UnicodeString testSkeletonsResults
[] = {
225 UnicodeString("HH:mm"),
226 UnicodeString("MMMMd"),
227 UnicodeString("MMMMMd"),
230 const UnicodeString testBaseSkeletonsResults
[] = {
232 UnicodeString("MMMd"),
233 UnicodeString("MMMd"),
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
;
244 // ======= Test CreateInstance with default locale
245 logln("Testing DateTimePatternGenerator createInstance from default locale");
247 DateTimePatternGenerator
*instFromDefaultLocale
=DateTimePatternGenerator::createInstance(status
);
248 if (U_FAILURE(status
)) {
249 dataerrln("ERROR: Could not create DateTimePatternGenerator (default) - exitting");
253 delete instFromDefaultLocale
;
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");
265 // ======= Test clone DateTimePatternGenerator
266 logln("Testing DateTimePatternGenerator::clone()");
267 status
= U_ZERO_ERROR
;
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.");
279 if ( !(*cloneDTPatternGen
== *instFromLocale
) ) {
280 errln("ERROR: inconsistency is found in cloned object.");
283 if ( *cloneDTPatternGen
!= *instFromLocale
) {
284 errln("ERROR: inconsistency is found in cloned object.");
287 delete instFromLocale
;
288 delete cloneDTPatternGen
;
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");
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())");
307 TimeZone
*zone
= TimeZone::createTimeZone(UnicodeString("ECT"));
309 dataerrln("ERROR: Could not create TimeZone ECT");
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()).");
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");
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 ");
340 // get a pattern and modify it
341 format
= (SimpleDateFormat
*)DateFormat::createDateTimeInstance(DateFormat::kFull
, DateFormat::kFull
,
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
);
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
);
365 // setDeciaml(), getDeciaml()
366 gen
->setDecimal(newDecimal
);
367 if (newDecimal
!= gen
->getDecimal()) {
368 errln("ERROR: unexpected result from setDecimal() and getDecimal()!.\n");
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");
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");
383 // setDateTimeFormat() , getDateTimeFormat()
384 gen
->setDateTimeFormat(newDateTimeFormat
);
385 if (newDateTimeFormat
!= gen
->getDateTimeFormat()) {
386 errln("ERROR: unexpected result from setDateTimeFormat() and getDateTimeFormat()!.\n");
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
);
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
);
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
);
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
);
424 status
= U_ZERO_ERROR
;
425 pattern
= UnicodeString("YYYYMMM");
426 UnicodeString expR
= CharsToUnicodeString("1999\\u5E741\\u6708"); // fixed expected result per ticket:6626:
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");
434 UnicodeString bPattern
= patGen
->getBestPattern(pattern
, status
);
436 SimpleDateFormat
sdf(bPattern
, loc
, status
);
438 rDate
= sdf
.format(testDate1
, rDate
);
440 logln(UnicodeString(" ja locale with skeleton: YYYYMMM Best Pattern:") + bPattern
);
441 logln(UnicodeString(" Formatted date:") + rDate
);
443 if ( expR
!= rDate
) {
444 errln(UnicodeString("\nERROR: Test Japanese month hack Got: ") + rDate
+
445 UnicodeString(" Expected: ") + expR
);
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");
459 UnicodeString bPattern
= patGen
->getBestPattern(pattern
, status
);
461 SimpleDateFormat
sdf(bPattern
, loc
, status
);
463 rDate
= sdf
.format(testDate1
, rDate
);
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
);
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:)
480 DateTimePatternGenerator
*patGen
=DateTimePatternGenerator::createInstance(loc
, status
);
481 if(U_FAILURE(status
)) {
482 dataerrln("ERROR: Could not create DateTimePatternGenerator");
485 UnicodeString bPattern
= patGen
->getBestPattern(pattern
, status
);
486 logln(UnicodeString(" en locale with skeleton: hmv Best Pattern:") + bPattern
);
488 if ( expR
!= bPattern
) {
489 errln(UnicodeString("\nERROR: Test EN time format Got: ") + bPattern
+
490 UnicodeString(" Expected: ") + expR
);
497 // ======= Test various skeletons.
498 logln("Testing DateTimePatternGenerator with various skeleton");
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
)
508 UnicodeString bestPattern
;
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
);
517 while (patternData
[dataIndex
].length() > 0) {
518 log(patternData
[dataIndex
]);
519 bestPattern
= patGen
->getBestPattern(patternData
[dataIndex
++], status
);
520 logln(UnicodeString(" -> ") + bestPattern
);
522 SimpleDateFormat
sdf(bestPattern
, loc
, status
);
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
] );
536 // ======= More tests ticket#6110
537 logln("Testing DateTimePatternGenerator with various skeleton");
539 status
= U_ZERO_ERROR
;
542 testDate
= LocaleTest::date(99, 9, 13, 23, 58, 59);
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");
552 TimeZone
*enZone
= TimeZone::createTimeZone(UnicodeString("ECT/GMT"));
554 dataerrln("ERROR: Could not create TimeZone ECT");
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
);
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
] );
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");
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
;
599 UnicodeString bestPattern
= randDTGen
->getBestPattern(randomSkeleton
, status
);
603 // UnicodeString randomString=Unicode
604 // ======= Test getStaticClassID()
606 logln("Testing getStaticClassID()");
607 status
= U_ZERO_ERROR
;
608 DateTimePatternGenerator
*test
= DateTimePatternGenerator::createInstance(status
);
610 if(test
->getDynamicClassID() != DateTimePatternGenerator::getStaticClassID()) {
611 errln("ERROR: getDynamicClassID() didn't return the expected value");
615 // ====== Test createEmptyInstance()
617 logln("Testing createEmptyInstance()");
618 status
= U_ZERO_ERROR
;
620 test
= DateTimePatternGenerator::createEmptyInstance(status
);
621 if(U_FAILURE(status
)) {
622 errln("ERROR: Fail to create an empty instance ! - exitting.\n");
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");
643 // ======== Test getSkeletons and getBaseSkeletons
644 StringEnumeration
* ptrSkeletonEnum
= test
->getSkeletons(status
);
645 if(U_FAILURE(status
)) {
646 errln("ERROR: Fail to get skeletons !\n");
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"));
660 StringEnumeration
* ptrBaseSkeletonEnum
= test
->getBaseSkeletons(status
);
661 if(U_FAILURE(status
)) {
662 errln("ERROR: Fail to get base skeletons !\n");
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");
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
);
678 // get a pattern for an abbreviated month and day
679 pattern
= generator
->getBestPattern(UnicodeString("MMMd"), status
);
680 SimpleDateFormat
formatter(pattern
, locale
, status
);
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."
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
);
700 delete ptrSkeletonEnum
;
701 delete ptrBaseSkeletonEnum
;
706 #endif /* #if !UCONFIG_NO_FORMATTING */