1 /********************************************************************
3 * Copyright (c) 2008-2015, 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 TESTCASE(1, testOptions
);
32 TESTCASE(2, testAllFieldPatterns
);
33 default: name
= ""; break;
40 * Test various generic API methods of DateTimePatternGenerator for API coverage.
42 void IntlTestDateTimePatternGeneratorAPI::testAPI(/*char *par*/)
44 UnicodeString patternData
[] = {
45 UnicodeString("yM"), // 00
46 UnicodeString("yMMM"), // 01
47 UnicodeString("yMd"), // 02
48 UnicodeString("yMMMd"), // 03
49 UnicodeString("Md"), // 04
50 UnicodeString("MMMd"), // 05
51 UnicodeString("MMMMd"), // 06
52 UnicodeString("yQQQ"), // 07
53 UnicodeString("hhmm"), // 08
54 UnicodeString("HHmm"), // 09
55 UnicodeString("jjmm"), // 10
56 UnicodeString("mmss"), // 11
57 UnicodeString("yyyyMMMM"), // 12
58 UnicodeString("MMMEd"), // 13
59 UnicodeString("Ed"), // 14
60 UnicodeString("jmmssSSS"), // 15
61 UnicodeString("JJmm"), // 16
65 const char* testLocale
[MAX_LOCALE
][4] = {
66 {"en", "US", "", ""}, // 0
67 {"en", "US", "", "calendar=japanese"}, // 1
68 {"de", "DE", "", ""}, // 2
69 {"fi", "", "", ""}, // 3
70 {"es", "", "", ""}, // 4
71 {"ja", "", "", ""}, // 5
72 {"ja", "", "", "calendar=japanese"}, // 6
73 {"zh", "Hans", "CN", ""}, // 7
74 {"zh", "TW", "", "calendar=roc"}, // 8
75 {"ru", "", "", ""}, // 9
76 {"zh", "", "", "calendar=chinese;numbers=hanidays"}, // 10
79 // For Weds, Jan 13, 1999, 23:58:59
80 UnicodeString patternResults
[] = {
82 UnicodeString("1/1999"), // 00: yM
83 UnicodeString("Jan 1999"), // 01: yMMM
84 UnicodeString("1/13/1999"), // 02: yMd
85 UnicodeString("Jan 13, 1999"), // 03: yMMMd
86 UnicodeString("1/13"), // 04: Md
87 UnicodeString("Jan 13"), // 05: MMMd
88 UnicodeString("January 13"), // 06: MMMMd
89 UnicodeString("Q1 1999"), // 07: yQQQ
90 UnicodeString("11:58 PM"), // 08: hhmm
91 UnicodeString("23:58"), // 09: HHmm
92 UnicodeString("11:58 PM"), // 10: jjmm
93 UnicodeString("58:59"), // 11: mmss
94 UnicodeString("January 1999"), // 12: yyyyMMMM
95 UnicodeString("Wed, Jan 13"), // 13: MMMEd -> EEE, MMM d
96 UnicodeString("13 Wed"), // 14: Ed -> d EEE
97 UnicodeString("11:58:59.123 PM"), // 15: jmmssSSS -> "h:mm:ss.SSS a"
98 UnicodeString("11:58"), // 16: JJmm
100 // en_US@calendar=japanese // 1 en_US@calendar=japanese
101 UnicodeString("1/11 H"), // 0: yM
102 UnicodeString("Jan 11 Heisei"), // 1: yMMM
103 UnicodeString("1/13/11 H"), // 2: yMd
104 UnicodeString("Jan 13, 11 Heisei"), // 3: yMMMd
105 UnicodeString("1/13"), // 4: Md
106 UnicodeString("Jan 13"), // 5: MMMd
107 UnicodeString("January 13"), // 6: MMMMd
108 UnicodeString("Q1 11 Heisei"), // 7: yQQQ
109 UnicodeString("11:58 PM"), // 8: hhmm
110 UnicodeString("23:58"), // 9: HHmm
111 UnicodeString("11:58 PM"), // 10: jjmm
112 UnicodeString("58:59"), // 11: mmss
113 UnicodeString("January 11 Heisei"), // 12: yyyyMMMM
114 UnicodeString("Wed, Jan 13"), // 13: MMMEd -> EEE, MMM d"
115 UnicodeString("13 Wed"), // 14: Ed -> d EEE
116 UnicodeString("11:58:59.123 PM"), // 15: jmmssSSS -> "h:mm:ss.SSS a"
117 UnicodeString("11:58"), // 16: JJmm
120 UnicodeString("1.1999"), // 00: yM
121 UnicodeString("Jan. 1999"), // 01: yMMM
122 UnicodeString("13.1.1999"), // 02: yMd
123 UnicodeString("13. Jan. 1999"), // 03: yMMMd
124 UnicodeString("13.1."), // 04: Md
125 UnicodeString("13. Jan."), // 05: MMMd
126 UnicodeString("13. Januar"), // 06: MMMMd
127 UnicodeString("Q1 1999"), // 07: yQQQ
128 UnicodeString("11:58 nachm."), // 08: hhmm
129 UnicodeString("23:58"), // 09: HHmm
130 UnicodeString("23:58"), // 10: jjmm
131 UnicodeString("58:59"), // 11: mmss
132 UnicodeString("Januar 1999"), // 12: yyyyMMMM
133 UnicodeString("Mi., 13. Jan."), // 13: MMMEd -> EEE, d. MMM
134 UnicodeString("Mi., 13."), // 14: Ed -> EEE d.
135 UnicodeString("23:58:59,123"), // 15: jmmssSSS -> "HH:mm:ss,SSS"
136 UnicodeString("23:58"), // 16: JJmm
139 UnicodeString("1.1999"), // 00: yM (fixed expected result per ticket:6626:)
140 UnicodeString("tammi 1999"), // 01: yMMM
141 UnicodeString("13.1.1999"), // 02: yMd
142 UnicodeString("13. tammikuuta 1999"), // 03: yMMMd
143 UnicodeString("13.1."), // 04: Md
144 UnicodeString("13.1."), // 05: MMMd
145 UnicodeString("13. tammikuuta"), // 06: MMMMd
146 UnicodeString("1. nelj. 1999"), // 07: yQQQ
147 UnicodeString("11.58 ip."), // 08: hhmm
148 UnicodeString("23.58"), // 09: HHmm
149 UnicodeString("23.58"), // 10: jjmm
150 UnicodeString("58.59"), // 11: mmss
151 UnicodeString("tammikuu 1999"), // 12: yyyyMMMM
152 UnicodeString("ke 13. tammikuuta"), // 13: MMMEd -> EEE d. MMM
153 UnicodeString("ke 13."), // 14: Ed -> ccc d.
154 UnicodeString("23.58.59,123"), // 15: jmmssSSS -> "H.mm.ss,SSS"
155 UnicodeString("23.58"), // 16: JJmm
158 UnicodeString("1/1999"), // 00: yM -> "M/y"
159 UnicodeString("ene 1999"), // 01: yMMM -> "MMM y"
160 UnicodeString("13/1/1999"), // 02: yMd -> "d/M/y"
161 UnicodeString("13 ene 1999"), // 03: yMMMd -> "d MMM y"
162 UnicodeString("13/1"), // 04: Md -> "d/M"
163 UnicodeString("13 ene"), // 05: MMMd -> "d MMM"
164 UnicodeString("13 de enero"), // 06: MMMMd -> "d 'de' MMMM"
165 UnicodeString("T1 1999"), // 07: yQQQ -> "QQQ y"
166 UnicodeString("11:58 p. m."), // 08: hhmm -> "hh:mm a"
167 UnicodeString("23:58"), // 09: HHmm -> "HH:mm"
168 UnicodeString("23:58"), // 10: jjmm -> "HH:mm"
169 UnicodeString("58:59"), // 11: mmss -> "mm:ss"
170 UnicodeString("enero de 1999"), // 12: yyyyMMMM -> "MMMM 'de' yyyy"
171 CharsToUnicodeString("mi\\u00E9, 13 ene"), // 13: MMMEd -> "E d MMM"
172 CharsToUnicodeString("mi\\u00E9 13"), // 14: Ed -> "EEE d"
173 UnicodeString("23:58:59,123"), // 15: jmmssSSS -> "H:mm:ss,SSS"
174 UnicodeString("23:58"), // 16: JJmm
177 UnicodeString("1999/1"), // 00: yM -> y/M
178 CharsToUnicodeString("1999\\u5E741\\u6708"), // 01: yMMM -> y\u5E74M\u6708
179 UnicodeString("1999/1/13"), // 02: yMd -> y/M/d
180 CharsToUnicodeString("1999\\u5E741\\u670813\\u65E5"), // 03: yMMMd -> y\u5E74M\u6708d\u65E5
181 UnicodeString("1/13"), // 04: Md -> M/d
182 CharsToUnicodeString("1\\u670813\\u65E5"), // 05: MMMd -> M\u6708d\u65E5
183 CharsToUnicodeString("1\\u670813\\u65E5"), // 06: MMMMd -> M\u6708d\u65E5
184 CharsToUnicodeString("1999/Q1"), // 07: yQQQ -> y/QQQ
185 CharsToUnicodeString("\\u5348\\u5F8C11:58"), // 08: hhmm
186 UnicodeString("23:58"), // 09: HHmm -> HH:mm
187 UnicodeString("23:58"), // 10: jjmm
188 UnicodeString("58:59"), // 11: mmss -> mm:ss
189 CharsToUnicodeString("1999\\u5E741\\u6708"), // 12: yyyyMMMM -> y\u5E74M\u6708
190 CharsToUnicodeString("1\\u670813\\u65E5(\\u6C34)"), // 13: MMMEd -> M\u6708d\u65E5(EEE)
191 CharsToUnicodeString("13\\u65E5(\\u6C34)"), // 14: Ed -> d\u65E5(EEE)
192 UnicodeString("23:58:59.123"), // 15: jmmssSSS -> "H:mm:ss.SSS"
193 UnicodeString("23:58"), // 16: JJmm
195 // ja@calendar=japanese // 6 ja@calendar=japanese
196 CharsToUnicodeString("H11/1"), // 00: yM -> GGGGGy/m
197 CharsToUnicodeString("\\u5E73\\u621011\\u5E741\\u6708"), // 01: yMMM -> Gy\u5E74M\u6708
198 CharsToUnicodeString("H11/1/13"), // 02: yMd -> GGGGGy/m/d
199 CharsToUnicodeString("\\u5E73\\u621011\\u5E741\\u670813\\u65E5"), // 03: yMMMd -> Gy\u5E74M\u6708d\u65E5
200 UnicodeString("1/13"), // 04: Md -> M/d
201 CharsToUnicodeString("1\\u670813\\u65E5"), // 05: MMMd -> M\u6708d\u65E5
202 CharsToUnicodeString("1\\u670813\\u65E5"), // 06: MMMMd -> M\u6708d\u65E5
203 CharsToUnicodeString("\\u5E73\\u621011/Q1"), // 07: yQQQ -> Gy/QQQ
204 CharsToUnicodeString("\\u5348\\u5F8C11:58"), // 08: hhmm ->
205 UnicodeString("23:58"), // 09: HHmm -> HH:mm (as for ja)
206 UnicodeString("23:58"), // 10: jjmm
207 UnicodeString("58:59"), // 11: mmss -> mm:ss (as for ja)
208 CharsToUnicodeString("\\u5E73\\u621011\\u5E741\\u6708"), // 12: yyyyMMMM -> Gyyyy\u5E74M\u6708
209 CharsToUnicodeString("1\\u670813\\u65E5(\\u6C34)"), // 13: MMMEd -> M\u6708d\u65E5(EEE)
210 CharsToUnicodeString("13\\u65E5(\\u6C34)"), // 14: Ed -> d\u65E5(EEE)
211 UnicodeString("23:58:59.123"), // 15: jmmssSSS -> "H:mm:ss.SSS"
212 UnicodeString("23:58"), // 16: JJmm
214 // zh_Hans_CN // 7 zh_Hans_CN
215 CharsToUnicodeString("1999\\u5E741\\u6708"), // 00: yM -> y\u5E74M\u6708
216 CharsToUnicodeString("1999\\u5E741\\u6708"), // 01: yMMM -> yyyy\u5E74MMM (fixed expected result per ticket:6626:)
217 CharsToUnicodeString("1999/1/13"), // 02: yMd
218 CharsToUnicodeString("1999\\u5E741\\u670813\\u65E5"), // 03: yMMMd -> yyyy\u5E74MMMd\u65E5 (fixed expected result per ticket:6626:)
219 UnicodeString("1/13"), // 04: Md
220 CharsToUnicodeString("1\\u670813\\u65E5"), // 05: MMMd -> M\u6708d\u65E5 (fixed expected result per ticket:6626:)
221 CharsToUnicodeString("1\\u670813\\u65E5"), // 06: MMMMd -> M\u6708d\u65E5
222 CharsToUnicodeString("1999\\u5E74\\u7B2C1\\u5B63\\u5EA6"), // 07: yQQQ
223 CharsToUnicodeString("\\u4E0B\\u534811:58"), // 08: hhmm
224 UnicodeString("23:58"), // 09: HHmm
225 CharsToUnicodeString("\\u4E0B\\u534811:58"), // 10: jjmm
226 UnicodeString("58:59"), // 11: mmss
227 CharsToUnicodeString("1999\\u5E741\\u6708"), // 12: yyyyMMMM -> yyyy\u5E74MMM
228 CharsToUnicodeString("1\\u670813\\u65E5 \\u5468\\u4E09"), // 13: MMMEd -> MMMd\u65E5 EEE
229 CharsToUnicodeString("13 \\u5468\\u4E09"), // 14: Ed -> d\u65E5EEE
230 CharsToUnicodeString("\\u4E0B\\u534811:58:59.123"), // 15: jmmssSSS -> "ah:mm:ss.SSS"
231 UnicodeString("11:58"), // 16: JJmm
233 // zh_TW@calendar=roc // 8 zh_TW@calendar=roc
234 CharsToUnicodeString("\\u6C11\\u570B88/1"), // 00: yM -> Gy/M
235 CharsToUnicodeString("\\u6C11\\u570B88\\u5E741\\u6708"), // 01: yMMM -> Gy\u5E74M\u6708
236 CharsToUnicodeString("\\u6C11\\u570B88/1/13"), // 02: yMd -> Gy/M/d
237 CharsToUnicodeString("\\u6C11\\u570B88\\u5E741\\u670813\\u65E5"), // 03: yMMMd -> Gy\u5E74M\u6708d\u65E5
238 UnicodeString("1/13"), // 04: Md -> M/d
239 CharsToUnicodeString("1\\u670813\\u65E5"), // 05: MMMd ->M\u6708d\u65E5
240 CharsToUnicodeString("1\\u670813\\u65E5"), // 06: MMMMd ->M\u6708d\u65E5
241 CharsToUnicodeString("\\u6C11\\u570B88\\u5E741\\u5B63"), // 07: yQQQ -> Gy QQQ
242 CharsToUnicodeString("\\u4E0B\\u534811:58"), // 08: hhmm ->
243 UnicodeString("23:58"), // 09: HHmm ->
244 CharsToUnicodeString("\\u4E0B\\u534811:58"), // 10: jjmm
245 UnicodeString("58:59"), // 11: mmss ->
246 CharsToUnicodeString("\\u6C11\\u570B88\\u5E741\\u6708"), // 12: yyyyMMMM -> Gy\u5E74M\u670
247 CharsToUnicodeString("1\\u670813\\u65E5 \\u9031\\u4E09"), // 13: MMMEd -> M\u6708d\u65E5 E
248 CharsToUnicodeString("13 \\u9031\\u4E09"), // 14: Ed -> d E
249 CharsToUnicodeString("\\u4E0B\\u534811:58:59.123"), // 15: jmmssSSS -> "ah:mm:ss.SSS"
250 UnicodeString("11:58"), // 16: JJmm
253 UnicodeString("01.1999"), // 00: yM -> MM.y
254 CharsToUnicodeString("\\u044F\\u043D\\u0432. 1999"), // 01: yMMM -> LLL y
255 UnicodeString("13.01.1999"), // 02: yMd -> dd.MM.y
256 CharsToUnicodeString("13 \\u044F\\u043D\\u0432. 1999 \\u0433."), // 03: yMMMd -> d MMM y
257 UnicodeString("13.01"), // 04: Md -> dd.MM
258 CharsToUnicodeString("13 \\u044F\\u043D\\u0432."), // 05: MMMd -> d MMM
259 CharsToUnicodeString("13 \\u044F\\u043D\\u0432\\u0430\\u0440\\u044F"), // 06: MMMMd -> d MMMM
260 CharsToUnicodeString("1-\\u0439 \\u043A\\u0432. 1999 \\u0433."), // 07: yQQQ -> y QQQ
261 UnicodeString("11:58 PM"), // 07: hhmm -> hh:mm a
262 UnicodeString("23:58"), // 09: HHmm -> HH:mm
263 UnicodeString("23:58"), // 10: jjmm -> HH:mm
264 UnicodeString("58:59"), // 11: mmss -> mm:ss
265 CharsToUnicodeString("\\u044F\\u043D\\u0432\\u0430\\u0440\\u044C 1999"), // 12: yyyyMMMM -> LLLL y
266 CharsToUnicodeString("\\u0421\\u0440, 13 \\u044F\\u043D\\u0432."), // 13: MMMEd -> ccc, d MMM
267 CharsToUnicodeString("\\u0421\\u0440, 13"), // 14: Ed -> EEE, d
268 UnicodeString("23:58:59,123"), // 15: jmmssSSS -> "H:mm:ss,SSS"
269 UnicodeString("23:58"), // 16: JJmm
271 // zh@calendar=chinese,numbers=hanidays // 10 zh@calendar=chinese,numbers=hanidays
272 CharsToUnicodeString("1998\\u620A\\u5BC5\\u5E74\\u51AC\\u6708"), // 00: yMMM
273 CharsToUnicodeString("1998\\u620A\\u5BC5\\u5E74\\u51AC\\u6708"), // 01: yMMM
274 CharsToUnicodeString("1998\\u5E74\\u51AC\\u6708\\u5EFF\\u516D"), // 02: yMMMd
275 CharsToUnicodeString("1998\\u5E74\\u51AC\\u6708\\u5EFF\\u516D"), // 03: yMMMd
276 CharsToUnicodeString("11-\\u5EFF\\u516D"), // 04: Md // hmm
277 CharsToUnicodeString("\\u51AC\\u6708\\u5EFF\\u516D"), // 05: MMMd
278 CharsToUnicodeString("\\u51AC\\u6708\\u5EFF\\u516D"), // 06: MMMMd
279 CharsToUnicodeString("1998\\u620A\\u5BC5\\u5E74\\u7b2c\\u56db\\u5B63\\u5EA6"), // 07: yQQQ
280 CharsToUnicodeString("\\u4E0B\\u534811:58"), // 08: hhmm
281 UnicodeString("23:58"), // 09: HHmm
282 CharsToUnicodeString("\\u4E0B\\u534811:58"), // 10: jjmm
283 UnicodeString("58:59"), // 11: mmss
284 CharsToUnicodeString("1998\\u620A\\u5BC5\\u5E74\\u51AC\\u6708"), // 12: yyyyMMMM
285 CharsToUnicodeString("\\u51AC\\u6708\\u5EFF\\u516D\\u5468\\u4E09"), // 13: MMMEd
286 CharsToUnicodeString("\\u5EFF\\u516D\\u5468\\u4E09"), // 14: Ed -> dE
287 CharsToUnicodeString("\\u4E0B\\u534811:58:59.123"), // 15: jmmssSS
288 UnicodeString("11:58"), // 16: JJmm
293 UnicodeString patternTests2
[] = {
294 UnicodeString("yyyyMMMdd"),
295 UnicodeString("yyyyqqqq"),
296 UnicodeString("yMMMdd"),
297 UnicodeString("EyyyyMMMdd"),
298 UnicodeString("yyyyMMdd"),
299 UnicodeString("yyyyMMM"),
300 UnicodeString("yyyyMM"),
301 UnicodeString("yyMM"),
302 UnicodeString("yMMMMMd"),
303 UnicodeString("EEEEEMMMMMd"),
304 UnicodeString("MMMd"),
305 UnicodeString("MMMdhmm"),
306 UnicodeString("EMMMdhmms"),
307 UnicodeString("MMdhmm"),
308 UnicodeString("EEEEMMMdhmms"),
309 UnicodeString("yyyyMMMddhhmmss"),
310 UnicodeString("EyyyyMMMddhhmmss"),
311 UnicodeString("hmm"),
312 UnicodeString("hhmm"),
313 UnicodeString("hhmmVVVV"),
316 UnicodeString patternResults2
[] = {
317 UnicodeString("Oct 14, 1999"),
318 UnicodeString("4th quarter 1999"),
319 UnicodeString("Oct 14, 1999"),
320 UnicodeString("Thu, Oct 14, 1999"),
321 UnicodeString("10/14/1999"),
322 UnicodeString("Oct 1999"),
323 UnicodeString("10/1999"),
324 UnicodeString("10/99"),
325 UnicodeString("O 14, 1999"),
326 UnicodeString("T, O 14"),
327 UnicodeString("Oct 14"),
328 UnicodeString("Oct 14, 6:58 AM"),
329 UnicodeString("Thu, Oct 14, 6:58:59 AM"),
330 UnicodeString("10/14, 6:58 AM"),
331 UnicodeString("Thursday, Oct 14, 6:58:59 AM"),
332 UnicodeString("Oct 14, 1999, 6:58:59 AM"),
333 UnicodeString("Thu, Oct 14, 1999, 6:58:59 AM"),
334 UnicodeString("6:58 AM"),
335 UnicodeString("6:58 AM"),
336 UnicodeString("6:58 AM GMT"),
340 // results for getSkeletons() and getPatternForSkeleton()
341 const UnicodeString testSkeletonsResults
[] = {
342 UnicodeString("HH:mm"),
343 UnicodeString("MMMMd"),
344 UnicodeString("MMMMMdd"),
347 const UnicodeString testBaseSkeletonsResults
[] = {
349 UnicodeString("MMMMd"),
350 UnicodeString("MMMMMd"),
353 UnicodeString
newDecimal(" "); // space
354 UnicodeString
newAppendItemName("hrs.");
355 UnicodeString
newAppendItemFormat("{1} {0}");
356 UnicodeString
newDateTimeFormat("{1} {0}");
357 UErrorCode status
= U_ZERO_ERROR
;
358 UnicodeString conflictingPattern
;
359 UDateTimePatternConflict conflictingStatus
= UDATPG_NO_CONFLICT
;
360 (void)conflictingStatus
; // Suppress set but not used warning.
362 // ======= Test CreateInstance with default locale
363 logln("Testing DateTimePatternGenerator createInstance from default locale");
365 DateTimePatternGenerator
*instFromDefaultLocale
=DateTimePatternGenerator::createInstance(status
);
366 if (U_FAILURE(status
)) {
367 dataerrln("ERROR: Could not create DateTimePatternGenerator (default) - exitting");
371 delete instFromDefaultLocale
;
374 // ======= Test CreateInstance with given locale
375 logln("Testing DateTimePatternGenerator createInstance from French locale");
376 status
= U_ZERO_ERROR
;
377 DateTimePatternGenerator
*instFromLocale
=DateTimePatternGenerator::createInstance(Locale::getFrench(), status
);
378 if (U_FAILURE(status
)) {
379 dataerrln("ERROR: Could not create DateTimePatternGenerator (Locale::getFrench()) - exitting");
383 // ======= Test clone DateTimePatternGenerator
384 logln("Testing DateTimePatternGenerator::clone()");
385 status
= U_ZERO_ERROR
;
388 UnicodeString decimalSymbol
= instFromLocale
->getDecimal();
389 UnicodeString newDecimalSymbol
= UnicodeString("*");
390 decimalSymbol
= instFromLocale
->getDecimal();
391 instFromLocale
->setDecimal(newDecimalSymbol
);
392 DateTimePatternGenerator
*cloneDTPatternGen
=instFromLocale
->clone();
393 decimalSymbol
= cloneDTPatternGen
->getDecimal();
394 if (decimalSymbol
!= newDecimalSymbol
) {
395 errln("ERROR: inconsistency is found in cloned object.");
397 if ( !(*cloneDTPatternGen
== *instFromLocale
) ) {
398 errln("ERROR: inconsistency is found in cloned object.");
401 if ( *cloneDTPatternGen
!= *instFromLocale
) {
402 errln("ERROR: inconsistency is found in cloned object.");
405 delete instFromLocale
;
406 delete cloneDTPatternGen
;
408 // ======= Test simple use cases
409 logln("Testing simple use cases");
410 status
= U_ZERO_ERROR
;
411 Locale deLocale
=Locale::getGermany();
412 UDate sampleDate
=LocaleTest::date(99, 9, 13, 23, 58, 59);
413 DateTimePatternGenerator
*gen
= DateTimePatternGenerator::createInstance(deLocale
, status
);
414 if (U_FAILURE(status
)) {
415 dataerrln("ERROR: Could not create DateTimePatternGenerator (Locale::getGermany()) - exitting");
418 UnicodeString findPattern
= gen
->getBestPattern(UnicodeString("MMMddHmm"), status
);
419 SimpleDateFormat
*format
= new SimpleDateFormat(findPattern
, deLocale
, status
);
420 if (U_FAILURE(status
)) {
421 dataerrln("ERROR: Could not create SimpleDateFormat (Locale::getGermany())");
425 TimeZone
*zone
= TimeZone::createTimeZone(UnicodeString("ECT"));
427 dataerrln("ERROR: Could not create TimeZone ECT");
432 format
->setTimeZone(*zone
);
433 UnicodeString dateReturned
, expectedResult
;
434 dateReturned
.remove();
435 dateReturned
= format
->format(sampleDate
, dateReturned
, status
);
436 expectedResult
=UnicodeString("14. Okt., 08:58", -1, US_INV
);
437 if ( dateReturned
!= expectedResult
) {
438 errln("ERROR: Simple test in getBestPattern with Locale::getGermany()).");
441 status
= U_ZERO_ERROR
;
442 conflictingStatus
= gen
->addPattern(UnicodeString("d'. von' MMMM", -1, US_INV
), true, conflictingPattern
, status
);
443 if (U_FAILURE(status
)) {
444 errln("ERROR: Could not addPattern - d\'. von\' MMMM");
446 status
= U_ZERO_ERROR
;
447 UnicodeString testPattern
=gen
->getBestPattern(UnicodeString("MMMMdd"), status
);
448 testPattern
=gen
->getBestPattern(UnicodeString("MMMddHmm"), status
);
449 format
->applyPattern(gen
->getBestPattern(UnicodeString("MMMMdHmm"), status
));
450 dateReturned
.remove();
451 dateReturned
= format
->format(sampleDate
, dateReturned
, status
);
452 expectedResult
=UnicodeString("14. von Oktober, 08:58", -1, US_INV
);
453 if ( dateReturned
!= expectedResult
) {
454 errln(UnicodeString("ERROR: Simple test addPattern failed!: d\'. von\' MMMM Got: ") + dateReturned
+ UnicodeString(" Expected: ") + expectedResult
);
458 // get a pattern and modify it
459 format
= (SimpleDateFormat
*)DateFormat::createDateTimeInstance(DateFormat::kFull
, DateFormat::kFull
,
461 format
->setTimeZone(*zone
);
462 UnicodeString pattern
;
463 pattern
= format
->toPattern(pattern
);
464 dateReturned
.remove();
465 dateReturned
= format
->format(sampleDate
, dateReturned
, status
);
466 expectedResult
=CharsToUnicodeString("Donnerstag, 14. Oktober 1999 um 08:58:59 Mitteleurop\\u00E4ische Sommerzeit");
467 if ( dateReturned
!= expectedResult
) {
468 errln("ERROR: Simple test uses full date format.");
469 errln(UnicodeString(" Got: ") + dateReturned
+ UnicodeString(" Expected: ") + expectedResult
);
472 // modify it to change the zone.
473 UnicodeString newPattern
= gen
->replaceFieldTypes(pattern
, UnicodeString("vvvv"), status
);
474 format
->applyPattern(newPattern
);
475 dateReturned
.remove();
476 dateReturned
= format
->format(sampleDate
, dateReturned
, status
);
477 expectedResult
=CharsToUnicodeString("Donnerstag, 14. Oktober 1999 um 08:58:59 Mitteleurop\\u00E4ische Zeit");
478 if ( dateReturned
!= expectedResult
) {
479 errln("ERROR: Simple test modify the timezone!");
480 errln(UnicodeString(" Got: ")+ dateReturned
+ UnicodeString(" Expected: ") + expectedResult
);
483 // setDeciaml(), getDeciaml()
484 gen
->setDecimal(newDecimal
);
485 if (newDecimal
!= gen
->getDecimal()) {
486 errln("ERROR: unexpected result from setDecimal() and getDecimal()!.\n");
489 // setAppenItemName() , getAppendItemName()
490 gen
->setAppendItemName(UDATPG_HOUR_FIELD
, newAppendItemName
);
491 if (newAppendItemName
!= gen
->getAppendItemName(UDATPG_HOUR_FIELD
)) {
492 errln("ERROR: unexpected result from setAppendItemName() and getAppendItemName()!.\n");
495 // setAppenItemFormat() , getAppendItemFormat()
496 gen
->setAppendItemFormat(UDATPG_HOUR_FIELD
, newAppendItemFormat
);
497 if (newAppendItemFormat
!= gen
->getAppendItemFormat(UDATPG_HOUR_FIELD
)) {
498 errln("ERROR: unexpected result from setAppendItemFormat() and getAppendItemFormat()!.\n");
501 // setDateTimeFormat() , getDateTimeFormat()
502 gen
->setDateTimeFormat(newDateTimeFormat
);
503 if (newDateTimeFormat
!= gen
->getDateTimeFormat()) {
504 errln("ERROR: unexpected result from setDateTimeFormat() and getDateTimeFormat()!.\n");
507 // ======== Test getSkeleton and getBaseSkeleton
508 status
= U_ZERO_ERROR
;
509 pattern
= UnicodeString("dd-MMM");
510 UnicodeString expectedSkeleton
= UnicodeString("MMMdd");
511 UnicodeString expectedBaseSkeleton
= UnicodeString("MMMd");
512 UnicodeString retSkeleton
= gen
->getSkeleton(pattern
, status
);
513 if(U_FAILURE(status
) || retSkeleton
!= expectedSkeleton
) {
514 errln("ERROR: Unexpected result from getSkeleton().\n");
515 errln(UnicodeString(" Got: ") + retSkeleton
+ UnicodeString(" Expected: ") + expectedSkeleton
);
517 retSkeleton
= gen
->getBaseSkeleton(pattern
, status
);
518 if(U_FAILURE(status
) || retSkeleton
!= expectedBaseSkeleton
) {
519 errln("ERROR: Unexpected result from getBaseSkeleton().\n");
520 errln(UnicodeString(" Got: ") + retSkeleton
+ UnicodeString(" Expected:")+ expectedBaseSkeleton
);
523 pattern
= UnicodeString("dd/MMMM/yy");
524 expectedSkeleton
= UnicodeString("yyMMMMdd");
525 expectedBaseSkeleton
= UnicodeString("yMMMMd");
526 retSkeleton
= gen
->getSkeleton(pattern
, status
);
527 if(U_FAILURE(status
) || retSkeleton
!= expectedSkeleton
) {
528 errln("ERROR: Unexpected result from getSkeleton().\n");
529 errln(UnicodeString(" Got: ") + retSkeleton
+ UnicodeString(" Expected: ") + expectedSkeleton
);
531 retSkeleton
= gen
->getBaseSkeleton(pattern
, status
);
532 if(U_FAILURE(status
) || retSkeleton
!= expectedBaseSkeleton
) {
533 errln("ERROR: Unexpected result from getBaseSkeleton().\n");
534 errln(UnicodeString(" Got: ") + retSkeleton
+ UnicodeString(" Expected:")+ expectedBaseSkeleton
);
542 status
= U_ZERO_ERROR
;
543 pattern
= UnicodeString("YYYYMMM");
544 UnicodeString expR
= CharsToUnicodeString("1999\\u5E741\\u6708"); // fixed expected result per ticket:6626:
546 UDate testDate1
= LocaleTest::date(99, 0, 13, 23, 58, 59);
547 DateTimePatternGenerator
*patGen
=DateTimePatternGenerator::createInstance(loc
, status
);
548 if(U_FAILURE(status
)) {
549 dataerrln("ERROR: Could not create DateTimePatternGenerator");
552 UnicodeString bPattern
= patGen
->getBestPattern(pattern
, status
);
554 SimpleDateFormat
sdf(bPattern
, loc
, status
);
556 rDate
= sdf
.format(testDate1
, rDate
);
558 logln(UnicodeString(" ja locale with skeleton: YYYYMMM Best Pattern:") + bPattern
);
559 logln(UnicodeString(" Formatted date:") + rDate
);
561 if ( expR
!= rDate
) {
562 errln(UnicodeString("\nERROR: Test Japanese month hack Got: ") + rDate
+
563 UnicodeString(" Expected: ") + expR
);
570 UnicodeString expR
= CharsToUnicodeString("1999\\u5E741\\u6708"); // fixed expected result per ticket:6626:
571 UDate testDate1
= LocaleTest::date(99, 0, 13, 23, 58, 59);
572 DateTimePatternGenerator
*patGen
=DateTimePatternGenerator::createInstance(loc
, status
);
573 if(U_FAILURE(status
)) {
574 dataerrln("ERROR: Could not create DateTimePatternGenerator");
577 UnicodeString bPattern
= patGen
->getBestPattern(pattern
, status
);
579 SimpleDateFormat
sdf(bPattern
, loc
, status
);
581 rDate
= sdf
.format(testDate1
, rDate
);
583 logln(UnicodeString(" zh locale with skeleton: YYYYMMM Best Pattern:") + bPattern
);
584 logln(UnicodeString(" Formatted date:") + rDate
);
585 if ( expR
!= rDate
) {
586 errln(UnicodeString("\nERROR: Test Chinese month hack Got: ") + rDate
+
587 UnicodeString(" Expected: ") + expR
);
593 // Trac# 6172 duplicate time pattern
594 status
= U_ZERO_ERROR
;
595 pattern
= UnicodeString("hmv");
596 UnicodeString expR
= UnicodeString("h:mm a v"); // avail formats has hm -> "h:mm a" (fixed expected result per ticket:6626:)
598 DateTimePatternGenerator
*patGen
=DateTimePatternGenerator::createInstance(loc
, status
);
599 if(U_FAILURE(status
)) {
600 dataerrln("ERROR: Could not create DateTimePatternGenerator");
603 UnicodeString bPattern
= patGen
->getBestPattern(pattern
, status
);
604 logln(UnicodeString(" en locale with skeleton: hmv Best Pattern:") + bPattern
);
606 if ( expR
!= bPattern
) {
607 errln(UnicodeString("\nERROR: Test EN time format Got: ") + bPattern
+
608 UnicodeString(" Expected: ") + expR
);
615 // ======= Test various skeletons.
616 logln("Testing DateTimePatternGenerator with various skeleton");
618 status
= U_ZERO_ERROR
;
619 int32_t localeIndex
=0;
620 int32_t resultIndex
=0;
621 UnicodeString resultDate
;
622 UDate testDate
= LocaleTest::date(99, 0, 13, 23, 58, 59) + 123.0;
623 while (localeIndex
< MAX_LOCALE
)
626 UnicodeString bestPattern
;
628 Locale
loc(testLocale
[localeIndex
][0], testLocale
[localeIndex
][1], testLocale
[localeIndex
][2], testLocale
[localeIndex
][3]);
629 logln("\n\n Locale: %s_%s_%s@%s", testLocale
[localeIndex
][0], testLocale
[localeIndex
][1], testLocale
[localeIndex
][2], testLocale
[localeIndex
][3]);
630 DateTimePatternGenerator
*patGen
=DateTimePatternGenerator::createInstance(loc
, status
);
631 if(U_FAILURE(status
)) {
632 dataerrln("ERROR: Could not create DateTimePatternGenerator with locale index:%d . - exitting\n", localeIndex
);
635 while (patternData
[dataIndex
].length() > 0) {
636 log(patternData
[dataIndex
]);
637 bestPattern
= patGen
->getBestPattern(patternData
[dataIndex
++], status
);
638 logln(UnicodeString(" -> ") + bestPattern
);
640 SimpleDateFormat
sdf(bestPattern
, loc
, status
);
642 resultDate
= sdf
.format(testDate
, resultDate
);
643 if ( resultDate
!= patternResults
[resultIndex
] ) {
644 errln(UnicodeString("\nERROR: Test various skeletons[") + (dataIndex
-1) + UnicodeString("], localeIndex ") + localeIndex
+
645 UnicodeString(". Got: \"") + resultDate
+ UnicodeString("\" Expected: \"") + patternResults
[resultIndex
] + "\"" );
654 // ======= More tests ticket#6110
655 logln("Testing DateTimePatternGenerator with various skeleton");
657 status
= U_ZERO_ERROR
;
660 testDate
= LocaleTest::date(99, 9, 13, 23, 58, 59);
663 UnicodeString bestPattern
;
664 logln("\n\n Test various skeletons for English locale...");
665 DateTimePatternGenerator
*patGen
=DateTimePatternGenerator::createInstance(Locale::getEnglish(), status
);
666 if(U_FAILURE(status
)) {
667 dataerrln("ERROR: Could not create DateTimePatternGenerator with locale English . - exitting\n");
670 TimeZone
*enZone
= TimeZone::createTimeZone(UnicodeString("ECT/GMT"));
672 dataerrln("ERROR: Could not create TimeZone ECT");
676 SimpleDateFormat
*enFormat
= (SimpleDateFormat
*)DateFormat::createDateTimeInstance(DateFormat::kFull
,
677 DateFormat::kFull
, Locale::getEnglish());
678 enFormat
->setTimeZone(*enZone
);
679 while (patternTests2
[dataIndex
].length() > 0) {
680 logln(patternTests2
[dataIndex
]);
681 bestPattern
= patGen
->getBestPattern(patternTests2
[dataIndex
], status
);
682 logln(UnicodeString(" -> ") + bestPattern
);
683 enFormat
->applyPattern(bestPattern
);
685 resultDate
= enFormat
->format(testDate
, resultDate
);
686 if ( resultDate
!= patternResults2
[resultIndex
] ) {
687 errln(UnicodeString("\nERROR: Test various skeletons[") + dataIndex
688 + UnicodeString("]. Got: ") + resultDate
+ UnicodeString(" Expected: ") +
689 patternResults2
[resultIndex
] );
701 // ======= Test random skeleton
702 DateTimePatternGenerator
*randDTGen
= DateTimePatternGenerator::createInstance(status
);
703 if (U_FAILURE(status
)) {
704 dataerrln("ERROR: Could not create DateTimePatternGenerator (Locale::getFrench()) - exitting");
709 for (i
=0; i
<10; ++i
) {
710 UnicodeString randomSkeleton
;
711 int32_t len
= rand() % 20;
712 for (int32_t j
=0; j
<len
; ++j
) {
713 while ((newChar
= (UChar
)(rand()%0x7f
))>=(UChar
)0x20) {
714 randomSkeleton
+= newChar
;
717 UnicodeString bestPattern
= randDTGen
->getBestPattern(randomSkeleton
, status
);
721 // UnicodeString randomString=Unicode
722 // ======= Test getStaticClassID()
724 logln("Testing getStaticClassID()");
725 status
= U_ZERO_ERROR
;
726 DateTimePatternGenerator
*test
= DateTimePatternGenerator::createInstance(status
);
728 if(test
->getDynamicClassID() != DateTimePatternGenerator::getStaticClassID()) {
729 errln("ERROR: getDynamicClassID() didn't return the expected value");
733 // ====== Test createEmptyInstance()
735 logln("Testing createEmptyInstance()");
736 status
= U_ZERO_ERROR
;
738 test
= DateTimePatternGenerator::createEmptyInstance(status
);
739 if(U_FAILURE(status
)) {
740 errln("ERROR: Fail to create an empty instance ! - exitting.\n");
745 conflictingStatus
= test
->addPattern(UnicodeString("MMMMd"), true, conflictingPattern
, status
);
746 status
= U_ZERO_ERROR
;
747 testPattern
=test
->getBestPattern(UnicodeString("MMMMdd"), status
);
748 conflictingStatus
= test
->addPattern(UnicodeString("HH:mm"), true, conflictingPattern
, status
);
749 conflictingStatus
= test
->addPattern(UnicodeString("MMMMMdd"), true, conflictingPattern
, status
); //duplicate pattern
750 StringEnumeration
*output
=NULL
;
751 output
= test
->getRedundants(status
);
752 expectedResult
=UnicodeString("MMMMd");
753 if (output
!= NULL
) {
754 output
->reset(status
);
755 const UnicodeString
*dupPattern
=output
->snext(status
);
756 if ( (dupPattern
==NULL
) || (*dupPattern
!= expectedResult
) ) {
757 errln("ERROR: Fail in getRedundants !\n");
761 // ======== Test getSkeletons and getBaseSkeletons
762 StringEnumeration
* ptrSkeletonEnum
= test
->getSkeletons(status
);
763 if(U_FAILURE(status
)) {
764 errln("ERROR: Fail to get skeletons !\n");
766 UnicodeString returnPattern
, *ptrSkeleton
;
767 ptrSkeletonEnum
->reset(status
);
768 int32_t count
=ptrSkeletonEnum
->count(status
);
769 for (i
=0; i
<count
; ++i
) {
770 ptrSkeleton
= (UnicodeString
*)ptrSkeletonEnum
->snext(status
);
771 returnPattern
= test
->getPatternForSkeleton(*ptrSkeleton
);
772 if ( returnPattern
!= testSkeletonsResults
[i
] ) {
773 errln(UnicodeString("ERROR: Unexpected result from getSkeletons and getPatternForSkeleton\nGot: ") + returnPattern
774 + UnicodeString("\nExpected: ") + testSkeletonsResults
[i
]
775 + UnicodeString("\n"));
778 StringEnumeration
* ptrBaseSkeletonEnum
= test
->getBaseSkeletons(status
);
779 if(U_FAILURE(status
)) {
780 errln("ERROR: Fail to get base skeletons !\n");
782 count
=ptrBaseSkeletonEnum
->count(status
);
783 for (i
=0; i
<count
; ++i
) {
784 ptrSkeleton
= (UnicodeString
*)ptrBaseSkeletonEnum
->snext(status
);
785 if ( *ptrSkeleton
!= testBaseSkeletonsResults
[i
] ) {
786 errln("ERROR: Unexpected result from getBaseSkeletons() !\n");
790 // ========= DateTimePatternGenerator sample code in Userguide
791 // set up the generator
792 Locale locale
= Locale::getFrench();
793 status
= U_ZERO_ERROR
;
794 DateTimePatternGenerator
*generator
= DateTimePatternGenerator::createInstance( locale
, status
);
796 // get a pattern for an abbreviated month and day
797 pattern
= generator
->getBestPattern(UnicodeString("MMMd"), status
);
798 SimpleDateFormat
formatter(pattern
, locale
, status
);
800 zone
= TimeZone::createTimeZone(UnicodeString("GMT"));
801 formatter
.setTimeZone(*zone
);
802 // use it to format (or parse)
803 UnicodeString formatted
;
804 formatted
= formatter
.format(Calendar::getNow(), formatted
, status
);
805 // for French, the result is "13 sept."
807 // cannot use the result from getNow() because the value change evreyday.
808 testDate
= LocaleTest::date(99, 0, 13, 23, 58, 59);
809 formatted
= formatter
.format(testDate
, formatted
, status
);
810 expectedResult
=UnicodeString("14 janv.");
811 if ( formatted
!= expectedResult
) {
812 errln("ERROR: Userguide sample code result!");
813 errln(UnicodeString(" Got: ")+ formatted
+ UnicodeString(" Expected: ") + expectedResult
);
818 delete ptrSkeletonEnum
;
819 delete ptrBaseSkeletonEnum
;
825 * Test handling of options
827 * For reference, as of ICU 4.3.3,
843 typedef struct DTPtnGenOptionsData
{
846 const char *expectedPattern
;
847 UDateTimePatternMatchOptions options
;
848 } DTPtnGenOptionsData
;
849 void IntlTestDateTimePatternGeneratorAPI::testOptions(/*char *par*/)
851 DTPtnGenOptionsData testData
[] = {
852 // locale skel expectedPattern options
853 { "en", "Hmm", "HH:mm", UDATPG_MATCH_NO_OPTIONS
},
854 { "en", "HHmm", "HH:mm", UDATPG_MATCH_NO_OPTIONS
},
855 { "en", "hhmm", "h:mm a", UDATPG_MATCH_NO_OPTIONS
},
856 { "en", "Hmm", "HH:mm", UDATPG_MATCH_HOUR_FIELD_LENGTH
},
857 { "en", "HHmm", "HH:mm", UDATPG_MATCH_HOUR_FIELD_LENGTH
},
858 { "en", "hhmm", "hh:mm a", UDATPG_MATCH_HOUR_FIELD_LENGTH
},
859 { "be", "Hmm", "HH.mm", UDATPG_MATCH_NO_OPTIONS
},
860 { "be", "HHmm", "HH.mm", UDATPG_MATCH_NO_OPTIONS
},
861 { "be", "hhmm", "h.mm a", UDATPG_MATCH_NO_OPTIONS
},
862 { "be", "Hmm", "H.mm", UDATPG_MATCH_HOUR_FIELD_LENGTH
},
863 { "be", "HHmm", "HH.mm", UDATPG_MATCH_HOUR_FIELD_LENGTH
},
864 { "be", "hhmm", "hh.mm a", UDATPG_MATCH_HOUR_FIELD_LENGTH
},
866 { "en", "yyyy", "yyyy", UDATPG_MATCH_NO_OPTIONS
},
867 { "en", "YYYY", "YYYY", UDATPG_MATCH_NO_OPTIONS
},
868 { "en", "U", "y", UDATPG_MATCH_NO_OPTIONS
},
869 { "en@calendar=japanese", "yyyy", "y G", UDATPG_MATCH_NO_OPTIONS
},
870 { "en@calendar=japanese", "YYYY", "Y G", UDATPG_MATCH_NO_OPTIONS
},
871 { "en@calendar=japanese", "U", "y G", UDATPG_MATCH_NO_OPTIONS
},
872 { "en@calendar=chinese", "yyyy", "r(U)", UDATPG_MATCH_NO_OPTIONS
},
873 { "en@calendar=chinese", "YYYY", "Y(Y)", UDATPG_MATCH_NO_OPTIONS
}, // not a good result, want r(Y) or r(U)
874 { "en@calendar=chinese", "U", "r(U)", UDATPG_MATCH_NO_OPTIONS
},
875 { "en@calendar=chinese", "Gy", "r(U)", UDATPG_MATCH_NO_OPTIONS
},
876 { "en@calendar=chinese", "GU", "r(U)", UDATPG_MATCH_NO_OPTIONS
},
877 { "en@calendar=chinese", "ULLL", "MMM U", UDATPG_MATCH_NO_OPTIONS
},
878 { "en@calendar=chinese", "yMMM", "MMM r(U)", UDATPG_MATCH_NO_OPTIONS
},
879 { "en@calendar=chinese", "GUMMM", "MMM r(U)", UDATPG_MATCH_NO_OPTIONS
},
880 { "zh@calendar=chinese", "yyyy", "U\\u5E74", UDATPG_MATCH_NO_OPTIONS
},
881 { "zh@calendar=chinese", "YYYY", "Y\\u5E74", UDATPG_MATCH_NO_OPTIONS
}, // not a great result, may want r(Y) or r(U)
882 { "zh@calendar=chinese", "U", "U\\u5E74", UDATPG_MATCH_NO_OPTIONS
},
883 { "zh@calendar=chinese", "Gy", "rU\\u5E74", UDATPG_MATCH_NO_OPTIONS
},
884 { "zh@calendar=chinese", "GU", "rU\\u5E74", UDATPG_MATCH_NO_OPTIONS
},
885 { "zh@calendar=chinese", "ULLL", "U\\u5E74MMM", UDATPG_MATCH_NO_OPTIONS
},
886 { "zh@calendar=chinese", "yMMM", "rU\\u5E74MMM", UDATPG_MATCH_NO_OPTIONS
},
887 { "zh@calendar=chinese", "GUMMM", "rU\\u5E74MMM", UDATPG_MATCH_NO_OPTIONS
},
890 int count
= sizeof(testData
) / sizeof(testData
[0]);
891 const DTPtnGenOptionsData
* testDataPtr
= testData
;
893 for (; count
-- > 0; ++testDataPtr
) {
894 UErrorCode status
= U_ZERO_ERROR
;
896 Locale
locale(testDataPtr
->locale
);
897 UnicodeString
skel(testDataPtr
->skel
);
898 UnicodeString
expectedPattern(UnicodeString(testDataPtr
->expectedPattern
).unescape());
899 UDateTimePatternMatchOptions options
= testDataPtr
->options
;
901 DateTimePatternGenerator
* dtpgen
= DateTimePatternGenerator::createInstance(locale
, status
);
902 if (U_FAILURE(status
)) {
903 dataerrln("Unable to create DateTimePatternGenerator instance for locale(%s): %s", locale
.getName(), u_errorName(status
));
907 UnicodeString pattern
= dtpgen
->getBestPattern(skel
, options
, status
);
908 if (pattern
.compare(expectedPattern
) != 0) {
909 errln( UnicodeString("ERROR in getBestPattern, locale ") + UnicodeString(testDataPtr
->locale
) +
910 UnicodeString(", skeleton ") + skel
+
911 ((options
)?UnicodeString(", options!=0"):UnicodeString(", options==0")) +
912 UnicodeString(", expected pattern ") + expectedPattern
+
913 UnicodeString(", got ") + pattern
);
920 * Test that DTPG can handle all valid pattern character / length combinations
923 #define FIELD_LENGTHS_COUNT 6
924 #define FIELD_LENGTH_MAX 8
925 #define MUST_INCLUDE_COUNT 5
927 typedef struct AllFieldsTestItem
{
929 int8_t fieldLengths
[FIELD_LENGTHS_COUNT
+1]; // up to FIELD_LENGTHS_COUNT lengths to try
930 // (length <=FIELD_LENGTH_MAX) plus 0 terminator
931 char mustIncludeOneOf
[MUST_INCLUDE_COUNT
+1];// resulting pattern must include at least one of
932 // these as a pattern char (0-terminated list)
935 void IntlTestDateTimePatternGeneratorAPI::testAllFieldPatterns(/*char *par*/)
937 const char * localeNames
[] = {
939 "root@calendar=japanese",
940 "root@calendar=chinese",
942 "en@calendar=japanese",
943 "en@calendar=chinese",
946 AllFieldsTestItem testData
[] = {
947 //pat fieldLengths generated pattern must
948 //chr to test include one of these
949 { 'G', {1,2,3,4,5,0}, "G" }, // era
951 { 'y', {1,2,3,4,0}, "yU" }, // year
952 { 'Y', {1,2,3,4,0}, "Y" }, // year for week of year
953 { 'u', {1,2,3,4,5,0}, "yuU" }, // extended year
954 { 'U', {1,2,3,4,5,0}, "yU" }, // cyclic year name
956 { 'Q', {1,2,3,4,0}, "Qq" }, // x
957 { 'q', {1,2,3,4,0}, "Qq" }, // standalone
959 { 'M', {1,2,3,4,5,0}, "ML" }, // x
960 { 'L', {1,2,3,4,5,0}, "ML" }, // standalone
962 { 'w', {1,2,0}, "w" }, // week of year
963 { 'W', {1,0}, "W" }, // week of month
965 { 'd', {1,2,0}, "d" }, // day of month
966 { 'D', {1,2,3,0}, "D" }, // day of year
967 { 'F', {1,0}, "F" }, // day of week in month
968 { 'g', {7,0}, "g" }, // modified julian day
970 { 'E', {1,2,3,4,5,6}, "Eec" }, // day of week
971 { 'e', {1,2,3,4,5,6}, "Eec" }, // local day of week
972 { 'c', {1,2,3,4,5,6}, "Eec" }, // standalone local day of week
974 // { 'a', {1,0}, "a" }, // am or pm // not clear this one is supposed to work (it doesn't)
976 { 'h', {1,2,0}, "hK" }, // 12 (1-12)
977 { 'H', {1,2,0}, "Hk" }, // 24 (0-23)
978 { 'K', {1,2,0}, "hK" }, // 12 (0-11)
979 { 'k', {1,2,0}, "Hk" }, // 24 (1-24)
980 { 'j', {1,2,0}, "hHKk" }, // locale default
982 { 'm', {1,2,0}, "m" }, // x
983 // second & fractions
984 { 's', {1,2,0}, "s" }, // x
985 { 'S', {1,2,3,4,0}, "S" }, // fractional second
986 { 'A', {8,0}, "A" }, // milliseconds in day
988 { 'z', {1,2,3,4,0}, "z" }, // x
989 { 'Z', {1,2,3,4,5,0}, "Z" }, // x
990 { 'O', {1,4,0}, "O" }, // x
991 { 'v', {1,4,0}, "v" }, // x
992 { 'V', {1,2,3,4,0}, "V" }, // x
993 { 'X', {1,2,3,4,5,0}, "X" }, // x
994 { 'x', {1,2,3,4,5,0}, "x" }, // x
997 const char ** localeNamesPtr
= localeNames
;
998 const char * localeName
;
999 while ( (localeName
= *localeNamesPtr
++) != NULL
) {
1000 UErrorCode status
= U_ZERO_ERROR
;
1001 Locale locale
= Locale::createFromName(localeName
);
1002 DateTimePatternGenerator
* dtpg
= DateTimePatternGenerator::createInstance(locale
, status
);
1003 if (U_SUCCESS(status
)) {
1004 const AllFieldsTestItem
* testDataPtr
= testData
;
1005 int itemCount
= sizeof(testData
) / sizeof(testData
[0]);
1006 for (; itemCount
-- > 0; ++testDataPtr
) {
1007 char skelBuf
[FIELD_LENGTH_MAX
];
1008 int32_t chrIndx
, lenIndx
;
1009 for (chrIndx
= 0; chrIndx
< FIELD_LENGTH_MAX
; chrIndx
++) {
1010 skelBuf
[chrIndx
] = testDataPtr
->patternChar
;
1012 for (lenIndx
= 0; lenIndx
< FIELD_LENGTHS_COUNT
; lenIndx
++) {
1013 int32_t skelLen
= testDataPtr
->fieldLengths
[lenIndx
];
1017 if (skelLen
> FIELD_LENGTH_MAX
) {
1020 UnicodeString
skeleton(skelBuf
, skelLen
, US_INV
);
1021 UnicodeString pattern
= dtpg
->getBestPattern(skeleton
, status
);
1022 if (U_FAILURE(status
)) {
1023 errln("DateTimePatternGenerator getBestPattern for locale %s, skelChar %c skelLength %d fails: %s",
1024 locale
.getName(), testDataPtr
->patternChar
, skelLen
, u_errorName(status
));
1025 } else if (pattern
.length() <= 0) {
1026 errln("DateTimePatternGenerator getBestPattern for locale %s, skelChar %c skelLength %d produces 0-length pattern",
1027 locale
.getName(), testDataPtr
->patternChar
, skelLen
);
1029 // test that resulting pattern has at least one char in mustIncludeOneOf
1030 UnicodeString
mustIncludeOneOf(testDataPtr
->mustIncludeOneOf
, -1, US_INV
);
1031 int32_t patIndx
, patLen
= pattern
.length();
1032 UBool inQuoted
= FALSE
;
1033 for (patIndx
= 0; patIndx
< patLen
; patIndx
++) {
1034 UChar c
= pattern
.charAt(patIndx
);
1036 inQuoted
= !inQuoted
;
1037 } else if (!inQuoted
&& c
<= 0x007A && c
>= 0x0041) {
1038 if (mustIncludeOneOf
.indexOf(c
) >= 0) {
1043 if (patIndx
>= patLen
) {
1044 errln(UnicodeString("DateTimePatternGenerator getBestPattern for locale ") +
1045 UnicodeString(locale
.getName(),-1,US_INV
) +
1046 ", skeleton " + skeleton
+
1047 ", produces pattern without required chars: " + pattern
);
1055 dataerrln("Create DateTimePatternGenerator instance for locale(%s) fails: %s",
1056 locale
.getName(), u_errorName(status
));
1060 #endif /* #if !UCONFIG_NO_FORMATTING */