1
2 /********************************************************************
3 * COPYRIGHT:
4 * Copyright (c) 1997-2013, International Business Machines Corporation and
5 * others. All Rights Reserved.
6 ********************************************************************/
7
8 #include "unicode/utypes.h"
9
10 #if !UCONFIG_NO_FORMATTING
11
12
13 //TODO: define it in compiler flag
14 //#define DTIFMTTS_DEBUG 1
15
16
17 #ifdef DTIFMTTS_DEBUG
18 #include <iostream>
19 #endif
20
21
22 #include "cstring.h"
23 #include "dtifmtts.h"
24 #include "unicode/gregocal.h"
25 #include "unicode/dtintrv.h"
26 #include "unicode/dtitvinf.h"
27 #include "unicode/dtitvfmt.h"
28 #include "unicode/localpointer.h"
29 #include "unicode/timezone.h"
30
31
32
33 #ifdef DTIFMTTS_DEBUG
34 //#define PRINTMESG(msg) { std::cout << "(" << __FILE__ << ":" << __LINE__ << ") " << msg << "\n"; }
35 #define PRINTMESG(msg) { std::cout << msg; }
36 #endif
37
38 #define ARRAY_SIZE(array) (sizeof array / sizeof array[0])
39
40 #include <stdio.h>
41
42
runIndexedTest(int32_t index,UBool exec,const char * & name,char *)43 void DateIntervalFormatTest::runIndexedTest( int32_t index, UBool exec, const char* &name, char* /*par*/ ) {
44 if (exec) logln("TestSuite DateIntervalFormat");
45 switch (index) {
46 TESTCASE(0, testAPI);
47 TESTCASE(1, testFormat);
48 TESTCASE(2, testFormatUserDII);
49 TESTCASE(3, testSetIntervalPatternNoSideEffect);
50 TESTCASE(4, testStress);
51 default: name = ""; break;
52 }
53 }
54
55 /**
56 * Test various generic API methods of DateIntervalFormat for API coverage.
57 */
testAPI()58 void DateIntervalFormatTest::testAPI() {
59
60 /* ====== Test create interval instance with default locale and skeleton
61 */
62 UErrorCode status = U_ZERO_ERROR;
63 logln("Testing DateIntervalFormat create instance with default locale and skeleton");
64
65 DateIntervalFormat* dtitvfmt = DateIntervalFormat::createInstance(UDAT_YEAR_MONTH_DAY, status);
66 if(U_FAILURE(status)) {
67 dataerrln("ERROR: Could not create DateIntervalFormat (skeleton + default locale) - exitting");
68 return;
69 } else {
70 delete dtitvfmt;
71 }
72
73
74 /* ====== Test create interval instance with given locale and skeleton
75 */
76 status = U_ZERO_ERROR;
77 logln("Testing DateIntervalFormat create instance with given locale and skeleton");
78
79 dtitvfmt = DateIntervalFormat::createInstance(UDAT_YEAR_MONTH_DAY, Locale::getJapanese(), status);
80 if(U_FAILURE(status)) {
81 dataerrln("ERROR: Could not create DateIntervalFormat (skeleton + locale) - exitting");
82 return;
83 } else {
84 delete dtitvfmt;
85 }
86
87
88 /* ====== Test create interval instance with dateIntervalInfo and skeleton
89 */
90 status = U_ZERO_ERROR;
91 logln("Testing DateIntervalFormat create instance with dateIntervalInfo and skeleton");
92
93 DateIntervalInfo* dtitvinf = new DateIntervalInfo(Locale::getSimplifiedChinese(), status);
94
95 dtitvfmt = DateIntervalFormat::createInstance("EEEdMMMyhms", *dtitvinf, status);
96 delete dtitvinf;
97
98 if(U_FAILURE(status)) {
99 dataerrln("ERROR: Could not create DateIntervalFormat (skeleton + DateIntervalInfo + default locale) - exitting");
100 return;
101 } else {
102 delete dtitvfmt;
103 }
104
105
106 /* ====== Test create interval instance with dateIntervalInfo and skeleton
107 */
108 status = U_ZERO_ERROR;
109 logln("Testing DateIntervalFormat create instance with dateIntervalInfo and skeleton");
110
111 dtitvinf = new DateIntervalInfo(Locale::getSimplifiedChinese(), status);
112
113 dtitvfmt = DateIntervalFormat::createInstance("EEEdMMMyhms", Locale::getSimplifiedChinese(), *dtitvinf, status);
114 delete dtitvinf;
115 if(U_FAILURE(status)) {
116 dataerrln("ERROR: Could not create DateIntervalFormat (skeleton + DateIntervalInfo + locale) - exitting");
117 return;
118 }
119 // not deleted, test clone
120
121
122 // ====== Test clone()
123 status = U_ZERO_ERROR;
124 logln("Testing DateIntervalFormat clone");
125
126 DateIntervalFormat* another = (DateIntervalFormat*)dtitvfmt->clone();
127 if ( (*another) != (*dtitvfmt) ) {
128 dataerrln("ERROR: clone failed");
129 }
130
131
132 // ====== Test getDateIntervalInfo, setDateIntervalInfo, adoptDateIntervalInfo
133 status = U_ZERO_ERROR;
134 logln("Testing DateIntervalFormat getDateIntervalInfo");
135 const DateIntervalInfo* inf = another->getDateIntervalInfo();
136 dtitvfmt->setDateIntervalInfo(*inf, status);
137 const DateIntervalInfo* anotherInf = dtitvfmt->getDateIntervalInfo();
138 if ( (*inf) != (*anotherInf) || U_FAILURE(status) ) {
139 dataerrln("ERROR: getDateIntervalInfo/setDateIntervalInfo failed");
140 }
141
142 {
143 // We make sure that setDateIntervalInfo does not corrupt the cache. See ticket 9919.
144 status = U_ZERO_ERROR;
145 logln("Testing DateIntervalFormat setDateIntervalInfo");
146 const Locale &enLocale = Locale::getEnglish();
147 LocalPointer<DateIntervalFormat> dif(DateIntervalFormat::createInstance("yMd", enLocale, status));
148 if (U_FAILURE(status)) {
149 errln("Failure encountered: %s", u_errorName(status));
150 return;
151 }
152 UnicodeString expected;
153 LocalPointer<Calendar> fromTime(Calendar::createInstance(enLocale, status));
154 LocalPointer<Calendar> toTime(Calendar::createInstance(enLocale, status));
155 if (U_FAILURE(status)) {
156 errln("Failure encountered: %s", u_errorName(status));
157 return;
158 }
159 FieldPosition pos = 0;
160 fromTime->set(2013, 3, 26);
161 toTime->set(2013, 3, 28);
162 dif->format(*fromTime, *toTime, expected, pos, status);
163 if (U_FAILURE(status)) {
164 errln("Failure encountered: %s", u_errorName(status));
165 return;
166 }
167 LocalPointer<DateIntervalInfo> dii(new DateIntervalInfo(Locale::getEnglish(), status));
168 if (U_FAILURE(status)) {
169 errln("Failure encountered: %s", u_errorName(status));
170 return;
171 }
172 dii->setIntervalPattern(ctou("yMd"), UCAL_DATE, ctou("M/d/y \\u2013 d"), status);
173 dif->setDateIntervalInfo(*dii, status);
174 if (U_FAILURE(status)) {
175 errln("Failure encountered: %s", u_errorName(status));
176 return;
177 }
178 dif.adoptInstead(DateIntervalFormat::createInstance("yMd", enLocale, status));
179 if (U_FAILURE(status)) {
180 errln("Failure encountered: %s", u_errorName(status));
181 return;
182 }
183 UnicodeString actual;
184 pos = 0;
185 dif->format(*fromTime, *toTime, actual, pos, status);
186 if (U_FAILURE(status)) {
187 errln("Failure encountered: %s", u_errorName(status));
188 return;
189 }
190 if (expected != actual) {
191 errln("DateIntervalFormat.setIntervalInfo should have no side effects.");
192 }
193 }
194
195 /*
196 status = U_ZERO_ERROR;
197 DateIntervalInfo* nonConstInf = inf->clone();
198 dtitvfmt->adoptDateIntervalInfo(nonConstInf, status);
199 anotherInf = dtitvfmt->getDateIntervalInfo();
200 if ( (*inf) != (*anotherInf) || U_FAILURE(status) ) {
201 dataerrln("ERROR: adoptDateIntervalInfo failed");
202 }
203 */
204
205 // ====== Test getDateFormat, setDateFormat, adoptDateFormat
206
207 status = U_ZERO_ERROR;
208 logln("Testing DateIntervalFormat getDateFormat");
209 /*
210 const DateFormat* fmt = another->getDateFormat();
211 dtitvfmt->setDateFormat(*fmt, status);
212 const DateFormat* anotherFmt = dtitvfmt->getDateFormat();
213 if ( (*fmt) != (*anotherFmt) || U_FAILURE(status) ) {
214 dataerrln("ERROR: getDateFormat/setDateFormat failed");
215 }
216
217 status = U_ZERO_ERROR;
218 DateFormat* nonConstFmt = (DateFormat*)fmt->clone();
219 dtitvfmt->adoptDateFormat(nonConstFmt, status);
220 anotherFmt = dtitvfmt->getDateFormat();
221 if ( (*fmt) != (*anotherFmt) || U_FAILURE(status) ) {
222 dataerrln("ERROR: adoptDateFormat failed");
223 }
224 delete fmt;
225 */
226
227
228 // ======= Test getStaticClassID()
229
230 logln("Testing getStaticClassID()");
231
232
233 if(dtitvfmt->getDynamicClassID() != DateIntervalFormat::getStaticClassID()) {
234 errln("ERROR: getDynamicClassID() didn't return the expected value");
235 }
236
237 delete another;
238
239 // ====== test constructor/copy constructor and assignment
240 /* they are protected, no test
241 logln("Testing DateIntervalFormat constructor and assigment operator");
242 status = U_ZERO_ERROR;
243
244 DateFormat* constFmt = (constFmt*)dtitvfmt->getDateFormat()->clone();
245 inf = dtitvfmt->getDateIntervalInfo()->clone();
246
247
248 DateIntervalFormat* dtifmt = new DateIntervalFormat(fmt, inf, status);
249 if(U_FAILURE(status)) {
250 dataerrln("ERROR: Could not create DateIntervalFormat (default) - exitting");
251 return;
252 }
253
254 DateIntervalFormat* dtifmt2 = new(dtifmt);
255 if ( (*dtifmt) != (*dtifmt2) ) {
256 dataerrln("ERROR: Could not create DateIntervalFormat (default) - exitting");
257 return;
258 }
259
260 DateIntervalFormat dtifmt3 = (*dtifmt);
261 if ( (*dtifmt) != dtifmt3 ) {
262 dataerrln("ERROR: Could not create DateIntervalFormat (default) - exitting");
263 return;
264 }
265
266 delete dtifmt2;
267 delete dtifmt3;
268 delete dtifmt;
269 */
270
271
272 //===== test format and parse ==================
273 Formattable formattable;
274 formattable.setInt64(10);
275 UnicodeString res;
276 FieldPosition pos = 0;
277 status = U_ZERO_ERROR;
278 dtitvfmt->format(formattable, res, pos, status);
279 if ( status != U_ILLEGAL_ARGUMENT_ERROR ) {
280 dataerrln("ERROR: format non-date-interval object should set U_ILLEGAL_ARGUMENT_ERROR - exitting");
281 return;
282 }
283
284 DateInterval* dtitv = new DateInterval(3600*24*365, 3600*24*366);
285 formattable.adoptObject(dtitv);
286 res.remove();
287 pos = 0;
288 status = U_ZERO_ERROR;
289 dtitvfmt->format(formattable, res, pos, status);
290 if ( U_FAILURE(status) ) {
291 dataerrln("ERROR: format date interval failed - exitting");
292 return;
293 }
294
295 const DateFormat* dfmt = dtitvfmt->getDateFormat();
296 Calendar* fromCal = dfmt->getCalendar()->clone();
297 Calendar* toCal = dfmt->getCalendar()->clone();
298 res.remove();
299 pos = 0;
300 status = U_ZERO_ERROR;
301 dtitvfmt->format(*fromCal, *toCal, res, pos, status);
302 if ( U_FAILURE(status) ) {
303 dataerrln("ERROR: format date interval failed - exitting");
304 return;
305 }
306 delete fromCal;
307 delete toCal;
308
309
310 Formattable fmttable;
311 status = U_ZERO_ERROR;
312 // TODO: why do I need cast?
313 ((Format*)dtitvfmt)->parseObject(res, fmttable, status);
314 if ( status != U_INVALID_FORMAT_ERROR ) {
315 dataerrln("ERROR: parse should set U_INVALID_FORMAT_ERROR - exitting");
316 return;
317 }
318
319 delete dtitvfmt;
320
321 //====== test setting time zone
322 logln("Testing DateIntervalFormat set & format with different time zones, get time zone");
323 status = U_ZERO_ERROR;
324 dtitvfmt = DateIntervalFormat::createInstance("MMMdHHmm", Locale::getEnglish(), status);
325 if ( U_SUCCESS(status) ) {
326 UDate date1 = 1299090600000.0; // 2011-Mar-02 1030 in US/Pacific, 2011-Mar-03 0330 in Asia/Tokyo
327 UDate date2 = 1299115800000.0; // 2011-Mar-02 1730 in US/Pacific, 2011-Mar-03 1030 in Asia/Tokyo
328
329 DateInterval * dtitv12 = new DateInterval(date1, date2);
330 TimeZone * tzCalif = TimeZone::createTimeZone("US/Pacific");
331 TimeZone * tzTokyo = TimeZone::createTimeZone("Asia/Tokyo");
332 UnicodeString fmtCalif = UnicodeString(ctou("Mar 2, 10:30\\u201317:30"));
333 UnicodeString fmtTokyo = UnicodeString(ctou("Mar 3, 03:30\\u201310:30"));
334
335 dtitvfmt->adoptTimeZone(tzCalif);
336 res.remove();
337 pos = 0;
338 status = U_ZERO_ERROR;
339 dtitvfmt->format(dtitv12, res, pos, status);
340 if ( U_SUCCESS(status) ) {
341 if ( res.compare(fmtCalif) != 0 ) {
342 errln("ERROR: DateIntervalFormat::format for tzCalif, expect " + fmtCalif + ", get " + res);
343 }
344 } else {
345 errln("ERROR: DateIntervalFormat::format for tzCalif, status %s", u_errorName(status));
346 }
347
348 dtitvfmt->setTimeZone(*tzTokyo);
349 res.remove();
350 pos = 0;
351 status = U_ZERO_ERROR;
352 dtitvfmt->format(dtitv12, res, pos, status);
353 if ( U_SUCCESS(status) ) {
354 if ( res.compare(fmtTokyo) != 0 ) {
355 errln("ERROR: DateIntervalFormat::format for fmtTokyo, expect " + fmtTokyo + ", get " + res);
356 }
357 } else {
358 errln("ERROR: DateIntervalFormat::format for tzTokyo, status %s", u_errorName(status));
359 }
360
361 if ( dtitvfmt->getTimeZone() != *tzTokyo ) {
362 errln("ERROR: DateIntervalFormat::getTimeZone returns mismatch.");
363 }
364
365 delete tzTokyo; // tzCalif was owned by dtitvfmt which should have deleted it
366 delete dtitv12;
367 delete dtitvfmt;
368 } else {
369 errln("ERROR: DateIntervalFormat::createInstance(\"MdHH\", Locale::getEnglish(), ...), status %s", u_errorName(status));
370 }
371 //====== test format in testFormat()
372
373 //====== test DateInterval class (better coverage)
374 DateInterval dtitv1(3600*24*365, 3600*24*366);
375 DateInterval dtitv2(dtitv1);
376
377 if (!(dtitv1 == dtitv2)) {
378 errln("ERROR: Copy constructor failed for DateInterval.");
379 }
380
381 DateInterval dtitv3(3600*365, 3600*366);
382 dtitv3 = dtitv1;
383 if (!(dtitv3 == dtitv1)) {
384 errln("ERROR: Equal operator failed for DateInterval.");
385 }
386
387 DateInterval *dtitv4 = dtitv1.clone();
388 if (*dtitv4 != dtitv1) {
389 errln("ERROR: Equal operator failed for DateInterval.");
390 }
391 delete dtitv4;
392 }
393
394
395 /**
396 * Test format
397 */
testFormat()398 void DateIntervalFormatTest::testFormat() {
399 // first item is date pattern
400 // followed by a group of locale/from_data/to_data/skeleton/interval_data
401 const char* DATA[] = {
402 "yyyy MM dd HH:mm:ss",
403 // test root
404 "root", "2007 11 10 10:10:10", "2007 12 10 10:10:10", "yM", "2007-11 \\u2013 2007-12",
405
406 // test 'H' and 'h', using availableFormat in fallback
407 "en", "2007 11 10 10:10:10", "2007 11 10 15:10:10", "Hms", "10:10:10 \\u2013 15:10:10",
408 "en", "2007 11 10 10:10:10", "2007 11 10 15:10:10", "hms", "10:10:10 AM \\u2013 3:10:10 PM",
409
410 "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "MMMM", "October 2007 \\u2013 October 2008",
411 "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "MMM", "Oct 2007 \\u2013 Oct 2008",
412 // test skeleton with both date and time
413 "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "dMMMyhm", "Nov 10, 2007, 10:10 AM \\u2013 Nov 20, 2007, 10:10 AM",
414
415 "en", "2007 11 10 10:10:10", "2007 11 10 11:10:10", "dMMMyhm", "Nov 10, 2007, 10:10\\u201311:10 AM",
416
417 "en", "2007 11 10 10:10:10", "2007 11 10 11:10:10", "hms", "10:10:10 AM \\u2013 11:10:10 AM",
418 "en", "2007 11 10 10:10:10", "2007 11 10 11:10:10", "Hms", "10:10:10 \\u2013 11:10:10",
419 "en", "2007 11 10 20:10:10", "2007 11 10 21:10:10", "Hms", "20:10:10 \\u2013 21:10:10",
420
421 "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "EEEEdMMMMy", "Wednesday, October 10, 2007 \\u2013 Friday, October 10, 2008",
422
423 "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "dMMMMy", "October 10, 2007 \\u2013 October 10, 2008",
424
425 "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "dMMMM", "October 10, 2007 \\u2013 October 10, 2008",
426
427 "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "MMMMy", "October 2007 \\u2013 October 2008",
428
429 "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "EEEEdMMMM", "Wednesday, October 10, 2007 \\u2013 Friday, October 10, 2008",
430
431 "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "EdMMMy", "Wed, Oct 10, 2007 \\u2013 Fri, Oct 10, 2008",
432
433 "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "dMMMy", "Oct 10, 2007 \\u2013 Oct 10, 2008",
434
435 "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "dMMM", "Oct 10, 2007 \\u2013 Oct 10, 2008",
436
437 "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "MMMy", "Oct 2007 \\u2013 Oct 2008",
438
439 "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "EdMMM", "Wed, Oct 10, 2007 \\u2013 Fri, Oct 10, 2008",
440
441 "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "EdMy", "Wed, 10/10/2007 \\u2013 Fri, 10/10/2008",
442
443 "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "dMy", "10/10/2007 \\u2013 10/10/2008",
444
445 "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "dM", "10/10/2007 \\u2013 10/10/2008",
446
447 "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "My", "10/2007 \\u2013 10/2008",
448
449 "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "EdM", "Wed, 10/10/2007 \\u2013 Fri, 10/10/2008",
450
451 "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "d", "10/10/2007 \\u2013 10/10/2008",
452
453 "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "Ed", "10 Wed \\u2013 10 Fri",
454
455 "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "y", "2007\\u20132008",
456
457 "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "M", "10/2007 \\u2013 10/2008",
458
459
460
461 "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "hm", "10/10/2007, 10:10 AM \\u2013 10/10/2008, 10:10 AM",
462 "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "Hm", "10/10/2007, 10:10 \\u2013 10/10/2008, 10:10",
463 "en", "2007 10 10 20:10:10", "2008 10 10 20:10:10", "Hm", "10/10/2007, 20:10 \\u2013 10/10/2008, 20:10",
464
465 "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "hmv", "10/10/2007, 10:10 AM PT \\u2013 10/10/2008, 10:10 AM PT",
466
467 "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "hmz", "10/10/2007, 10:10 AM PDT \\u2013 10/10/2008, 10:10 AM PDT",
468
469 "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "h", "10/10/2007, 10 AM \\u2013 10/10/2008, 10 AM",
470
471 "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "hv", "10/10/2007, 10 AM PT \\u2013 10/10/2008, 10 AM PT",
472
473 "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "hz", "10/10/2007, 10 AM PDT \\u2013 10/10/2008, 10 AM PDT",
474
475 "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "EEddMMyyyy", "Wed, 10/10/2007 \\u2013 Fri, 10/10/2008",
476
477 "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "EddMMy", "Wed, 10/10/2007 \\u2013 Fri, 10/10/2008",
478
479 "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "hhmm", "10/10/2007, 10:10 AM \\u2013 10/10/2008, 10:10 AM",
480
481 "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "hhmmzz", "10/10/2007, 10:10 AM PDT \\u2013 10/10/2008, 10:10 AM PDT",
482
483 "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "hms", "10/10/2007, 10:10:10 AM \\u2013 10/10/2008, 10:10:10 AM",
484
485 "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "dMMMMMy", "O 10, 2007 \\u2013 O 10, 2008",
486
487 "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "EEEEEdM", "W, 10/10/2007 \\u2013 F, 10/10/2008",
488
489 "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "EEEEdMMMMy", "Wednesday, October 10 \\u2013 Saturday, November 10, 2007",
490
491 "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "dMMMMy", "October 10 \\u2013 November 10, 2007",
492
493 "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "dMMMM", "October 10 \\u2013 November 10",
494
495 "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "MMMMy", "October\\u2013November 2007",
496
497 "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "EEEEdMMMM", "Wednesday, October 10 \\u2013 Saturday, November 10",
498
499 "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "EdMMMy", "Wed, Oct 10 \\u2013 Sat, Nov 10, 2007",
500
501 "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "dMMMy", "Oct 10 \\u2013 Nov 10, 2007",
502
503 "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "dMMM", "Oct 10 \\u2013 Nov 10",
504
505 "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "MMMy", "Oct\\u2013Nov 2007",
506
507 "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "EdMMM", "Wed, Oct 10 \\u2013 Sat, Nov 10",
508
509 "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "EdMy", "Wed, 10/10/2007 \\u2013 Sat, 11/10/2007",
510
511 "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "dMy", "10/10/2007 \\u2013 11/10/2007",
512
513
514 "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "My", "10/2007 \\u2013 11/2007",
515
516 "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "EdM", "Wed, 10/10 \\u2013 Sat, 11/10",
517
518 "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "d", "10/10 \\u2013 11/10",
519
520 "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "Ed", "10 Wed \\u2013 10 Sat",
521
522 "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "y", "2007",
523
524 "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "M", "10\\u201311",
525
526 "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "MMM", "Oct\\u2013Nov",
527
528 "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "MMMM", "October\\u2013November",
529
530 "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "hm", "10/10/2007, 10:10 AM \\u2013 11/10/2007, 10:10 AM",
531 "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "Hm", "10/10/2007, 10:10 \\u2013 11/10/2007, 10:10",
532 "en", "2007 10 10 20:10:10", "2007 11 10 20:10:10", "Hm", "10/10/2007, 20:10 \\u2013 11/10/2007, 20:10",
533
534 "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "hmv", "10/10/2007, 10:10 AM PT \\u2013 11/10/2007, 10:10 AM PT",
535
536 "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "hmz", "10/10/2007, 10:10 AM PDT \\u2013 11/10/2007, 10:10 AM PST",
537
538 "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "h", "10/10/2007, 10 AM \\u2013 11/10/2007, 10 AM",
539
540 "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "hv", "10/10/2007, 10 AM PT \\u2013 11/10/2007, 10 AM PT",
541
542 "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "hz", "10/10/2007, 10 AM PDT \\u2013 11/10/2007, 10 AM PST",
543
544 "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "EEddMMyyyy", "Wed, 10/10/2007 \\u2013 Sat, 11/10/2007",
545
546 "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "EddMMy", "Wed, 10/10/2007 \\u2013 Sat, 11/10/2007",
547
548
549 "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "hhmmzz", "10/10/2007, 10:10 AM PDT \\u2013 11/10/2007, 10:10 AM PST",
550
551 "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "hms", "10/10/2007, 10:10:10 AM \\u2013 11/10/2007, 10:10:10 AM",
552
553 "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "dMMMMMy", "O 10 \\u2013 N 10, 2007",
554
555 "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "EEEEEdM", "W, 10/10 \\u2013 S, 11/10",
556
557 "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "EEEEdMMMMy", "Saturday, November 10 \\u2013 Tuesday, November 20, 2007",
558
559 "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "dMMMMy", "November 10\\u201320, 2007",
560
561 "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "dMMMM", "November 10\\u201320",
562
563
564 "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "EEEEdMMMM", "Saturday, November 10 \\u2013 Tuesday, November 20",
565
566 "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "EdMMMy", "Sat, Nov 10 \\u2013 Tue, Nov 20, 2007",
567
568 "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "dMMMy", "Nov 10\\u201320, 2007",
569
570 "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "dMMM", "Nov 10\\u201320",
571
572 "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "MMMy", "Nov 2007",
573
574 "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "EdMMM", "Sat, Nov 10 \\u2013 Tue, Nov 20",
575
576 "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "EdMy", "Sat, 11/10/2007 \\u2013 Tue, 11/20/2007",
577
578 "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "dMy", "11/10/2007 \\u2013 11/20/2007",
579
580 "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "dM", "11/10 \\u2013 11/20",
581
582 "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "My", "11/2007",
583
584 "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "EdM", "Sat, 11/10 \\u2013 Tue, 11/20",
585
586 "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "d", "10\\u201320",
587
588 "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "Ed", "10 Sat \\u2013 20 Tue",
589
590 "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "y", "2007",
591
592 "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "M", "11",
593
594 "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "MMM", "Nov",
595
596 "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "MMMM", "November",
597
598 "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "hm", "11/10/2007, 10:10 AM \\u2013 11/20/2007, 10:10 AM",
599 "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "Hm", "11/10/2007, 10:10 \\u2013 11/20/2007, 10:10",
600 "en", "2007 11 10 20:10:10", "2007 11 20 20:10:10", "Hm", "11/10/2007, 20:10 \\u2013 11/20/2007, 20:10",
601
602 "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "hmv", "11/10/2007, 10:10 AM PT \\u2013 11/20/2007, 10:10 AM PT",
603
604 "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "hmz", "11/10/2007, 10:10 AM PST \\u2013 11/20/2007, 10:10 AM PST",
605
606 "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "h", "11/10/2007, 10 AM \\u2013 11/20/2007, 10 AM",
607
608 "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "hv", "11/10/2007, 10 AM PT \\u2013 11/20/2007, 10 AM PT",
609
610 "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "hz", "11/10/2007, 10 AM PST \\u2013 11/20/2007, 10 AM PST",
611
612 "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "EEddMMyyyy", "Sat, 11/10/2007 \\u2013 Tue, 11/20/2007",
613
614 "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "EddMMy", "Sat, 11/10/2007 \\u2013 Tue, 11/20/2007",
615
616 "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "hhmm", "11/10/2007, 10:10 AM \\u2013 11/20/2007, 10:10 AM",
617
618 "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "hhmmzz", "11/10/2007, 10:10 AM PST \\u2013 11/20/2007, 10:10 AM PST",
619
620 "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "hms", "11/10/2007, 10:10:10 AM \\u2013 11/20/2007, 10:10:10 AM",
621 "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "Hms", "11/10/2007, 10:10:10 \\u2013 11/20/2007, 10:10:10",
622 "en", "2007 11 10 20:10:10", "2007 11 20 20:10:10", "Hms", "11/10/2007, 20:10:10 \\u2013 11/20/2007, 20:10:10",
623
624 "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "dMMMMMy", "N 10\\u201320, 2007",
625
626 "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "EEEEEdM", "S, 11/10 \\u2013 T, 11/20",
627
628 "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "EEEEdMMMMy", "Wednesday, January 10, 2007",
629
630 "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "dMMMMy", "January 10, 2007",
631
632 "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "dMMMM", "January 10",
633
634 "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "MMMMy", "January 2007",
635
636 "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "EEEEdMMMM", "Wednesday, January 10",
637
638 "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "EdMMMy", "Wed, Jan 10, 2007",
639
640 "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "dMMMy", "Jan 10, 2007",
641
642 "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "dMMM", "Jan 10",
643
644 "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "MMMy", "Jan 2007",
645
646 "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "EdMMM", "Wed, Jan 10",
647
648
649 "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "dMy", "1/10/2007",
650
651 "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "dM", "1/10",
652
653 "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "My", "1/2007",
654
655 "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "EdM", "Wed, 1/10",
656
657 "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "d", "10",
658
659 "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "Ed", "10 Wed",
660
661 "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "y", "2007",
662
663 "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "M", "1",
664
665 "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "MMM", "Jan",
666
667 "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "MMMM", "January",
668
669 "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "hm", "10:00 AM \\u2013 2:10 PM",
670 "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "Hm", "10:00\\u201314:10",
671
672 "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "hmv", "10:00 AM \\u2013 2:10 PM PT",
673
674 "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "hmz", "10:00 AM \\u2013 2:10 PM PST",
675
676 "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "h", "10 AM \\u2013 2 PM",
677 "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "H", "10\\u201314",
678
679
680 "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "hz", "10 AM \\u2013 2 PM PST",
681
682 "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "EEddMMyyyy", "Wed, 01/10/2007",
683
684 "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "EddMMy", "Wed, 01/10/2007",
685
686 "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "hhmm", "10:00 AM \\u2013 2:10 PM",
687 "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "HHmm", "10:00\\u201314:10",
688
689 "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "hhmmzz", "10:00 AM \\u2013 2:10 PM PST",
690
691 "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "hms", "10:00:10 AM \\u2013 2:10:10 PM",
692 "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "Hms", "10:00:10 \\u2013 14:10:10",
693
694 "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "dMMMMMy", "J 10, 2007",
695
696 "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "EEEEEdM", "W, 1/10",
697 "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "dMMMMy", "January 10, 2007",
698
699 "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "dMMMM", "January 10",
700
701 "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "MMMMy", "January 2007",
702
703 "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "EEEEdMMMM", "Wednesday, January 10",
704
705 "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "EdMMMy", "Wed, Jan 10, 2007",
706
707 "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "dMMMy", "Jan 10, 2007",
708
709 "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "dMMM", "Jan 10",
710
711
712 "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "EdMMM", "Wed, Jan 10",
713
714 "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "EdMy", "Wed, 1/10/2007",
715
716 "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "dMy", "1/10/2007",
717
718
719 "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "My", "1/2007",
720
721 "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "EdM", "Wed, 1/10",
722
723 "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "d", "10",
724
725
726 "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "y", "2007",
727
728 "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "M", "1",
729
730
731
732 "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "hm", "10:00\\u201310:20 AM",
733 "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "Hm", "10:00\\u201310:20",
734
735
736 "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "hmz", "10:00\\u201310:20 AM PST",
737
738
739 "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "hv", "10 AM PT",
740
741
742
743 "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "EddMMy", "Wed, 01/10/2007",
744
745 "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "hhmm", "10:00\\u201310:20 AM",
746 "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "HHmm", "10:00\\u201310:20",
747
748 "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "hhmmzz", "10:00\\u201310:20 AM PST",
749
750
751 "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "dMMMMMy", "J 10, 2007",
752
753
754 "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "EEEEdMMMMy", "Wednesday, January 10, 2007",
755
756 "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "dMMMMy", "January 10, 2007",
757
758
759 "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "MMMMy", "January 2007",
760
761 "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "EEEEdMMMM", "Wednesday, January 10",
762
763
764 "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "dMMMy", "Jan 10, 2007",
765
766 "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "dMMM", "Jan 10",
767
768
769 "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "EdMMM", "Wed, Jan 10",
770
771 "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "EdMy", "Wed, 1/10/2007",
772
773 "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "dMy", "1/10/2007",
774
775
776 "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "My", "1/2007",
777
778 "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "EdM", "Wed, 1/10",
779
780 "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "d", "10",
781
782
783 "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "y", "2007",
784
785 "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "M", "1",
786
787
788 "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "MMMM", "January",
789
790 "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "hm", "10:10 AM",
791 "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "Hm", "10:10",
792
793
794 "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "hmz", "10:10 AM PST",
795
796 "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "h", "10 AM",
797
798 "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "hv", "10 AM PT",
799
800
801 "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "EEddMMyyyy", "Wed, 01/10/2007",
802
803
804 "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "hhmm", "10:10 AM",
805 "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "HHmm", "10:10",
806
807 "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "hhmmzz", "10:10 AM PST",
808
809
810 "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "dMMMMMy", "J 10, 2007",
811
812 "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "EEEEEdM", "W, 1/10",
813
814 "zh", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "EEEEdMMMMy", "2007\\u5e7410\\u670810\\u65e5\\u661f\\u671f\\u4e09\\u81f32008\\u5e7410\\u670810\\u65e5\\u661f\\u671f\\u4e94",
815
816
817 "zh", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "dMMMMy", "2007\\u5e7410\\u670810\\u65e5\\u81f311\\u670810\\u65e5",
818
819
820 "zh", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "MMMMy", "2007\\u5e7410\\u6708\\u81f311\\u6708",
821
822
823 // BEGIN android-change
824 "zh", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "hmv", "2007/10/10 \\u4E0A\\u534810:10 PT \\u2013 2007/11/10 \\u4E0A\\u534810:10 PT",
825 // END android-change
826
827 "zh", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "EEEEdMMMMy", "2007\\u5e7411\\u670810\\u65e5\\u661f\\u671f\\u516d\\u81f320\\u65e5\\u661f\\u671f\\u4e8c",
828
829
830 "zh", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "dMMMM", "11\\u670810\\u65e5\\u81f320\\u65e5",
831
832 "zh", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "MMMMy", "2007\\u5E7411\\u6708", // (fixed expected result per ticket:6626:)
833
834 "zh", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "EEEEdMMMM", "11\\u670810\\u65e5\\u661f\\u671f\\u516d\\u81f320\\u65e5\\u661f\\u671f\\u4e8c",
835
836
837 "zh", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "EdMy", "2007/11/10\\u5468\\u516d\\u81f32007/11/20\\u5468\\u4e8c",
838
839
840 "zh", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "dM", "11/10 \\u2013 11/20",
841
842 "zh", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "My", "2007/11",
843
844 "zh", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "EdM", "11/10\\u5468\\u516d\\u81f311/20\\u5468\\u4e8c",
845
846
847 "zh", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "y", "2007\\u5E74", // (fixed expected result per ticket:6626:)
848
849 "zh", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "M", "11\\u6708",
850
851 "zh", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "MMM", "11\\u6708", // (fixed expected result per ticket:6626: and others)
852
853
854 // BEGIN android-change
855 "zh", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "hmz", "2007/11/10 \\u4e0a\\u534810:10 PST \\u2013 2007/11/20 \\u4e0a\\u534810:10 PST",
856 // END android-change
857
858 "zh", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "h", "2007/11/10 \\u4e0a\\u534810\\u65f6 \\u2013 2007/11/20 \\u4e0a\\u534810\\u65f6",
859
860 "zh", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "EEEEdMMMMy", "2007\\u5e741\\u670810\\u65e5\\u661f\\u671f\\u4e09", // (fixed expected result per ticket:6626:)
861
862 "zh", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "hm", "\\u4e0a\\u534810:00\\u81f3\\u4e0b\\u53482:10",
863
864
865 // BEGIN android-change
866 "zh", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "hmz", "PST\\u4e0a\\u534810:00\\u81f3\\u4e0b\\u53482:10",
867 // END android-change
868
869 "zh", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "h", "\\u4e0a\\u534810\\u65F6\\u81f3\\u4e0b\\u53482\\u65f6",
870
871 // BEGIN android-change
872 "zh", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "hv", "PT\\u4E0A\\u534810\\u65F6\\u81F3\\u4E0B\\u53482\\u65F6",
873 // END android-change
874
875 "zh", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "hm", "\\u4e0a\\u534810:00\\u81f310:20",
876
877 // BEGIN android-change
878 "zh", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "hmv", "PT\\u4E0A\\u534810:00\\u81F310:20",
879 // END android-change
880
881 "zh", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "hz", "\\u4e0a\\u534810\\u65f6 PST",
882
883 "zh", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "hm", "\\u4e0a\\u534810:10",
884
885 "zh", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "h", "\\u4e0a\\u534810\\u65f6",
886
887 "de", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "EEEEdMMMy", "Mittwoch, 10. Okt. 2007 - Freitag, 10. Okt. 2008",
888
889
890 "de", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "dMMM", "10. Okt. 2007 - 10. Okt. 2008",
891
892 "de", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "MMMy", "Okt. 2007 - Okt. 2008",
893
894
895 "de", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "EdMy", "Mi., 10.10.2007 - Fr., 10.10.2008",
896
897 "de", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "dMy", "10.10.2007 - 10.10.2008",
898
899
900 "de", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "My", "10.2007 - 10.2008",
901
902 "de", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "EdM", "Mi., 10.10.2007 - Fr., 10.10.2008",
903
904
905 "de", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "y", "2007-2008",
906
907 "de", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "M", "10.2007 - 10.2008",
908
909
910 "de", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "hm", "10.10.2007 10:10 vorm. - 10.10.2008 10:10 vorm.",
911 "de", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "Hm", "10.10.2007 10:10 - 10.10.2008 10:10",
912
913 "de", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "EEEEdMMMy", "Mittwoch, 10. Okt. - Samstag, 10. Nov. 2007",
914
915
916 "de", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "dMMM", "10. Okt. - 10. Nov.",
917
918 "de", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "MMMy", "Okt.-Nov. 2007",
919
920 "de", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "EEEEdMMM", "Mittwoch, 10. Okt. - Samstag, 10. Nov.",
921
922
923 "de", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "dM", "10.10. - 10.11.",
924
925 "de", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "My", "10.2007 - 11.2007",
926
927
928 "de", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "d", "10.10. - 10.11.",
929
930 "de", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "y", "2007",
931
932
933 "de", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "MMM", "Okt.-Nov.",
934
935
936 "de", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "hms", "10.10.2007 10:10:10 vorm. - 10.11.2007 10:10:10 vorm.",
937 "de", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "Hms", "10.10.2007 10:10:10 - 10.11.2007 10:10:10",
938
939 "de", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "EEEEdMMMy", "Samstag, 10. - Dienstag, 20. Nov. 2007",
940
941 "de", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "dMMMy", "10.-20. Nov. 2007",
942
943
944 "de", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "MMMy", "Nov. 2007",
945
946 "de", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "EEEEdMMM", "Samstag, 10. - Dienstag, 20. Nov.",
947
948 "de", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "EdMy", "Sa., 10.11.2007 - Di., 20.11.2007",
949
950
951 "de", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "dM", "10.11. - 20.11.",
952
953 "de", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "My", "11.2007",
954
955
956 "de", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "d", "10.-20.",
957
958 "de", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "y", "2007",
959
960
961 // BEGIN android-change
962 "de", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "hmv", "10.11.2007 10:10 vorm. PT - 20.11.2007 10:10 vorm. PT",
963 // END android-change
964
965 "de", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "EEEEdMMMy", "Mittwoch, 10. Jan. 2007",
966
967
968 "de", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "dMMM", "10. Jan.",
969
970 "de", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "MMMy", "Jan. 2007",
971
972 "de", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "EEEEdMMM", "Mittwoch, 10. Jan.",
973
974
975 "de", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "h", "10 vorm. - 2 nachm.",
976 "de", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "H", "10-14 Uhr",
977
978 "de", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "EEEEdMMM", "Mittwoch, 10. Jan.",
979
980
981 // BEGIN android-change
982 "de", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "hmv", "10:00-10:20 vorm. PT",
983
984 "de", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "hmz", "10:00-10:20 vorm. PST",
985 // END android-change
986
987 "de", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "h", "10 vorm.",
988 "de", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "H", "10 Uhr",
989
990
991 // BEGIN android-change
992 "de", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "hz", "10 vorm. PST",
993 // END android-change
994
995 "de", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "EEEEdMMMy", "Mittwoch, 10. Jan. 2007",
996
997
998 // BEGIN android-change
999 "de", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "hmv", "10:10 vorm. PT",
1000
1001 "de", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "hmz", "10:10 vorm. PST",
1002
1003
1004 "de", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "hv", "10 vorm. PT",
1005
1006 "de", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "hz", "10 vorm. PST",
1007 // END android-change
1008
1009 // Thai (default calendar buddhist)
1010
1011 "th", "2550 10 10 10:10:10", "2551 10 10 10:10:10", "EEEEdMMMy", "\\u0E27\\u0E31\\u0E19\\u0E1E\\u0E38\\u0E18 10 \\u0E15.\\u0E04. 2550 - \\u0E27\\u0E31\\u0E19\\u0E28\\u0E38\\u0E01\\u0E23\\u0E4C 10 \\u0E15.\\u0E04. 2551",
1012
1013
1014 "th", "2550 10 10 10:10:10", "2551 10 10 10:10:10", "dMMM", "10 \\u0E15.\\u0E04. 2550 - 10 \\u0E15.\\u0E04. 2551",
1015
1016 "th", "2550 10 10 10:10:10", "2551 10 10 10:10:10", "MMMy", "\\u0E15.\\u0E04. 2550 - \\u0E15.\\u0E04. 2551",
1017
1018
1019 "th", "2550 10 10 10:10:10", "2551 10 10 10:10:10", "EdMy", "\\u0E1E. 10/10/2550 - \\u0E28. 10/10/2551",
1020
1021 "th", "2550 10 10 10:10:10", "2551 10 10 10:10:10", "dMy", "10/10/2550 - 10/10/2551",
1022
1023
1024 "th", "2550 10 10 10:10:10", "2551 10 10 10:10:10", "My", "10/2550 - 10/2551",
1025
1026 "th", "2550 10 10 10:10:10", "2551 10 10 10:10:10", "EdM", "\\u0E1E. 10/10/2550 - \\u0E28. 10/10/2551",
1027
1028
1029 "th", "2550 10 10 10:10:10", "2551 10 10 10:10:10", "y", "2550-2551",
1030
1031 "th", "2550 10 10 10:10:10", "2551 10 10 10:10:10", "M", "10/2550 - 10/2551",
1032
1033
1034 "th", "2550 10 10 10:10:10", "2550 11 10 10:10:10", "EEEEdMMMy", "\\u0E27\\u0E31\\u0E19\\u0E1E\\u0E38\\u0E18 10 \\u0E15.\\u0E04. - \\u0E27\\u0E31\\u0E19\\u0E40\\u0E2A\\u0E32\\u0E23\\u0E4C 10 \\u0E1E.\\u0E22. 2550",
1035
1036
1037 "th", "2550 10 10 10:10:10", "2550 11 10 10:10:10", "dMMM", "10 \\u0E15.\\u0E04. - 10 \\u0E1E.\\u0E22.",
1038
1039 "th", "2550 10 10 10:10:10", "2550 11 10 10:10:10", "MMMy", "\\u0E15.\\u0E04.-\\u0E1E.\\u0E22. 2550",
1040
1041 "th", "2550 10 10 10:10:10", "2550 11 10 10:10:10", "dM", "10/10 - 10/11",
1042
1043 "th", "2550 10 10 10:10:10", "2550 11 10 10:10:10", "My", "10/2550 - 11/2550",
1044
1045
1046 "th", "2550 10 10 10:10:10", "2550 11 10 10:10:10", "d", "10/10 - 10/11",
1047
1048 "th", "2550 10 10 10:10:10", "2550 11 10 10:10:10", "y", "\\u0E1E.\\u0E28. 2550",
1049
1050
1051 "th", "2550 10 10 10:10:10", "2550 11 10 10:10:10", "MMM", "\\u0E15.\\u0E04.-\\u0E1E.\\u0E22.",
1052
1053 };
1054 expect(DATA, ARRAY_SIZE(DATA));
1055 }
1056
1057
expect(const char ** data,int32_t data_length)1058 void DateIntervalFormatTest::expect(const char** data, int32_t data_length) {
1059 int32_t i = 0;
1060 UErrorCode ec = U_ZERO_ERROR;
1061 UnicodeString str, str2;
1062 const char* pattern = data[0];
1063 i++;
1064
1065 #ifdef DTIFMTTS_DEBUG
1066 char result[1000];
1067 char mesg[1000];
1068 sprintf(mesg, "locale: %s\n", locName);
1069 PRINTMESG(mesg);
1070 #endif
1071
1072 while (i<data_length) {
1073 const char* locName = data[i++];
1074 Locale loc(locName);
1075 SimpleDateFormat ref(pattern, loc, ec);
1076 if (U_FAILURE(ec)) {
1077 dataerrln("contruct SimpleDateFormat in expect failed: %s", u_errorName(ec));
1078 return;
1079 }
1080 // 'f'
1081 const char* datestr = data[i++];
1082 const char* datestr_2 = data[i++];
1083 #ifdef DTIFMTTS_DEBUG
1084 sprintf(mesg, "original date: %s - %s\n", datestr, datestr_2);
1085 PRINTMESG(mesg)
1086 #endif
1087 UDate date = ref.parse(ctou(datestr), ec);
1088 if (!assertSuccess("parse 1st data in expect", ec)) return;
1089 UDate date_2 = ref.parse(ctou(datestr_2), ec);
1090 if (!assertSuccess("parse 2nd data in expect", ec)) return;
1091 DateInterval dtitv(date, date_2);
1092
1093 const UnicodeString& oneSkeleton = data[i++];
1094
1095 DateIntervalFormat* dtitvfmt = DateIntervalFormat::createInstance(oneSkeleton, loc, ec);
1096 if (!assertSuccess("createInstance(skeleton) in expect", ec)) return;
1097 FieldPosition pos=0;
1098 dtitvfmt->format(&dtitv, str.remove(), pos, ec);
1099 if (!assertSuccess("format in expect", ec)) return;
1100 assertEquals((UnicodeString)"\"" + locName + "\\" + oneSkeleton + "\\" + datestr + "\\" + datestr_2 + "\"", ctou(data[i++]), str);
1101
1102
1103
1104 #ifdef DTIFMTTS_DEBUG
1105 str.extract(0, str.length(), result, "UTF-8");
1106 sprintf(mesg, "interval date: %s\n", result);
1107 std::cout << "//";
1108 PRINTMESG(mesg)
1109 std::cout << "\"" << locName << "\", "
1110 << "\"" << datestr << "\", "
1111 << "\"" << datestr_2 << "\", ";
1112 printUnicodeString(oneSkeleton);
1113 printUnicodeString(str);
1114 std::cout << "\n\n";
1115 #endif
1116 delete dtitvfmt;
1117 }
1118 }
1119
1120
1121 /*
1122 * Test format using user defined DateIntervalInfo
1123 */
testFormatUserDII()1124 void DateIntervalFormatTest::testFormatUserDII() {
1125 // first item is date pattern
1126 const char* DATA[] = {
1127 "yyyy MM dd HH:mm:ss",
1128 "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "Oct 10, 2007 --- Oct 10, 2008",
1129
1130 "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "2007 Oct 10 - Nov 2007",
1131
1132 "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "Nov 10, 2007 --- Nov 20, 2007",
1133
1134 "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "Jan 10, 2007",
1135
1136 "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "Jan 10, 2007",
1137
1138 "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "Jan 10, 2007",
1139
1140 "zh", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "2007\\u5e7410\\u670810\\u65e5 --- 2008\\u5e7410\\u670810\\u65e5",
1141
1142 "zh", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "2007 10\\u6708 10 - 11\\u6708 2007",
1143
1144 "zh", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "2007\\u5e7411\\u670810\\u65e5 --- 2007\\u5e7411\\u670820\\u65e5",
1145
1146 "zh", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "2007\\u5e741\\u670810\\u65e5", // (fixed expected result per ticket:6626:)
1147
1148 "zh", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "2007\\u5e741\\u670810\\u65e5", // (fixed expected result per ticket:6626:)
1149
1150 "zh", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "2007\\u5e741\\u670810\\u65e5", // (fixed expected result per ticket:6626:)
1151
1152 "de", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "10. Okt. 2007 --- 10. Okt. 2008",
1153
1154
1155 "de", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "10. Nov. 2007 --- 20. Nov. 2007",
1156
1157 "de", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "10. Jan. 2007",
1158
1159 "de", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "10. Jan. 2007",
1160
1161
1162 "es", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "10 oct 2007 --- 10 oct 2008",
1163
1164 "es", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "2007 oct 10 - nov 2007",
1165
1166 "es", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "10 nov 2007 --- 20 nov 2007",
1167
1168 "es", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "10 ene 2007",
1169
1170 "es", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "10 ene 2007",
1171
1172 "es", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "10 ene 2007",
1173 };
1174 expectUserDII(DATA, ARRAY_SIZE(DATA));
1175 }
1176
1177
testSetIntervalPatternNoSideEffect()1178 void DateIntervalFormatTest::testSetIntervalPatternNoSideEffect() {
1179 UErrorCode ec = U_ZERO_ERROR;
1180 LocalPointer<DateIntervalInfo> dtitvinf(new DateIntervalInfo(ec));
1181 if (U_FAILURE(ec)) {
1182 errln("Failure encountered: %s", u_errorName(ec));
1183 return;
1184 }
1185 UnicodeString expected;
1186 dtitvinf->getIntervalPattern(ctou("yMd"), UCAL_DATE, expected, ec);
1187 dtitvinf->setIntervalPattern(ctou("yMd"), UCAL_DATE, ctou("M/d/y \\u2013 d"), ec);
1188 if (U_FAILURE(ec)) {
1189 errln("Failure encountered: %s", u_errorName(ec));
1190 return;
1191 }
1192 dtitvinf.adoptInstead(new DateIntervalInfo(ec));
1193 if (U_FAILURE(ec)) {
1194 errln("Failure encountered: %s", u_errorName(ec));
1195 return;
1196 }
1197 UnicodeString actual;
1198 dtitvinf->getIntervalPattern(ctou("yMd"), UCAL_DATE, actual, ec);
1199 if (U_FAILURE(ec)) {
1200 errln("Failure encountered: %s", u_errorName(ec));
1201 return;
1202 }
1203 if (expected != actual) {
1204 errln("DateIntervalInfo.setIntervalPattern should have no side effects.");
1205 }
1206 }
1207
1208
expectUserDII(const char ** data,int32_t data_length)1209 void DateIntervalFormatTest::expectUserDII(const char** data,
1210 int32_t data_length) {
1211 int32_t i = 0;
1212 UnicodeString str;
1213 UErrorCode ec = U_ZERO_ERROR;
1214 const char* pattern = data[0];
1215 i++;
1216
1217 while ( i < data_length ) {
1218 const char* locName = data[i++];
1219 Locale loc(locName);
1220 SimpleDateFormat ref(pattern, loc, ec);
1221 if (U_FAILURE(ec)) {
1222 dataerrln("contruct SimpleDateFormat in expectUserDII failed: %s", u_errorName(ec));
1223 return;
1224 }
1225 const char* datestr = data[i++];
1226 const char* datestr_2 = data[i++];
1227 UDate date = ref.parse(ctou(datestr), ec);
1228 if (!assertSuccess("parse in expectUserDII", ec)) return;
1229 UDate date_2 = ref.parse(ctou(datestr_2), ec);
1230 if (!assertSuccess("parse in expectUserDII", ec)) return;
1231 DateInterval dtitv(date, date_2);
1232
1233 ec = U_ZERO_ERROR;
1234 // test user created DateIntervalInfo
1235 DateIntervalInfo* dtitvinf = new DateIntervalInfo(ec);
1236 dtitvinf->setFallbackIntervalPattern("{0} --- {1}", ec);
1237 dtitvinf->setIntervalPattern(UDAT_YEAR_ABBR_MONTH_DAY, UCAL_MONTH, "yyyy MMM d - MMM y",ec);
1238 if (!assertSuccess("DateIntervalInfo::setIntervalPattern", ec)) return;
1239 dtitvinf->setIntervalPattern(UDAT_YEAR_ABBR_MONTH_DAY, UCAL_HOUR_OF_DAY, "yyyy MMM d HH:mm - HH:mm", ec);
1240 if (!assertSuccess("DateIntervalInfo::setIntervalPattern", ec)) return;
1241 DateIntervalFormat* dtitvfmt = DateIntervalFormat::createInstance(UDAT_YEAR_ABBR_MONTH_DAY, loc, *dtitvinf, ec);
1242 delete dtitvinf;
1243 if (!assertSuccess("createInstance(skeleton,dtitvinf) in expectUserDII", ec)) return;
1244 FieldPosition pos=0;
1245 dtitvfmt->format(&dtitv, str.remove(), pos, ec);
1246 if (!assertSuccess("format in expectUserDII", ec)) return;
1247 assertEquals((UnicodeString)"\"" + locName + "\\" + datestr + "\\" + datestr_2 + "\"", ctou(data[i++]), str);
1248 #ifdef DTIFMTTS_DEBUG
1249 char result[1000];
1250 char mesg[1000];
1251 PRINTMESG("interval format using user defined DateIntervalInfo\n");
1252 str.extract(0, str.length(), result, "UTF-8");
1253 sprintf(mesg, "interval date: %s\n", result);
1254 PRINTMESG(mesg);
1255 #endif
1256 delete dtitvfmt;
1257 }
1258 }
1259
1260
testStress()1261 void DateIntervalFormatTest::testStress() {
1262 if(quick){
1263 logln("Quick mode: Skipping test");
1264 return;
1265 }
1266 const char* DATA[] = {
1267 "yyyy MM dd HH:mm:ss",
1268 "2007 10 10 10:10:10", "2008 10 10 10:10:10",
1269 "2007 10 10 10:10:10", "2007 11 10 10:10:10",
1270 "2007 11 10 10:10:10", "2007 11 20 10:10:10",
1271 "2007 01 10 10:00:10", "2007 01 10 14:10:10",
1272 "2007 01 10 10:00:10", "2007 01 10 10:20:10",
1273 "2007 01 10 10:10:10", "2007 01 10 10:10:20",
1274 };
1275
1276 const char* testLocale[][3] = {
1277 //{"th", "", ""},
1278 {"en", "", ""},
1279 {"zh", "", ""},
1280 {"de", "", ""},
1281 {"ar", "", ""},
1282 {"en", "GB", ""},
1283 {"fr", "", ""},
1284 {"it", "", ""},
1285 {"nl", "", ""},
1286 {"zh", "TW", ""},
1287 {"ja", "", ""},
1288 {"pt", "BR", ""},
1289 {"ru", "", ""},
1290 {"pl", "", ""},
1291 {"tr", "", ""},
1292 {"es", "", ""},
1293 {"ko", "", ""},
1294 {"sv", "", ""},
1295 {"fi", "", ""},
1296 {"da", "", ""},
1297 {"pt", "PT", ""},
1298 {"ro", "", ""},
1299 {"hu", "", ""},
1300 {"he", "", ""},
1301 {"in", "", ""},
1302 {"cs", "", ""},
1303 {"el", "", ""},
1304 {"no", "", ""},
1305 {"vi", "", ""},
1306 {"bg", "", ""},
1307 {"hr", "", ""},
1308 {"lt", "", ""},
1309 {"sk", "", ""},
1310 {"sl", "", ""},
1311 {"sr", "", ""},
1312 {"ca", "", ""},
1313 {"lv", "", ""},
1314 {"uk", "", ""},
1315 {"hi", "", ""},
1316 };
1317
1318 uint32_t localeIndex;
1319 for ( localeIndex = 0; localeIndex < ARRAY_SIZE(testLocale); ++localeIndex ) {
1320 char locName[32];
1321 uprv_strcpy(locName, testLocale[localeIndex][0]);
1322 uprv_strcat(locName, testLocale[localeIndex][1]);
1323 stress(DATA, ARRAY_SIZE(DATA), Locale(testLocale[localeIndex][0], testLocale[localeIndex][1], testLocale[localeIndex][2]), locName);
1324 }
1325 }
1326
1327
stress(const char ** data,int32_t data_length,const Locale & loc,const char * locName)1328 void DateIntervalFormatTest::stress(const char** data, int32_t data_length,
1329 const Locale& loc, const char* locName) {
1330 UnicodeString skeleton[] = {
1331 "EEEEdMMMMy",
1332 "dMMMMy",
1333 "dMMMM",
1334 "MMMMy",
1335 "EEEEdMMMM",
1336 "EdMMMy",
1337 "dMMMy",
1338 "dMMM",
1339 "MMMy",
1340 "EdMMM",
1341 "EdMy",
1342 "dMy",
1343 "dM",
1344 "My",
1345 "EdM",
1346 "d",
1347 "Ed",
1348 "y",
1349 "M",
1350 "MMM",
1351 "MMMM",
1352 "hm",
1353 "hmv",
1354 "hmz",
1355 "h",
1356 "hv",
1357 "hz",
1358 "EEddMMyyyy", // following could be normalized
1359 "EddMMy",
1360 "hhmm",
1361 "hhmmzz",
1362 "hms", // following could not be normalized
1363 "dMMMMMy",
1364 "EEEEEdM",
1365 };
1366
1367 int32_t i = 0;
1368 UErrorCode ec = U_ZERO_ERROR;
1369 UnicodeString str, str2;
1370 SimpleDateFormat ref(data[i++], loc, ec);
1371 if (!assertSuccess("construct SimpleDateFormat", ec)) return;
1372
1373 #ifdef DTIFMTTS_DEBUG
1374 char result[1000];
1375 char mesg[1000];
1376 sprintf(mesg, "locale: %s\n", locName);
1377 PRINTMESG(mesg);
1378 #endif
1379
1380 while (i<data_length) {
1381
1382 // 'f'
1383 const char* datestr = data[i++];
1384 const char* datestr_2 = data[i++];
1385 #ifdef DTIFMTTS_DEBUG
1386 sprintf(mesg, "original date: %s - %s\n", datestr, datestr_2);
1387 PRINTMESG(mesg)
1388 #endif
1389 UDate date = ref.parse(ctou(datestr), ec);
1390 if (!assertSuccess("parse", ec)) return;
1391 UDate date_2 = ref.parse(ctou(datestr_2), ec);
1392 if (!assertSuccess("parse", ec)) return;
1393 DateInterval dtitv(date, date_2);
1394
1395 for ( uint32_t skeletonIndex = 0;
1396 skeletonIndex < ARRAY_SIZE(skeleton);
1397 ++skeletonIndex ) {
1398 const UnicodeString& oneSkeleton = skeleton[skeletonIndex];
1399 DateIntervalFormat* dtitvfmt = DateIntervalFormat::createInstance(oneSkeleton, loc, ec);
1400 if (!assertSuccess("createInstance(skeleton)", ec)) return;
1401 /*
1402 // reset the calendar to be Gregorian calendar for "th"
1403 if ( uprv_strcmp(locName, "th") == 0 ) {
1404 GregorianCalendar* gregCal = new GregorianCalendar(loc, ec);
1405 if (!assertSuccess("GregorianCalendar()", ec)) return;
1406 const DateFormat* dformat = dtitvfmt->getDateFormat();
1407 DateFormat* newOne = (DateFormat*)dformat->clone();
1408 newOne->adoptCalendar(gregCal);
1409 //dtitvfmt->adoptDateFormat(newOne, ec);
1410 dtitvfmt->setDateFormat(*newOne, ec);
1411 delete newOne;
1412 if (!assertSuccess("adoptDateFormat()", ec)) return;
1413 }
1414 */
1415 FieldPosition pos=0;
1416 dtitvfmt->format(&dtitv, str.remove(), pos, ec);
1417 if (!assertSuccess("format", ec)) return;
1418 #ifdef DTIFMTTS_DEBUG
1419 oneSkeleton.extract(0, oneSkeleton.length(), result, "UTF-8");
1420 sprintf(mesg, "interval by skeleton: %s\n", result);
1421 PRINTMESG(mesg)
1422 str.extract(0, str.length(), result, "UTF-8");
1423 sprintf(mesg, "interval date: %s\n", result);
1424 PRINTMESG(mesg)
1425 #endif
1426 delete dtitvfmt;
1427 }
1428
1429 // test user created DateIntervalInfo
1430 ec = U_ZERO_ERROR;
1431 DateIntervalInfo* dtitvinf = new DateIntervalInfo(ec);
1432 dtitvinf->setFallbackIntervalPattern("{0} --- {1}", ec);
1433 dtitvinf->setIntervalPattern(UDAT_YEAR_ABBR_MONTH_DAY, UCAL_MONTH, "yyyy MMM d - MMM y",ec);
1434 if (!assertSuccess("DateIntervalInfo::setIntervalPattern", ec)) return;
1435 dtitvinf->setIntervalPattern(UDAT_YEAR_ABBR_MONTH_DAY, UCAL_HOUR_OF_DAY, "yyyy MMM d HH:mm - HH:mm", ec);
1436 if (!assertSuccess("DateIntervalInfo::setIntervalPattern", ec)) return;
1437 DateIntervalFormat* dtitvfmt = DateIntervalFormat::createInstance(UDAT_YEAR_ABBR_MONTH_DAY, loc, *dtitvinf, ec);
1438 delete dtitvinf;
1439 if (!assertSuccess("createInstance(skeleton,dtitvinf)", ec)) return;
1440 FieldPosition pos=0;
1441 dtitvfmt->format(&dtitv, str.remove(), pos, ec);
1442 if ( uprv_strcmp(locName, "th") ) {
1443 if (!assertSuccess("format", ec)) return;
1444 #ifdef DTIFMTTS_DEBUG
1445 PRINTMESG("interval format using user defined DateIntervalInfo\n");
1446 str.extract(0, str.length(), result, "UTF-8");
1447 sprintf(mesg, "interval date: %s\n", result);
1448 PRINTMESG(mesg)
1449 #endif
1450 } else {
1451 // for "th", the default calendar is Budhist,
1452 // not Gregorian.
1453 assertTrue("Default calendar for \"th\" is Budhist", ec == U_ILLEGAL_ARGUMENT_ERROR);
1454 ec = U_ZERO_ERROR;
1455 }
1456 delete dtitvfmt;
1457 }
1458 }
1459
1460 #endif /* #if !UCONFIG_NO_FORMATTING */
1461