]> git.saurik.com Git - apple/icu.git/blob - icuSources/test/intltest/dtifmtts.cpp
ICU-66108.tar.gz
[apple/icu.git] / icuSources / test / intltest / dtifmtts.cpp
1 // © 2016 and later: Unicode, Inc. and others.
2 // License & terms of use: http://www.unicode.org/copyright.html
3 /********************************************************************
4 * COPYRIGHT:
5 * Copyright (c) 1997-2016, International Business Machines Corporation and
6 * others. All Rights Reserved.
7 ********************************************************************/
8
9 #include "unicode/utypes.h"
10
11 #if !UCONFIG_NO_FORMATTING
12
13
14 //TODO: define it in compiler flag
15 //#define DTIFMTTS_DEBUG 1
16
17
18 #ifdef DTIFMTTS_DEBUG
19 #include <iostream>
20 #endif
21
22 #include "dtifmtts.h"
23
24 #include "cmemory.h"
25 #include "cstr.h"
26 #include "cstring.h"
27 #include "simplethread.h"
28 #include "japancal.h"
29 #include "unicode/gregocal.h"
30 #include "unicode/dtintrv.h"
31 #include "unicode/dtitvinf.h"
32 #include "unicode/dtitvfmt.h"
33 #include "unicode/localpointer.h"
34 #include "unicode/timezone.h"
35
36
37
38 #ifdef DTIFMTTS_DEBUG
39 //#define PRINTMESG(msg) { std::cout << "(" << __FILE__ << ":" << __LINE__ << ") " << msg << "\n"; }
40 #define PRINTMESG(msg) { std::cout << msg; }
41 #endif
42
43 #include <stdio.h>
44
45
46 void DateIntervalFormatTest::runIndexedTest( int32_t index, UBool exec, const char* &name, char* /*par*/ ) {
47 if (exec) logln("TestSuite DateIntervalFormat");
48 switch (index) {
49 TESTCASE(0, testAPI);
50 TESTCASE(1, testFormat);
51 TESTCASE(2, testFormatUserDII);
52 TESTCASE(3, testSetIntervalPatternNoSideEffect);
53 TESTCASE(4, testYearFormats);
54 TESTCASE(5, testStress);
55 TESTCASE(6, testTicket11583_2);
56 TESTCASE(7, testTicket11985);
57 TESTCASE(8, testTicket11669);
58 TESTCASE(9, testTicket12065);
59 TESTCASE(10, testFormattedDateInterval);
60 TESTCASE(11, testCreateInstanceForAllLocales);
61 default: name = ""; break;
62 }
63 }
64
65 /**
66 * Test various generic API methods of DateIntervalFormat for API coverage.
67 */
68 void DateIntervalFormatTest::testAPI() {
69
70 /* ====== Test create interval instance with default locale and skeleton
71 */
72 UErrorCode status = U_ZERO_ERROR;
73 logln("Testing DateIntervalFormat create instance with default locale and skeleton");
74
75 DateIntervalFormat* dtitvfmt = DateIntervalFormat::createInstance(UDAT_YEAR_MONTH_DAY, status);
76 if(U_FAILURE(status)) {
77 dataerrln("ERROR: Could not create DateIntervalFormat (skeleton + default locale) - exitting");
78 return;
79 } else {
80 delete dtitvfmt;
81 }
82
83
84 /* ====== Test create interval instance with given locale and skeleton
85 */
86 status = U_ZERO_ERROR;
87 logln("Testing DateIntervalFormat create instance with given locale and skeleton");
88
89 dtitvfmt = DateIntervalFormat::createInstance(UDAT_YEAR_MONTH_DAY, Locale::getJapanese(), status);
90 if(U_FAILURE(status)) {
91 dataerrln("ERROR: Could not create DateIntervalFormat (skeleton + locale) - exitting");
92 return;
93 } else {
94 delete dtitvfmt;
95 }
96
97
98 /* ====== Test create interval instance with dateIntervalInfo and skeleton
99 */
100 status = U_ZERO_ERROR;
101 logln("Testing DateIntervalFormat create instance with dateIntervalInfo and skeleton");
102
103 DateIntervalInfo* dtitvinf = new DateIntervalInfo(Locale::getSimplifiedChinese(), status);
104
105 dtitvfmt = DateIntervalFormat::createInstance("EEEdMMMyhms", *dtitvinf, status);
106 delete dtitvinf;
107
108 if(U_FAILURE(status)) {
109 dataerrln("ERROR: Could not create DateIntervalFormat (skeleton + DateIntervalInfo + default locale) - exitting");
110 return;
111 } else {
112 delete dtitvfmt;
113 }
114
115
116 /* ====== Test create interval instance with dateIntervalInfo and skeleton
117 */
118 status = U_ZERO_ERROR;
119 logln("Testing DateIntervalFormat create instance with dateIntervalInfo and skeleton");
120
121 dtitvinf = new DateIntervalInfo(Locale::getSimplifiedChinese(), status);
122
123 dtitvfmt = DateIntervalFormat::createInstance("EEEdMMMyhms", Locale::getSimplifiedChinese(), *dtitvinf, status);
124 delete dtitvinf;
125 if(U_FAILURE(status)) {
126 dataerrln("ERROR: Could not create DateIntervalFormat (skeleton + DateIntervalInfo + locale) - exitting");
127 return;
128 }
129 // not deleted, test clone
130
131
132 // ====== Test clone()
133 status = U_ZERO_ERROR;
134 logln("Testing DateIntervalFormat clone");
135
136 DateIntervalFormat* another = dtitvfmt->clone();
137 if ( (*another) != (*dtitvfmt) ) {
138 dataerrln("%s:%d ERROR: clone failed", __FILE__, __LINE__);
139 }
140
141
142 // ====== Test getDateIntervalInfo, setDateIntervalInfo, adoptDateIntervalInfo
143 status = U_ZERO_ERROR;
144 logln("Testing DateIntervalFormat getDateIntervalInfo");
145 const DateIntervalInfo* inf = another->getDateIntervalInfo();
146 dtitvfmt->setDateIntervalInfo(*inf, status);
147 const DateIntervalInfo* anotherInf = dtitvfmt->getDateIntervalInfo();
148 if ( (*inf) != (*anotherInf) || U_FAILURE(status) ) {
149 dataerrln("ERROR: getDateIntervalInfo/setDateIntervalInfo failed");
150 }
151
152 {
153 // We make sure that setDateIntervalInfo does not corrupt the cache. See ticket 9919.
154 status = U_ZERO_ERROR;
155 logln("Testing DateIntervalFormat setDateIntervalInfo");
156 const Locale &enLocale = Locale::getEnglish();
157 LocalPointer<DateIntervalFormat> dif(DateIntervalFormat::createInstance("yMd", enLocale, status));
158 if (U_FAILURE(status)) {
159 errln("Failure encountered: %s", u_errorName(status));
160 return;
161 }
162 UnicodeString expected;
163 LocalPointer<Calendar> fromTime(Calendar::createInstance(enLocale, status));
164 LocalPointer<Calendar> toTime(Calendar::createInstance(enLocale, status));
165 if (U_FAILURE(status)) {
166 errln("Failure encountered: %s", u_errorName(status));
167 return;
168 }
169 FieldPosition pos(FieldPosition::DONT_CARE);
170 fromTime->set(2013, 3, 26);
171 toTime->set(2013, 3, 28);
172 dif->format(*fromTime, *toTime, expected, pos, status);
173 if (U_FAILURE(status)) {
174 errln("Failure encountered: %s", u_errorName(status));
175 return;
176 }
177 LocalPointer<DateIntervalInfo> dii(new DateIntervalInfo(Locale::getEnglish(), status), status);
178 if (U_FAILURE(status)) {
179 errln("Failure encountered: %s", u_errorName(status));
180 return;
181 }
182 dii->setIntervalPattern(ctou("yMd"), UCAL_DATE, ctou("M/d/y \\u2013 d"), status);
183 dif->setDateIntervalInfo(*dii, status);
184 if (U_FAILURE(status)) {
185 errln("Failure encountered: %s", u_errorName(status));
186 return;
187 }
188 dif.adoptInstead(DateIntervalFormat::createInstance("yMd", enLocale, status));
189 if (U_FAILURE(status)) {
190 errln("Failure encountered: %s", u_errorName(status));
191 return;
192 }
193 UnicodeString actual;
194 pos = 0;
195 dif->format(*fromTime, *toTime, actual, pos, status);
196 if (U_FAILURE(status)) {
197 errln("Failure encountered: %s", u_errorName(status));
198 return;
199 }
200 if (expected != actual) {
201 errln("DateIntervalFormat.setIntervalInfo should have no side effects.");
202 }
203 }
204
205 /*
206 status = U_ZERO_ERROR;
207 DateIntervalInfo* nonConstInf = inf->clone();
208 dtitvfmt->adoptDateIntervalInfo(nonConstInf, status);
209 anotherInf = dtitvfmt->getDateIntervalInfo();
210 if ( (*inf) != (*anotherInf) || U_FAILURE(status) ) {
211 dataerrln("ERROR: adoptDateIntervalInfo failed");
212 }
213 */
214
215 // ====== Test getDateFormat, setDateFormat, adoptDateFormat
216
217 status = U_ZERO_ERROR;
218 logln("Testing DateIntervalFormat getDateFormat");
219 /*
220 const DateFormat* fmt = another->getDateFormat();
221 dtitvfmt->setDateFormat(*fmt, status);
222 const DateFormat* anotherFmt = dtitvfmt->getDateFormat();
223 if ( (*fmt) != (*anotherFmt) || U_FAILURE(status) ) {
224 dataerrln("ERROR: getDateFormat/setDateFormat failed");
225 }
226
227 status = U_ZERO_ERROR;
228 DateFormat* nonConstFmt = fmt->clone();
229 dtitvfmt->adoptDateFormat(nonConstFmt, status);
230 anotherFmt = dtitvfmt->getDateFormat();
231 if ( (*fmt) != (*anotherFmt) || U_FAILURE(status) ) {
232 dataerrln("ERROR: adoptDateFormat failed");
233 }
234 delete fmt;
235 */
236
237
238 // ======= Test getStaticClassID()
239
240 logln("Testing getStaticClassID()");
241
242
243 if(dtitvfmt->getDynamicClassID() != DateIntervalFormat::getStaticClassID()) {
244 errln("ERROR: getDynamicClassID() didn't return the expected value");
245 }
246
247 delete another;
248
249 // ====== test constructor/copy constructor and assignment
250 /* they are protected, no test
251 logln("Testing DateIntervalFormat constructor and assigment operator");
252 status = U_ZERO_ERROR;
253
254 DateFormat* constFmt = dtitvfmt->getDateFormat()->clone();
255 inf = dtitvfmt->getDateIntervalInfo()->clone();
256
257
258 DateIntervalFormat* dtifmt = new DateIntervalFormat(fmt, inf, status);
259 if(U_FAILURE(status)) {
260 dataerrln("ERROR: Could not create DateIntervalFormat (default) - exitting");
261 return;
262 }
263
264 DateIntervalFormat* dtifmt2 = new(dtifmt);
265 if ( (*dtifmt) != (*dtifmt2) ) {
266 dataerrln("ERROR: Could not create DateIntervalFormat (default) - exitting");
267 return;
268 }
269
270 DateIntervalFormat dtifmt3 = (*dtifmt);
271 if ( (*dtifmt) != dtifmt3 ) {
272 dataerrln("ERROR: Could not create DateIntervalFormat (default) - exitting");
273 return;
274 }
275
276 delete dtifmt2;
277 delete dtifmt3;
278 delete dtifmt;
279 */
280
281
282 //===== test format and parse ==================
283 Formattable formattable;
284 formattable.setInt64(10);
285 UnicodeString res;
286 FieldPosition pos(FieldPosition::DONT_CARE);
287 status = U_ZERO_ERROR;
288 dtitvfmt->format(formattable, res, pos, status);
289 if ( status != U_ILLEGAL_ARGUMENT_ERROR ) {
290 dataerrln("ERROR: format non-date-interval object should set U_ILLEGAL_ARGUMENT_ERROR - exitting");
291 return;
292 }
293
294 DateInterval* dtitv = new DateInterval(3600*24*365, 3600*24*366);
295 formattable.adoptObject(dtitv);
296 res.remove();
297 pos = 0;
298 status = U_ZERO_ERROR;
299 dtitvfmt->format(formattable, res, pos, status);
300 if ( U_FAILURE(status) ) {
301 dataerrln("ERROR: format date interval failed - exitting");
302 return;
303 }
304
305 const DateFormat* dfmt = dtitvfmt->getDateFormat();
306 Calendar* fromCal = dfmt->getCalendar()->clone();
307 Calendar* toCal = dfmt->getCalendar()->clone();
308 res.remove();
309 pos = 0;
310 status = U_ZERO_ERROR;
311 dtitvfmt->format(*fromCal, *toCal, res, pos, status);
312 if ( U_FAILURE(status) ) {
313 dataerrln("ERROR: format date interval failed - exitting");
314 return;
315 }
316 delete fromCal;
317 delete toCal;
318
319
320 Formattable fmttable;
321 status = U_ZERO_ERROR;
322 // TODO: why do I need cast?
323 ((Format*)dtitvfmt)->parseObject(res, fmttable, status);
324 if ( status != U_INVALID_FORMAT_ERROR ) {
325 dataerrln("ERROR: parse should set U_INVALID_FORMAT_ERROR - exitting");
326 return;
327 }
328
329 delete dtitvfmt;
330
331 //====== test setting time zone
332 logln("Testing DateIntervalFormat set & format with different time zones, get time zone");
333 status = U_ZERO_ERROR;
334 dtitvfmt = DateIntervalFormat::createInstance("MMMdHHmm", Locale::getEnglish(), status);
335 if ( U_SUCCESS(status) ) {
336 UDate date1 = 1299090600000.0; // 2011-Mar-02 1030 in US/Pacific, 2011-Mar-03 0330 in Asia/Tokyo
337 UDate date2 = 1299115800000.0; // 2011-Mar-02 1730 in US/Pacific, 2011-Mar-03 1030 in Asia/Tokyo
338
339 DateInterval * dtitv12 = new DateInterval(date1, date2);
340 TimeZone * tzCalif = TimeZone::createTimeZone("US/Pacific");
341 TimeZone * tzTokyo = TimeZone::createTimeZone("Asia/Tokyo");
342 UnicodeString fmtCalif = UnicodeString(ctou("Mar 2, 10:30\\u2009\\u2013\\u200917:30")); // Apple data mod
343 UnicodeString fmtTokyo = UnicodeString(ctou("Mar 3, 03:30\\u2009\\u2013\\u200910:30")); // Apple data mod
344
345 dtitvfmt->adoptTimeZone(tzCalif);
346 res.remove();
347 pos = 0;
348 status = U_ZERO_ERROR;
349 dtitvfmt->format(dtitv12, res, pos, status);
350 if ( U_SUCCESS(status) ) {
351 if ( res.compare(fmtCalif) != 0 ) {
352 errln("ERROR: DateIntervalFormat::format for tzCalif, expect " + fmtCalif + ", get " + res);
353 }
354 } else {
355 errln("ERROR: DateIntervalFormat::format for tzCalif, status %s", u_errorName(status));
356 }
357
358 dtitvfmt->setTimeZone(*tzTokyo);
359 res.remove();
360 pos = 0;
361 status = U_ZERO_ERROR;
362 dtitvfmt->format(dtitv12, res, pos, status);
363 if ( U_SUCCESS(status) ) {
364 if ( res.compare(fmtTokyo) != 0 ) {
365 errln("ERROR: DateIntervalFormat::format for tzTokyo, expect " + fmtTokyo + ", get " + res);
366 }
367 } else {
368 errln("ERROR: DateIntervalFormat::format for tzTokyo, status %s", u_errorName(status));
369 }
370
371 if ( dtitvfmt->getTimeZone() != *tzTokyo ) {
372 errln("ERROR: DateIntervalFormat::getTimeZone returns mismatch.");
373 }
374
375 delete tzTokyo; // tzCalif was owned by dtitvfmt which should have deleted it
376 delete dtitv12;
377 delete dtitvfmt;
378 } else {
379 errln("ERROR: DateIntervalFormat::createInstance(\"MdHH\", Locale::getEnglish(), ...), status %s", u_errorName(status));
380 }
381 //====== test format in testFormat()
382
383 //====== test DateInterval class (better coverage)
384 DateInterval dtitv1(3600*24*365, 3600*24*366);
385 DateInterval dtitv2(dtitv1);
386
387 if (!(dtitv1 == dtitv2)) {
388 errln("ERROR: Copy constructor failed for DateInterval.");
389 }
390
391 DateInterval dtitv3(3600*365, 3600*366);
392 dtitv3 = dtitv1;
393 if (!(dtitv3 == dtitv1)) {
394 errln("ERROR: Equal operator failed for DateInterval.");
395 }
396
397 DateInterval *dtitv4 = dtitv1.clone();
398 if (*dtitv4 != dtitv1) {
399 errln("ERROR: Equal operator failed for DateInterval.");
400 }
401 delete dtitv4;
402 }
403
404
405 /**
406 * Test format
407 */
408 void DateIntervalFormatTest::testFormat() {
409 // first item is date pattern
410 // followed by a group of locale/from_data/to_data/skeleton/interval_data
411 // Note that from_data/to_data are specified using era names from root, for the calendar specified by locale.
412 const char* DATA[] = {
413 "GGGGG y MM dd HH:mm:ss", // pattern for from_data/to_data
414 // test root
415 "root", "CE 2007 11 10 10:10:10", "CE 2007 12 10 10:10:10", "yM", "2007-11 \\u2013 2007-12",
416
417 // test 'H' and 'h', using availableFormat in fallback
418 "en", "CE 2007 11 10 10:10:10", "CE 2007 11 10 15:10:10", "Hms", "10:10:10\\u2009\\u2013\\u200915:10:10",
419 "en", "CE 2007 11 10 10:10:10", "CE 2007 11 10 15:10:10", "hms", "10:10:10 AM\\u2009\\u2013\\u20093:10:10 PM",
420
421 "en", "CE 2007 10 10 10:10:10", "CE 2008 10 10 10:10:10", "MMMM", "October 2007\\u2009\\u2013\\u2009October 2008",
422 "en", "CE 2007 10 10 10:10:10", "CE 2008 10 10 10:10:10", "MMM", "Oct 2007\\u2009\\u2013\\u2009Oct 2008",
423 // test skeleton with both date and time
424 "en", "CE 2007 11 10 10:10:10", "CE 2007 11 20 10:10:10", "dMMMyhm", "Nov 10, 2007, 10:10 AM\\u2009\\u2013\\u2009Nov 20, 2007, 10:10 AM",
425
426 "en", "CE 2007 11 10 10:10:10", "CE 2007 11 10 11:10:10", "dMMMyhm", "Nov 10, 2007, 10:10\\u2009\\u2013\\u200911:10 AM",
427
428 "en", "CE 2007 11 10 10:10:10", "CE 2007 11 10 11:10:10", "hms", "10:10:10 AM\\u2009\\u2013\\u200911:10:10 AM",
429 "en", "CE 2007 11 10 10:10:10", "CE 2007 11 10 11:10:10", "Hms", "10:10:10\\u2009\\u2013\\u200911:10:10",
430 "en", "CE 2007 11 10 20:10:10", "CE 2007 11 10 21:10:10", "Hms", "20:10:10\\u2009\\u2013\\u200921:10:10",
431
432 "en", "CE 2007 10 10 10:10:10", "CE 2008 10 10 10:10:10", "EEEEdMMMMy", "Wednesday, October 10, 2007\\u2009\\u2013\\u2009Friday, October 10, 2008",
433
434 "en", "CE 2007 10 10 10:10:10", "CE 2008 10 10 10:10:10", "dMMMMy", "October 10, 2007\\u2009\\u2013\\u2009October 10, 2008",
435
436 "en", "CE 2007 10 10 10:10:10", "CE 2008 10 10 10:10:10", "dMMMM", "October 10, 2007\\u2009\\u2013\\u2009October 10, 2008",
437
438 "en", "CE 2007 10 10 10:10:10", "CE 2008 10 10 10:10:10", "MMMMy", "October 2007\\u2009\\u2013\\u2009October 2008",
439
440 "en", "CE 2007 10 10 10:10:10", "CE 2008 10 10 10:10:10", "EEEEdMMMM", "Wednesday, October 10, 2007\\u2009\\u2013\\u2009Friday, October 10, 2008",
441
442 "en", "CE 2007 10 10 10:10:10", "CE 2008 10 10 10:10:10", "EdMMMy", "Wed, Oct 10, 2007\\u2009\\u2013\\u2009Fri, Oct 10, 2008",
443
444 "en", "CE 2007 10 10 10:10:10", "CE 2008 10 10 10:10:10", "dMMMy", "Oct 10, 2007\\u2009\\u2013\\u2009Oct 10, 2008",
445
446 "en", "CE 2007 10 10 10:10:10", "CE 2008 10 10 10:10:10", "dMMM", "Oct 10, 2007\\u2009\\u2013\\u2009Oct 10, 2008",
447
448 "en", "CE 2007 10 10 10:10:10", "CE 2008 10 10 10:10:10", "MMMy", "Oct 2007\\u2009\\u2013\\u2009Oct 2008",
449
450 "en", "CE 2007 10 10 10:10:10", "CE 2008 10 10 10:10:10", "EdMMM", "Wed, Oct 10, 2007\\u2009\\u2013\\u2009Fri, Oct 10, 2008",
451
452 "en", "CE 2007 10 10 10:10:10", "CE 2008 10 10 10:10:10", "EdMy", "Wed, 10/10/2007\\u2009\\u2013\\u2009Fri, 10/10/2008",
453
454 "en", "CE 2007 10 10 10:10:10", "CE 2008 10 10 10:10:10", "dMy", "10/10/2007\\u2009\\u2013\\u200910/10/2008",
455
456 "en", "CE 2007 10 10 10:10:10", "CE 2008 10 10 10:10:10", "dM", "10/10/2007\\u2009\\u2013\\u200910/10/2008",
457
458 "en", "CE 2007 10 10 10:10:10", "CE 2008 10 10 10:10:10", "My", "10/2007\\u2009\\u2013\\u200910/2008",
459
460 "en", "CE 2007 10 10 10:10:10", "CE 2008 10 10 10:10:10", "EdM", "Wed, 10/10/2007\\u2009\\u2013\\u2009Fri, 10/10/2008",
461
462 "en", "CE 2007 10 10 10:10:10", "CE 2008 10 10 10:10:10", "d", "10/10/2007\\u2009\\u2013\\u200910/10/2008",
463
464 "en", "CE 2007 10 10 10:10:10", "CE 2008 10 10 10:10:10", "Ed", "10 Wed\\u2009\\u2013\\u200910 Fri",
465
466 "en", "CE 2007 10 10 10:10:10", "CE 2008 10 10 10:10:10", "y", "2007\\u2009\\u2013\\u20092008",
467
468 "en", "CE 2007 10 10 10:10:10", "CE 2008 10 10 10:10:10", "M", "10/2007\\u2009\\u2013\\u200910/2008",
469
470
471
472 "en", "CE 2007 10 10 10:10:10", "CE 2008 10 10 10:10:10", "hm", "10/10/2007, 10:10 AM\\u2009\\u2013\\u200910/10/2008, 10:10 AM",
473 "en", "CE 2007 10 10 10:10:10", "CE 2008 10 10 10:10:10", "Hm", "10/10/2007, 10:10\\u2009\\u2013\\u200910/10/2008, 10:10",
474 "en", "CE 2007 10 10 20:10:10", "CE 2008 10 10 20:10:10", "Hm", "10/10/2007, 20:10\\u2009\\u2013\\u200910/10/2008, 20:10",
475
476 "en", "CE 2007 10 10 10:10:10", "CE 2008 10 10 10:10:10", "hmv", "10/10/2007, 10:10 AM PT\\u2009\\u2013\\u200910/10/2008, 10:10 AM PT",
477
478 "en", "CE 2007 10 10 10:10:10", "CE 2008 10 10 10:10:10", "hmz", "10/10/2007, 10:10 AM PDT\\u2009\\u2013\\u200910/10/2008, 10:10 AM PDT",
479
480 "en", "CE 2007 10 10 10:10:10", "CE 2008 10 10 10:10:10", "h", "10/10/2007, 10 AM\\u2009\\u2013\\u200910/10/2008, 10 AM",
481
482 "en", "CE 2007 10 10 10:10:10", "CE 2008 10 10 10:10:10", "hv", "10/10/2007, 10 AM PT\\u2009\\u2013\\u200910/10/2008, 10 AM PT",
483
484 "en", "CE 2007 10 10 10:10:10", "CE 2008 10 10 10:10:10", "hz", "10/10/2007, 10 AM PDT\\u2009\\u2013\\u200910/10/2008, 10 AM PDT",
485
486 "en", "CE 2007 10 10 10:10:10", "CE 2008 10 10 10:10:10", "EEddMMyyyy", "Wed, 10/10/2007\\u2009\\u2013\\u2009Fri, 10/10/2008",
487
488 "en", "CE 2007 10 10 10:10:10", "CE 2008 10 10 10:10:10", "EddMMy", "Wed, 10/10/2007\\u2009\\u2013\\u2009Fri, 10/10/2008",
489
490 "en", "CE 2007 10 10 10:10:10", "CE 2008 10 10 10:10:10", "hhmm", "10/10/2007, 10:10 AM\\u2009\\u2013\\u200910/10/2008, 10:10 AM",
491
492 "en", "CE 2007 10 10 10:10:10", "CE 2008 10 10 10:10:10", "hhmmzz", "10/10/2007, 10:10 AM PDT\\u2009\\u2013\\u200910/10/2008, 10:10 AM PDT",
493
494 "en", "CE 2007 10 10 10:10:10", "CE 2008 10 10 10:10:10", "hms", "10/10/2007, 10:10:10 AM\\u2009\\u2013\\u200910/10/2008, 10:10:10 AM",
495
496 "en", "CE 2007 10 10 10:10:10", "CE 2008 10 10 10:10:10", "dMMMMMy", "O 10, 2007\\u2009\\u2013\\u2009O 10, 2008",
497
498 "en", "CE 2007 10 10 10:10:10", "CE 2008 10 10 10:10:10", "EEEEEdM", "W, 10/10/2007\\u2009\\u2013\\u2009F, 10/10/2008",
499
500 "en", "CE 2007 10 10 10:10:10", "CE 2007 11 10 10:10:10", "EEEEdMMMMy", "Wednesday, October 10\\u2009\\u2013\\u2009Saturday, November 10, 2007",
501
502 "en", "CE 2007 10 10 10:10:10", "CE 2007 11 10 10:10:10", "dMMMMy", "October 10\\u2009\\u2013\\u2009November 10, 2007",
503
504 "en", "CE 2007 10 10 10:10:10", "CE 2007 11 10 10:10:10", "dMMMM", "October 10\\u2009\\u2013\\u2009November 10",
505
506 "en", "CE 2007 10 10 10:10:10", "CE 2007 11 10 10:10:10", "MMMMy", "October\\u2009\\u2013\\u2009November 2007",
507
508 "en", "CE 2007 10 10 10:10:10", "CE 2007 11 10 10:10:10", "EEEEdMMMM", "Wednesday, October 10\\u2009\\u2013\\u2009Saturday, November 10",
509
510 "en", "CE 2007 10 10 10:10:10", "CE 2007 11 10 10:10:10", "EdMMMy", "Wed, Oct 10\\u2009\\u2013\\u2009Sat, Nov 10, 2007",
511
512 "en", "CE 2007 10 10 10:10:10", "CE 2007 11 10 10:10:10", "dMMMy", "Oct 10\\u2009\\u2013\\u2009Nov 10, 2007",
513
514 "en", "CE 2007 10 10 10:10:10", "CE 2007 11 10 10:10:10", "dMMM", "Oct 10\\u2009\\u2013\\u2009Nov 10",
515
516 "en", "CE 2007 10 10 10:10:10", "CE 2007 11 10 10:10:10", "MMMy", "Oct\\u2009\\u2013\\u2009Nov 2007",
517
518 "en", "CE 2007 10 10 10:10:10", "CE 2007 11 10 10:10:10", "EdMMM", "Wed, Oct 10\\u2009\\u2013\\u2009Sat, Nov 10",
519
520 "en", "CE 2007 10 10 10:10:10", "CE 2007 11 10 10:10:10", "EdMy", "Wed, 10/10/2007\\u2009\\u2013\\u2009Sat, 11/10/2007",
521
522 "en", "CE 2007 10 10 10:10:10", "CE 2007 11 10 10:10:10", "dMy", "10/10/2007\\u2009\\u2013\\u200911/10/2007",
523
524
525 "en", "CE 2007 10 10 10:10:10", "CE 2007 11 10 10:10:10", "My", "10/2007\\u2009\\u2013\\u200911/2007",
526
527 "en", "CE 2007 10 10 10:10:10", "CE 2007 11 10 10:10:10", "EdM", "Wed, 10/10\\u2009\\u2013\\u2009Sat, 11/10",
528
529 "en", "CE 2007 10 10 10:10:10", "CE 2007 11 10 10:10:10", "d", "10/10\\u2009\\u2013\\u200911/10",
530
531 "en", "CE 2007 10 10 10:10:10", "CE 2007 11 10 10:10:10", "Ed", "10 Wed\\u2009\\u2013\\u200910 Sat",
532
533 "en", "CE 2007 10 10 10:10:10", "CE 2007 11 10 10:10:10", "y", "2007",
534
535 "en", "CE 2007 10 10 10:10:10", "CE 2007 11 10 10:10:10", "M", "10\\u2009\\u2013\\u200911",
536
537 "en", "CE 2007 10 10 10:10:10", "CE 2007 11 10 10:10:10", "MMM", "Oct\\u2009\\u2013\\u2009Nov",
538
539 "en", "CE 2007 10 10 10:10:10", "CE 2007 11 10 10:10:10", "MMMM", "October\\u2009\\u2013\\u2009November",
540
541 "en", "CE 2007 10 10 10:10:10", "CE 2007 11 10 10:10:10", "hm", "10/10/2007, 10:10 AM\\u2009\\u2013\\u200911/10/2007, 10:10 AM",
542 "en", "CE 2007 10 10 10:10:10", "CE 2007 11 10 10:10:10", "Hm", "10/10/2007, 10:10\\u2009\\u2013\\u200911/10/2007, 10:10",
543 "en", "CE 2007 10 10 20:10:10", "CE 2007 11 10 20:10:10", "Hm", "10/10/2007, 20:10\\u2009\\u2013\\u200911/10/2007, 20:10",
544
545 "en", "CE 2007 10 10 10:10:10", "CE 2007 11 10 10:10:10", "hmv", "10/10/2007, 10:10 AM PT\\u2009\\u2013\\u200911/10/2007, 10:10 AM PT",
546
547 "en", "CE 2007 10 10 10:10:10", "CE 2007 11 10 10:10:10", "hmz", "10/10/2007, 10:10 AM PDT\\u2009\\u2013\\u200911/10/2007, 10:10 AM PST",
548
549 "en", "CE 2007 10 10 10:10:10", "CE 2007 11 10 10:10:10", "h", "10/10/2007, 10 AM\\u2009\\u2013\\u200911/10/2007, 10 AM",
550
551 "en", "CE 2007 10 10 10:10:10", "CE 2007 11 10 10:10:10", "hv", "10/10/2007, 10 AM PT\\u2009\\u2013\\u200911/10/2007, 10 AM PT",
552
553 "en", "CE 2007 10 10 10:10:10", "CE 2007 11 10 10:10:10", "hz", "10/10/2007, 10 AM PDT\\u2009\\u2013\\u200911/10/2007, 10 AM PST",
554
555 "en", "CE 2007 10 10 10:10:10", "CE 2007 11 10 10:10:10", "EEddMMyyyy", "Wed, 10/10/2007\\u2009\\u2013\\u2009Sat, 11/10/2007",
556
557 "en", "CE 2007 10 10 10:10:10", "CE 2007 11 10 10:10:10", "EddMMy", "Wed, 10/10/2007\\u2009\\u2013\\u2009Sat, 11/10/2007",
558
559
560 "en", "CE 2007 10 10 10:10:10", "CE 2007 11 10 10:10:10", "hhmmzz", "10/10/2007, 10:10 AM PDT\\u2009\\u2013\\u200911/10/2007, 10:10 AM PST",
561
562 "en", "CE 2007 10 10 10:10:10", "CE 2007 11 10 10:10:10", "hms", "10/10/2007, 10:10:10 AM\\u2009\\u2013\\u200911/10/2007, 10:10:10 AM",
563
564 "en", "CE 2007 10 10 10:10:10", "CE 2007 11 10 10:10:10", "dMMMMMy", "O 10\\u2009\\u2013\\u2009N 10, 2007",
565
566 "en", "CE 2007 10 10 10:10:10", "CE 2007 11 10 10:10:10", "EEEEEdM", "W, 10/10\\u2009\\u2013\\u2009S, 11/10",
567
568 "en", "CE 2007 11 10 10:10:10", "CE 2007 11 20 10:10:10", "EEEEdMMMMy", "Saturday, November 10\\u2009\\u2013\\u2009Tuesday, November 20, 2007",
569
570 "en", "CE 2007 11 10 10:10:10", "CE 2007 11 20 10:10:10", "dMMMMy", "November 10\\u2009\\u2013\\u200920, 2007",
571
572 "en", "CE 2007 11 10 10:10:10", "CE 2007 11 20 10:10:10", "dMMMM", "November 10\\u2009\\u2013\\u200920",
573
574
575 "en", "CE 2007 11 10 10:10:10", "CE 2007 11 20 10:10:10", "EEEEdMMMM", "Saturday, November 10\\u2009\\u2013\\u2009Tuesday, November 20",
576
577 "en", "CE 2007 11 10 10:10:10", "CE 2007 11 20 10:10:10", "EdMMMy", "Sat, Nov 10\\u2009\\u2013\\u2009Tue, Nov 20, 2007",
578
579 "en", "CE 2007 11 10 10:10:10", "CE 2007 11 20 10:10:10", "dMMMy", "Nov 10\\u2009\\u2013\\u200920, 2007",
580
581 "en", "CE 2007 11 10 10:10:10", "CE 2007 11 20 10:10:10", "dMMM", "Nov 10\\u2009\\u2013\\u200920",
582
583 "en", "CE 2007 11 10 10:10:10", "CE 2007 11 20 10:10:10", "MMMy", "Nov 2007",
584
585 "en", "CE 2007 11 10 10:10:10", "CE 2007 11 20 10:10:10", "EdMMM", "Sat, Nov 10\\u2009\\u2013\\u2009Tue, Nov 20",
586
587 "en", "CE 2007 11 10 10:10:10", "CE 2007 11 20 10:10:10", "EdMy", "Sat, 11/10/2007\\u2009\\u2013\\u2009Tue, 11/20/2007",
588
589 "en", "CE 2007 11 10 10:10:10", "CE 2007 11 20 10:10:10", "dMy", "11/10/2007\\u2009\\u2013\\u200911/20/2007",
590
591 "en", "CE 2007 11 10 10:10:10", "CE 2007 11 20 10:10:10", "dM", "11/10\\u2009\\u2013\\u200911/20",
592
593 "en", "CE 2007 11 10 10:10:10", "CE 2007 11 20 10:10:10", "My", "11/2007",
594
595 "en", "CE 2007 11 10 10:10:10", "CE 2007 11 20 10:10:10", "EdM", "Sat, 11/10\\u2009\\u2013\\u2009Tue, 11/20",
596
597 "en", "CE 2007 11 10 10:10:10", "CE 2007 11 20 10:10:10", "d", "10\\u2009\\u2013\\u200920",
598
599 "en", "CE 2007 11 10 10:10:10", "CE 2007 11 20 10:10:10", "Ed", "10 Sat\\u2009\\u2013\\u200920 Tue",
600
601 "en", "CE 2007 11 10 10:10:10", "CE 2007 11 20 10:10:10", "y", "2007",
602
603 "en", "CE 2007 11 10 10:10:10", "CE 2007 11 20 10:10:10", "M", "11",
604
605 "en", "CE 2007 11 10 10:10:10", "CE 2007 11 20 10:10:10", "MMM", "Nov",
606
607 "en", "CE 2007 11 10 10:10:10", "CE 2007 11 20 10:10:10", "MMMM", "November",
608
609 "en", "CE 2007 11 10 10:10:10", "CE 2007 11 20 10:10:10", "hm", "11/10/2007, 10:10 AM\\u2009\\u2013\\u200911/20/2007, 10:10 AM",
610 "en", "CE 2007 11 10 10:10:10", "CE 2007 11 20 10:10:10", "Hm", "11/10/2007, 10:10\\u2009\\u2013\\u200911/20/2007, 10:10",
611 "en", "CE 2007 11 10 20:10:10", "CE 2007 11 20 20:10:10", "Hm", "11/10/2007, 20:10\\u2009\\u2013\\u200911/20/2007, 20:10",
612
613 "en", "CE 2007 11 10 10:10:10", "CE 2007 11 20 10:10:10", "hmv", "11/10/2007, 10:10 AM PT\\u2009\\u2013\\u200911/20/2007, 10:10 AM PT",
614
615 "en", "CE 2007 11 10 10:10:10", "CE 2007 11 20 10:10:10", "hmz", "11/10/2007, 10:10 AM PST\\u2009\\u2013\\u200911/20/2007, 10:10 AM PST",
616
617 "en", "CE 2007 11 10 10:10:10", "CE 2007 11 20 10:10:10", "h", "11/10/2007, 10 AM\\u2009\\u2013\\u200911/20/2007, 10 AM",
618
619 "en", "CE 2007 11 10 10:10:10", "CE 2007 11 20 10:10:10", "hv", "11/10/2007, 10 AM PT\\u2009\\u2013\\u200911/20/2007, 10 AM PT",
620
621 "en", "CE 2007 11 10 10:10:10", "CE 2007 11 20 10:10:10", "hz", "11/10/2007, 10 AM PST\\u2009\\u2013\\u200911/20/2007, 10 AM PST",
622
623 "en", "CE 2007 11 10 10:10:10", "CE 2007 11 20 10:10:10", "EEddMMyyyy", "Sat, 11/10/2007\\u2009\\u2013\\u2009Tue, 11/20/2007",
624
625 "en", "CE 2007 11 10 10:10:10", "CE 2007 11 20 10:10:10", "EddMMy", "Sat, 11/10/2007\\u2009\\u2013\\u2009Tue, 11/20/2007",
626
627 "en", "CE 2007 11 10 10:10:10", "CE 2007 11 20 10:10:10", "hhmm", "11/10/2007, 10:10 AM\\u2009\\u2013\\u200911/20/2007, 10:10 AM",
628
629 "en", "CE 2007 11 10 10:10:10", "CE 2007 11 20 10:10:10", "hhmmzz", "11/10/2007, 10:10 AM PST\\u2009\\u2013\\u200911/20/2007, 10:10 AM PST",
630
631 "en", "CE 2007 11 10 10:10:10", "CE 2007 11 20 10:10:10", "hms", "11/10/2007, 10:10:10 AM\\u2009\\u2013\\u200911/20/2007, 10:10:10 AM",
632 "en", "CE 2007 11 10 10:10:10", "CE 2007 11 20 10:10:10", "Hms", "11/10/2007, 10:10:10\\u2009\\u2013\\u200911/20/2007, 10:10:10",
633 "en", "CE 2007 11 10 20:10:10", "CE 2007 11 20 20:10:10", "Hms", "11/10/2007, 20:10:10\\u2009\\u2013\\u200911/20/2007, 20:10:10",
634
635 "en", "CE 2007 11 10 10:10:10", "CE 2007 11 20 10:10:10", "dMMMMMy", "N 10\\u2009\\u2013\\u200920, 2007",
636
637 "en", "CE 2007 11 10 10:10:10", "CE 2007 11 20 10:10:10", "EEEEEdM", "S, 11/10\\u2009\\u2013\\u2009T, 11/20",
638
639 "en", "CE 2007 01 10 10:00:10", "CE 2007 01 10 14:10:10", "EEEEdMMMMy", "Wednesday, January 10, 2007",
640
641 "en", "CE 2007 01 10 10:00:10", "CE 2007 01 10 14:10:10", "dMMMMy", "January 10, 2007",
642
643 "en", "CE 2007 01 10 10:00:10", "CE 2007 01 10 14:10:10", "dMMMM", "January 10",
644
645 "en", "CE 2007 01 10 10:00:10", "CE 2007 01 10 14:10:10", "MMMMy", "January 2007",
646
647 "en", "CE 2007 01 10 10:00:10", "CE 2007 01 10 14:10:10", "EEEEdMMMM", "Wednesday, January 10",
648
649 "en", "CE 2007 01 10 10:00:10", "CE 2007 01 10 14:10:10", "EdMMMy", "Wed, Jan 10, 2007",
650
651 "en", "CE 2007 01 10 10:00:10", "CE 2007 01 10 14:10:10", "dMMMy", "Jan 10, 2007",
652
653 "en", "CE 2007 01 10 10:00:10", "CE 2007 01 10 14:10:10", "dMMM", "Jan 10",
654
655 "en", "CE 2007 01 10 10:00:10", "CE 2007 01 10 14:10:10", "MMMy", "Jan 2007",
656
657 "en", "CE 2007 01 10 10:00:10", "CE 2007 01 10 14:10:10", "EdMMM", "Wed, Jan 10",
658
659
660 "en", "CE 2007 01 10 10:00:10", "CE 2007 01 10 14:10:10", "dMy", "1/10/2007",
661
662 "en", "CE 2007 01 10 10:00:10", "CE 2007 01 10 14:10:10", "dM", "1/10",
663
664 "en", "CE 2007 01 10 10:00:10", "CE 2007 01 10 14:10:10", "My", "1/2007",
665
666 "en", "CE 2007 01 10 10:00:10", "CE 2007 01 10 14:10:10", "EdM", "Wed, 1/10",
667
668 "en", "CE 2007 01 10 10:00:10", "CE 2007 01 10 14:10:10", "d", "10",
669
670 "en", "CE 2007 01 10 10:00:10", "CE 2007 01 10 14:10:10", "Ed", "10 Wed",
671
672 "en", "CE 2007 01 10 10:00:10", "CE 2007 01 10 14:10:10", "y", "2007",
673
674 "en", "CE 2007 01 10 10:00:10", "CE 2007 01 10 14:10:10", "M", "1",
675
676 "en", "CE 2007 01 10 10:00:10", "CE 2007 01 10 14:10:10", "MMM", "Jan",
677
678 "en", "CE 2007 01 10 10:00:10", "CE 2007 01 10 14:10:10", "MMMM", "January",
679
680 "en", "CE 2007 01 10 10:00:10", "CE 2007 01 10 14:10:10", "hm", "10:00 AM\\u2009\\u2013\\u20092:10 PM",
681 "en", "CE 2007 01 10 10:00:10", "CE 2007 01 10 14:10:10", "Hm", "10:00\\u2009\\u2013\\u200914:10",
682
683 "en", "CE 2007 01 10 10:00:10", "CE 2007 01 10 14:10:10", "hmv", "10:00 AM\\u2009\\u2013\\u20092:10 PM PT",
684
685 "en", "CE 2007 01 10 10:00:10", "CE 2007 01 10 14:10:10", "hmz", "10:00 AM\\u2009\\u2013\\u20092:10 PM PST",
686
687 "en", "CE 2007 01 10 10:00:10", "CE 2007 01 10 14:10:10", "h", "10 AM\\u2009\\u2013\\u20092 PM",
688 "en", "CE 2007 01 10 10:00:10", "CE 2007 01 10 14:10:10", "H", "10\\u2009\\u2013\\u200914",
689
690
691 "en", "CE 2007 01 10 10:00:10", "CE 2007 01 10 14:10:10", "hz", "10 AM\\u2009\\u2013\\u20092 PM PST",
692
693 "en", "CE 2007 01 10 10:00:10", "CE 2007 01 10 14:10:10", "EEddMMyyyy", "Wed, 01/10/2007",
694
695 "en", "CE 2007 01 10 10:00:10", "CE 2007 01 10 14:10:10", "EddMMy", "Wed, 01/10/2007",
696
697 "en", "CE 2007 01 10 10:00:10", "CE 2007 01 10 14:10:10", "hhmm", "10:00 AM\\u2009\\u2013\\u20092:10 PM",
698 "en", "CE 2007 01 10 10:00:10", "CE 2007 01 10 14:10:10", "HHmm", "10:00\\u2009\\u2013\\u200914:10",
699
700 "en", "CE 2007 01 10 10:00:10", "CE 2007 01 10 14:10:10", "hhmmzz", "10:00 AM\\u2009\\u2013\\u20092:10 PM PST",
701
702 "en", "CE 2007 01 10 10:00:10", "CE 2007 01 10 14:10:10", "hms", "10:00:10 AM\\u2009\\u2013\\u20092:10:10 PM",
703 "en", "CE 2007 01 10 10:00:10", "CE 2007 01 10 14:10:10", "Hms", "10:00:10\\u2009\\u2013\\u200914:10:10",
704
705 "en", "CE 2007 01 10 10:00:10", "CE 2007 01 10 14:10:10", "dMMMMMy", "J 10, 2007",
706
707 "en", "CE 2007 01 10 10:00:10", "CE 2007 01 10 14:10:10", "EEEEEdM", "W, 1/10",
708 "en", "CE 2007 01 10 10:00:10", "CE 2007 01 10 10:20:10", "dMMMMy", "January 10, 2007",
709
710 "en", "CE 2007 01 10 10:00:10", "CE 2007 01 10 10:20:10", "dMMMM", "January 10",
711
712 "en", "CE 2007 01 10 10:00:10", "CE 2007 01 10 10:20:10", "MMMMy", "January 2007",
713
714 "en", "CE 2007 01 10 10:00:10", "CE 2007 01 10 10:20:10", "EEEEdMMMM", "Wednesday, January 10",
715
716 "en", "CE 2007 01 10 10:00:10", "CE 2007 01 10 10:20:10", "EdMMMy", "Wed, Jan 10, 2007",
717
718 "en", "CE 2007 01 10 10:00:10", "CE 2007 01 10 10:20:10", "dMMMy", "Jan 10, 2007",
719
720 "en", "CE 2007 01 10 10:00:10", "CE 2007 01 10 10:20:10", "dMMM", "Jan 10",
721
722
723 "en", "CE 2007 01 10 10:00:10", "CE 2007 01 10 10:20:10", "EdMMM", "Wed, Jan 10",
724
725 "en", "CE 2007 01 10 10:00:10", "CE 2007 01 10 10:20:10", "EdMy", "Wed, 1/10/2007",
726
727 "en", "CE 2007 01 10 10:00:10", "CE 2007 01 10 10:20:10", "dMy", "1/10/2007",
728
729
730 "en", "CE 2007 01 10 10:00:10", "CE 2007 01 10 10:20:10", "My", "1/2007",
731
732 "en", "CE 2007 01 10 10:00:10", "CE 2007 01 10 10:20:10", "EdM", "Wed, 1/10",
733
734 "en", "CE 2007 01 10 10:00:10", "CE 2007 01 10 10:20:10", "d", "10",
735
736
737 "en", "CE 2007 01 10 10:00:10", "CE 2007 01 10 10:20:10", "y", "2007",
738
739 "en", "CE 2007 01 10 10:00:10", "CE 2007 01 10 10:20:10", "M", "1",
740
741
742
743 "en", "CE 2007 01 10 10:00:10", "CE 2007 01 10 10:20:10", "hm", "10:00\\u2009\\u2013\\u200910:20 AM",
744 "en", "CE 2007 01 10 10:00:10", "CE 2007 01 10 10:20:10", "Hm", "10:00\\u2009\\u2013\\u200910:20",
745
746
747 "en", "CE 2007 01 10 10:00:10", "CE 2007 01 10 10:20:10", "hmz", "10:00\\u2009\\u2013\\u200910:20 AM PST",
748
749
750 "en", "CE 2007 01 10 10:00:10", "CE 2007 01 10 10:20:10", "hv", "10 AM PT",
751
752
753
754 "en", "CE 2007 01 10 10:00:10", "CE 2007 01 10 10:20:10", "EddMMy", "Wed, 01/10/2007",
755
756 "en", "CE 2007 01 10 10:00:10", "CE 2007 01 10 10:20:10", "hhmm", "10:00\\u2009\\u2013\\u200910:20 AM",
757 "en", "CE 2007 01 10 10:00:10", "CE 2007 01 10 10:20:10", "HHmm", "10:00\\u2009\\u2013\\u200910:20",
758
759 "en", "CE 2007 01 10 10:00:10", "CE 2007 01 10 10:20:10", "hhmmzz", "10:00\\u2009\\u2013\\u200910:20 AM PST",
760
761
762 "en", "CE 2007 01 10 10:00:10", "CE 2007 01 10 10:20:10", "dMMMMMy", "J 10, 2007",
763
764
765 "en", "CE 2007 01 10 10:10:10", "CE 2007 01 10 10:10:20", "EEEEdMMMMy", "Wednesday, January 10, 2007",
766
767 "en", "CE 2007 01 10 10:10:10", "CE 2007 01 10 10:10:20", "dMMMMy", "January 10, 2007",
768
769
770 "en", "CE 2007 01 10 10:10:10", "CE 2007 01 10 10:10:20", "MMMMy", "January 2007",
771
772 "en", "CE 2007 01 10 10:10:10", "CE 2007 01 10 10:10:20", "EEEEdMMMM", "Wednesday, January 10",
773
774
775 "en", "CE 2007 01 10 10:10:10", "CE 2007 01 10 10:10:20", "dMMMy", "Jan 10, 2007",
776
777 "en", "CE 2007 01 10 10:10:10", "CE 2007 01 10 10:10:20", "dMMM", "Jan 10",
778
779
780 "en", "CE 2007 01 10 10:10:10", "CE 2007 01 10 10:10:20", "EdMMM", "Wed, Jan 10",
781
782 "en", "CE 2007 01 10 10:10:10", "CE 2007 01 10 10:10:20", "EdMy", "Wed, 1/10/2007",
783
784 "en", "CE 2007 01 10 10:10:10", "CE 2007 01 10 10:10:20", "dMy", "1/10/2007",
785
786
787 "en", "CE 2007 01 10 10:10:10", "CE 2007 01 10 10:10:20", "My", "1/2007",
788
789 "en", "CE 2007 01 10 10:10:10", "CE 2007 01 10 10:10:20", "EdM", "Wed, 1/10",
790
791 "en", "CE 2007 01 10 10:10:10", "CE 2007 01 10 10:10:20", "d", "10",
792
793
794 "en", "CE 2007 01 10 10:10:10", "CE 2007 01 10 10:10:20", "y", "2007",
795
796 "en", "CE 2007 01 10 10:10:10", "CE 2007 01 10 10:10:20", "M", "1",
797
798
799 "en", "CE 2007 01 10 10:10:10", "CE 2007 01 10 10:10:20", "MMMM", "January",
800
801 "en", "CE 2007 01 10 10:10:10", "CE 2007 01 10 10:10:20", "hm", "10:10 AM",
802 "en", "CE 2007 01 10 10:10:10", "CE 2007 01 10 10:10:20", "Hm", "10:10",
803
804
805 "en", "CE 2007 01 10 10:10:10", "CE 2007 01 10 10:10:20", "hmz", "10:10 AM PST",
806
807 "en", "CE 2007 01 10 10:10:10", "CE 2007 01 10 10:10:20", "h", "10 AM",
808
809 "en", "CE 2007 01 10 10:10:10", "CE 2007 01 10 10:10:20", "hv", "10 AM PT",
810
811
812 "en", "CE 2007 01 10 10:10:10", "CE 2007 01 10 10:10:20", "EEddMMyyyy", "Wed, 01/10/2007",
813
814
815 "en", "CE 2007 01 10 10:10:10", "CE 2007 01 10 10:10:20", "hhmm", "10:10 AM",
816 "en", "CE 2007 01 10 10:10:10", "CE 2007 01 10 10:10:20", "HHmm", "10:10",
817
818 "en", "CE 2007 01 10 10:10:10", "CE 2007 01 10 10:10:20", "hhmmzz", "10:10 AM PST",
819
820
821 "en", "CE 2007 01 10 10:10:10", "CE 2007 01 10 10:10:20", "dMMMMMy", "J 10, 2007",
822
823 "en", "CE 2007 01 10 10:10:10", "CE 2007 01 10 10:10:20", "EEEEEdM", "W, 1/10",
824
825 "zh", "CE 2007 10 10 10:10:10", "CE 2008 10 10 10:10:10", "EEEEdMMMMy", "2007\\u5e7410\\u670810\\u65e5\\u661f\\u671f\\u4e09\\u81f32008\\u5e7410\\u670810\\u65e5\\u661f\\u671f\\u4e94",
826
827
828 "zh", "CE 2007 10 10 10:10:10", "CE 2007 11 10 10:10:10", "dMMMMy", "2007\\u5e7410\\u670810\\u65e5\\u81f311\\u670810\\u65e5",
829
830
831 "zh", "CE 2007 10 10 10:10:10", "CE 2007 11 10 10:10:10", "MMMMy", "2007\\u5e7410\\u6708\\u81f311\\u6708",
832
833
834 "zh", "CE 2007 10 10 10:10:10", "CE 2007 11 10 10:10:10", "hmv", "2007/10/10 \\u6D1B\\u6749\\u77F6\\u65F6\\u95F4 \\u4E0A\\u534810:10\\u2009\\u2013\\u20092007/11/10 \\u6D1B\\u6749\\u77F6\\u65F6\\u95F4 \\u4E0A\\u534810:10",
835
836 "zh", "CE 2007 11 10 10:10:10", "CE 2007 11 20 10:10:10", "EEEEdMMMMy", "2007\\u5e7411\\u670810\\u65e5\\u661f\\u671f\\u516d\\u81f320\\u65e5\\u661f\\u671f\\u4e8c",
837
838
839 "zh", "CE 2007 11 10 10:10:10", "CE 2007 11 20 10:10:10", "dMMMM", "11\\u670810\\u65e5\\u81f320\\u65e5",
840
841 "zh", "CE 2007 11 10 10:10:10", "CE 2007 11 20 10:10:10", "MMMMy", "2007\\u5E7411\\u6708", // (fixed expected result per ticket:6626:)
842
843 "zh", "CE 2007 11 10 10:10:10", "CE 2007 11 20 10:10:10", "EEEEdMMMM", "11\\u670810\\u65e5\\u661f\\u671f\\u516d\\u81f320\\u65e5\\u661f\\u671f\\u4e8c",
844
845
846 "zh", "CE 2007 11 10 10:10:10", "CE 2007 11 20 10:10:10", "EdMy", "2007/11/10\\u5468\\u516d\\u81f32007/11/20\\u5468\\u4e8c",
847
848
849 "zh", "CE 2007 11 10 10:10:10", "CE 2007 11 20 10:10:10", "dM", "11/10\\u2009\\u2013\\u200911/20",
850
851 "zh", "CE 2007 11 10 10:10:10", "CE 2007 11 20 10:10:10", "My", "2007\\u5E7411\\u6708",
852
853 "zh", "CE 2007 11 10 10:10:10", "CE 2007 11 20 10:10:10", "EdM", "11/10\\u5468\\u516d\\u81f311/20\\u5468\\u4e8c",
854
855
856 "zh", "CE 2007 11 10 10:10:10", "CE 2007 11 20 10:10:10", "y", "2007\\u5E74", // (fixed expected result per ticket:6626:)
857
858 "zh", "CE 2007 11 10 10:10:10", "CE 2007 11 20 10:10:10", "M", "11\\u6708",
859
860 "zh", "CE 2007 11 10 10:10:10", "CE 2007 11 20 10:10:10", "MMM", "11\\u6708", // (fixed expected result per ticket:6626: and others)
861
862
863 "zh", "CE 2007 11 10 10:10:10", "CE 2007 11 20 10:10:10", "hmz", "2007/11/10 GMT-8 \\u4e0a\\u534810:10\\u2009\\u2013\\u20092007/11/20 GMT-8 \\u4e0a\\u534810:10",
864
865 "zh", "CE 2007 11 10 10:10:10", "CE 2007 11 20 10:10:10", "h", "2007/11/10 \\u4e0a\\u534810\\u65f6\\u2009\\u2013\\u20092007/11/20 \\u4e0a\\u534810\\u65f6",
866
867 "zh", "CE 2007 01 10 10:00:10", "CE 2007 01 10 14:10:10", "EEEEdMMMMy", "2007\\u5e741\\u670810\\u65e5 \\u661f\\u671f\\u4e09", // (fixed expected result per ticket:6626:)
868
869 "zh", "CE 2007 01 10 10:00:10", "CE 2007 01 10 14:10:10", "hm", "\\u4e0a\\u534810:00\\u81f3\\u4e0b\\u53482:10",
870
871
872 "zh", "CE 2007 01 10 10:00:10", "CE 2007 01 10 14:10:10", "hmz", "GMT-8\\u4e0a\\u534810:00\\u81f3\\u4e0b\\u53482:10",
873
874 "zh", "CE 2007 01 10 10:00:10", "CE 2007 01 10 14:10:10", "h", "\\u4e0a\\u534810\\u65F6\\u81f3\\u4e0b\\u53482\\u65f6",
875
876 "zh", "CE 2007 01 10 10:00:10", "CE 2007 01 10 14:10:10", "hv", "\\u6D1B\\u6749\\u77F6\\u65F6\\u95F4\\u4E0A\\u534810\\u65F6\\u81F3\\u4E0B\\u53482\\u65F6",
877
878 "zh", "CE 2007 01 10 10:00:10", "CE 2007 01 10 10:20:10", "hm", "\\u4e0a\\u534810:00\\u81f310:20",
879
880 "zh", "CE 2007 01 10 10:00:10", "CE 2007 01 10 10:20:10", "hmv", "\\u6D1B\\u6749\\u77F6\\u65F6\\u95F4\\u4E0A\\u534810:00\\u81F310:20",
881
882 "zh", "CE 2007 01 10 10:00:10", "CE 2007 01 10 10:20:10", "hz", "GMT-8\\u4e0a\\u534810\\u65f6",
883
884 "zh", "CE 2007 01 10 10:10:10", "CE 2007 01 10 10:10:20", "hm", "\\u4e0a\\u534810:10",
885
886 "zh", "CE 2007 01 10 10:10:10", "CE 2007 01 10 10:10:20", "h", "\\u4e0a\\u534810\\u65f6",
887
888 "de", "CE 2007 10 10 10:10:10", "CE 2008 10 10 10:10:10", "EEEEdMMMy", "Mittwoch, 10. Okt. 2007\\u2009\\u2013\\u2009Freitag, 10. Okt. 2008",
889
890
891 "de", "CE 2007 10 10 10:10:10", "CE 2008 10 10 10:10:10", "dMMM", "10. Okt. 2007\\u2009\\u2013\\u200910. Okt. 2008",
892
893 "de", "CE 2007 10 10 10:10:10", "CE 2008 10 10 10:10:10", "MMMy", "Okt. 2007\\u2009\\u2013\\u2009Okt. 2008",
894
895
896 "de", "CE 2007 10 10 10:10:10", "CE 2008 10 10 10:10:10", "EdMy", "Mi. 10.10.2007\\u2009\\u2013\\u2009Fr. 10.10.2008",
897
898 "de", "CE 2007 10 10 10:10:10", "CE 2008 10 10 10:10:10", "dMy", "10.10.2007\\u2009\\u2013\\u200910.10.2008",
899
900
901 "de", "CE 2007 10 10 10:10:10", "CE 2008 10 10 10:10:10", "My", "10.2007\\u2009\\u2013\\u200910.2008",
902
903 "de", "CE 2007 10 10 10:10:10", "CE 2008 10 10 10:10:10", "EdM", "Mi. 10.10.2007\\u2009\\u2013\\u2009Fr. 10.10.2008",
904
905
906 "de", "CE 2007 10 10 10:10:10", "CE 2008 10 10 10:10:10", "y", "2007\\u20132008",
907
908 "de", "CE 2007 10 10 10:10:10", "CE 2008 10 10 10:10:10", "M", "10.2007\\u2009\\u2013\\u200910.2008",
909
910
911 "de", "CE 2007 10 10 10:10:10", "CE 2008 10 10 10:10:10", "hm", "10.10.2007, 10:10 AM\\u2009\\u2013\\u200910.10.2008, 10:10 AM",
912 "de", "CE 2007 10 10 10:10:10", "CE 2008 10 10 10:10:10", "Hm", "10.10.2007, 10:10\\u2009\\u2013\\u200910.10.2008, 10:10",
913
914 "de", "CE 2007 10 10 10:10:10", "CE 2007 11 10 10:10:10", "EEEEdMMMy", "Mittwoch, 10. Okt.\\u2009\\u2013\\u2009Samstag, 10. Nov. 2007",
915
916
917 "de", "CE 2007 10 10 10:10:10", "CE 2007 11 10 10:10:10", "dMMM", "10. Okt.\\u2009\\u2013\\u200910. Nov.",
918
919 "de", "CE 2007 10 10 10:10:10", "CE 2007 11 10 10:10:10", "MMMy", "Okt.\\u2013Nov. 2007",
920
921 "de", "CE 2007 10 10 10:10:10", "CE 2007 11 10 10:10:10", "EEEEdMMM", "Mittwoch, 10. Okt.\\u2009\\u2013\\u2009Samstag, 10. Nov.",
922
923
924 "de", "CE 2007 10 10 10:10:10", "CE 2007 11 10 10:10:10", "dM", "10.10.\\u2009\\u2013\\u200910.11.",
925
926 "de", "CE 2007 10 10 10:10:10", "CE 2007 11 10 10:10:10", "My", "10.2007\\u2009\\u2013\\u200911.2007",
927
928
929 "de", "CE 2007 10 10 10:10:10", "CE 2007 11 10 10:10:10", "d", "10.10.\\u2009\\u2013\\u200910.11.",
930
931 "de", "CE 2007 10 10 10:10:10", "CE 2007 11 10 10:10:10", "y", "2007",
932
933
934 "de", "CE 2007 10 10 10:10:10", "CE 2007 11 10 10:10:10", "MMM", "Okt.\\u2013Nov.",
935
936
937 "de", "CE 2007 10 10 10:10:10", "CE 2007 11 10 10:10:10", "hms", "10.10.2007, 10:10:10 AM\\u2009\\u2013\\u200910.11.2007, 10:10:10 AM",
938 "de", "CE 2007 10 10 10:10:10", "CE 2007 11 10 10:10:10", "Hms", "10.10.2007, 10:10:10\\u2009\\u2013\\u200910.11.2007, 10:10:10",
939
940 "de", "CE 2007 11 10 10:10:10", "CE 2007 11 20 10:10:10", "EEEEdMMMy", "Samstag, 10.\\u2009\\u2013\\u2009Dienstag, 20. Nov. 2007",
941
942 "de", "CE 2007 11 10 10:10:10", "CE 2007 11 20 10:10:10", "dMMMy", "10.\\u201320. Nov. 2007",
943
944
945 "de", "CE 2007 11 10 10:10:10", "CE 2007 11 20 10:10:10", "MMMy", "Nov. 2007",
946
947 "de", "CE 2007 11 10 10:10:10", "CE 2007 11 20 10:10:10", "EEEEdMMM", "Samstag, 10.\\u2009\\u2013\\u2009Dienstag, 20. Nov.",
948
949 "de", "CE 2007 11 10 10:10:10", "CE 2007 11 20 10:10:10", "EdMy", "Sa. 10.\\u2009\\u2013\\u2009Di. 20.11.2007",
950
951
952 "de", "CE 2007 11 10 10:10:10", "CE 2007 11 20 10:10:10", "dM", "10.\\u201320.11.",
953
954 "de", "CE 2007 11 10 10:10:10", "CE 2007 11 20 10:10:10", "My", "11.2007",
955
956
957 "de", "CE 2007 11 10 10:10:10", "CE 2007 11 20 10:10:10", "d", "10.\\u201320.",
958
959 "de", "CE 2007 11 10 10:10:10", "CE 2007 11 20 10:10:10", "y", "2007",
960
961
962 "de", "CE 2007 11 10 10:10:10", "CE 2007 11 20 10:10:10", "hmv", "10.11.2007, 10:10 AM Los Angeles Zeit\\u2009\\u2013\\u200920.11.2007, 10:10 AM Los Angeles Zeit",
963
964 "de", "CE 2007 01 10 10:00:10", "CE 2007 01 10 14:10:10", "EEEEdMMMy", "Mittwoch, 10. Jan. 2007",
965
966
967 "de", "CE 2007 01 10 10:00:10", "CE 2007 01 10 14:10:10", "dMMM", "10. Jan.",
968
969 "de", "CE 2007 01 10 10:00:10", "CE 2007 01 10 14:10:10", "MMMy", "Jan. 2007",
970
971 "de", "CE 2007 01 10 10:00:10", "CE 2007 01 10 14:10:10", "EEEEdMMM", "Mittwoch, 10. Jan.",
972
973 /* Following is an important test, because the 'h' in 'Uhr' is interpreted as a pattern
974 if not escaped properly. */
975 "de", "CE 2007 01 10 10:00:10", "CE 2007 01 10 14:10:10", "h", "10 AM\\u2009\\u2013\\u20092 PM",
976 "de", "CE 2007 01 10 10:00:10", "CE 2007 01 10 14:10:10", "H", "10\\u201314 Uhr",
977
978 "de", "CE 2007 01 10 10:00:10", "CE 2007 01 10 10:20:10", "EEEEdMMM", "Mittwoch, 10. Jan.",
979
980
981 "de", "CE 2007 01 10 10:00:10", "CE 2007 01 10 10:20:10", "hmv", "10:00\\u201310:20 AM Los Angeles Zeit",
982
983 "de", "CE 2007 01 10 10:00:10", "CE 2007 01 10 10:20:10", "hmz", "10:00\\u201310:20 AM GMT-8",
984
985 "de", "CE 2007 01 10 10:00:10", "CE 2007 01 10 10:20:10", "h", "10 AM",
986 "de", "CE 2007 01 10 10:00:10", "CE 2007 01 10 10:20:10", "H", "10 Uhr",
987
988
989 "de", "CE 2007 01 10 10:00:10", "CE 2007 01 10 10:20:10", "hz", "10 AM GMT-8",
990
991 "de", "CE 2007 01 10 10:10:10", "CE 2007 01 10 10:10:20", "EEEEdMMMy", "Mittwoch, 10. Jan. 2007",
992
993
994 "de", "CE 2007 01 10 10:10:10", "CE 2007 01 10 10:10:20", "hmv", "10:10 AM Los Angeles Zeit",
995
996 "de", "CE 2007 01 10 10:10:10", "CE 2007 01 10 10:10:20", "hmz", "10:10 AM GMT-8",
997
998
999 "de", "CE 2007 01 10 10:10:10", "CE 2007 01 10 10:10:20", "hv", "10 AM Los Angeles Zeit",
1000
1001 "de", "CE 2007 01 10 10:10:10", "CE 2007 01 10 10:10:20", "hz", "10 AM GMT-8",
1002
1003 // Thai (default calendar buddhist)
1004
1005 "th", "BE 2550 10 10 10:10:10", "BE 2551 10 10 10:10:10", "EEEEdMMMy", "\\u0E27\\u0E31\\u0E19\\u0E1E\\u0E38\\u0E18\\u0E17\\u0E35\\u0E48 10 \\u0E15.\\u0E04. 2550 \\u2013 \\u0E27\\u0E31\\u0E19\\u0E28\\u0E38\\u0E01\\u0E23\\u0E4C\\u0E17\\u0E35\\u0E48 10 \\u0E15.\\u0E04. 2551",
1006
1007
1008 "th", "BE 2550 10 10 10:10:10", "BE 2551 10 10 10:10:10", "dMMM", "10 \\u0E15.\\u0E04. 2550 \\u2013 10 \\u0E15.\\u0E04. 2551",
1009
1010 "th", "BE 2550 10 10 10:10:10", "BE 2551 10 10 10:10:10", "MMMy", "\\u0E15.\\u0E04. 2550 \\u2013 \\u0E15.\\u0E04. 2551",
1011
1012
1013 "th", "BE 2550 10 10 10:10:10", "BE 2551 10 10 10:10:10", "EdMy", "\\u0E1E. 10/10/2550 \\u2013 \\u0E28. 10/10/2551",
1014
1015 "th", "BE 2550 10 10 10:10:10", "BE 2551 10 10 10:10:10", "dMy", "10/10/2550 \\u2013 10/10/2551",
1016
1017
1018 "th", "BE 2550 10 10 10:10:10", "BE 2551 10 10 10:10:10", "My", "10/2550 \\u2013 10/2551",
1019
1020 "th", "BE 2550 10 10 10:10:10", "BE 2551 10 10 10:10:10", "EdM", "\\u0E1E. 10/10/2550 \\u2013 \\u0E28. 10/10/2551",
1021
1022
1023 "th", "BE 2550 10 10 10:10:10", "BE 2551 10 10 10:10:10", "y", "2550\\u20132551",
1024
1025 "th", "BE 2550 10 10 10:10:10", "BE 2551 10 10 10:10:10", "M", "10/2550 \\u2013 10/2551",
1026
1027
1028 "th", "BE 2550 10 10 10:10:10", "BE 2550 11 10 10:10:10", "EEEEdMMMy", "\\u0E27\\u0E31\\u0E19\\u0E1E\\u0E38\\u0E18\\u0E17\\u0E35\\u0E48 10 \\u0E15.\\u0E04. \\u2013 \\u0E27\\u0E31\\u0E19\\u0E40\\u0E2A\\u0E32\\u0E23\\u0E4C\\u0E17\\u0E35\\u0E48 10 \\u0E1E.\\u0E22. 2550",
1029
1030
1031 "th", "BE 2550 10 10 10:10:10", "BE 2550 11 10 10:10:10", "dMMM", "10 \\u0E15.\\u0E04. \\u2013 10 \\u0E1E.\\u0E22.",
1032
1033 "th", "BE 2550 10 10 10:10:10", "BE 2550 11 10 10:10:10", "MMMy", "\\u0E15.\\u0E04.\\u2013\\u0E1E.\\u0E22. 2550",
1034
1035 "th", "2550 10 10 10:10:10", "2550 11 10 10:10:10", "dM", "10/10 \\u2013 10/11",
1036
1037 "th", "BE 2550 10 10 10:10:10", "BE 2550 11 10 10:10:10", "My", "10/2550 \\u2013 11/2550",
1038
1039
1040 "th", "BE 2550 10 10 10:10:10", "BE 2550 11 10 10:10:10", "d", "10/10 \\u2013 10/11",
1041
1042 "th", "BE 2550 10 10 10:10:10", "BE 2550 11 10 10:10:10", "y", "\\u0E1E.\\u0E28. 2550",
1043
1044
1045 "th", "BE 2550 10 10 10:10:10", "BE 2550 11 10 10:10:10", "MMM", "\\u0E15.\\u0E04.\\u2013\\u0E1E.\\u0E22.",
1046
1047 // Tests for Japanese calendar with eras, including new era in 2019 (Heisei 31 through April 30, then new era)
1048
1049 "en-u-ca-japanese", "H 31 03 15 09:00:00", "H 31 04 15 09:00:00", "GyMMMd", "Mar 15\\u2009\\u2013\\u2009Apr 15, 31 Heisei",
1050
1051 "en-u-ca-japanese", "H 31 03 15 09:00:00", "H 31 04 15 09:00:00", "GGGGGyMd", "3/15/31\\u2009\\u2013\\u20094/15/31 H",
1052
1053 "en-u-ca-japanese", "S 64 01 05 09:00:00", "H 1 01 15 09:00:00", "GyMMMd", "Jan 5, 64 Sh\\u014Dwa\\u2009\\u2013\\u2009Jan 15, 1 Heisei",
1054
1055 "en-u-ca-japanese", "S 64 01 05 09:00:00", "H 1 01 15 09:00:00", "yMMMd", "Jan 5, 64 Sh\\u014Dwa\\u2009\\u2013\\u2009Jan 15, 1 Heisei",
1056
1057 "en-u-ca-japanese", "S 64 01 05 09:00:00", "H 1 01 15 09:00:00", "GGGGGyMd", "1/5/64 S\\u2009\\u2013\\u20091/15/1 H",
1058
1059 "en-u-ca-japanese", "S 64 01 05 09:00:00", "H 1 01 15 09:00:00", "yMd", "1/5/64 S\\u2009\\u2013\\u20091/15/1 H",
1060
1061 "en-u-ca-japanese", "S 64 01 05 09:00:00", "H 1 01 15 09:00:00", "yyMd", "1/5/64 S\\u2009\\u2013\\u20091/15/1 H",
1062
1063 "en-u-ca-japanese", "H 31 04 15 09:00:00", JP_ERA_2019_NARROW " 1 05 15 09:00:00", "GyMMMd", "Apr 15, 31 Heisei\\u2009\\u2013\\u2009May 15, 1 " JP_ERA_2019_ROOT,
1064
1065 "en-u-ca-japanese", "H 31 04 15 09:00:00", JP_ERA_2019_NARROW " 1 05 15 09:00:00", "GGGGGyMd", "4/15/31 H\\u2009\\u2013\\u20095/15/1 " JP_ERA_2019_NARROW,
1066
1067
1068 "ja-u-ca-japanese", "H 31 03 15 09:00:00", "H 31 04 15 09:00:00", "GyMMMd", "\\u5E73\\u621031\\u5E743\\u670815\\u65E5\\uFF5E4\\u670815\\u65E5",
1069
1070 "ja-u-ca-japanese", "H 31 03 15 09:00:00", "H 31 04 15 09:00:00", "GGGGGyMd", "H31/03/15\\uFF5E31/04/15",
1071
1072 "ja-u-ca-japanese", "S 64 01 05 09:00:00", "H 1 01 15 09:00:00", "GyMMMd", "\\u662D\\u548C64\\u5E741\\u67085\\u65E5\\uFF5E\\u5E73\\u6210\\u5143\\u5E741\\u670815\\u65E5",
1073
1074 "ja-u-ca-japanese", "S 64 01 05 09:00:00", "H 1 01 15 09:00:00", "yMMMd", "\\u662D\\u548C64\\u5E741\\u67085\\u65E5\\uFF5E\\u5E73\\u6210\\u5143\\u5E741\\u670815\\u65E5",
1075
1076 "ja-u-ca-japanese", "S 64 01 05 09:00:00", "H 1 01 15 09:00:00", "GGGGGyMd", "S64/01/05\\uFF5EH1/01/15",
1077
1078 "ja-u-ca-japanese", "S 64 01 05 09:00:00", "H 1 01 15 09:00:00", "yyMMdd", "S64/01/05\\uFF5EH1/01/15",
1079
1080 "ja-u-ca-japanese", "H 31 04 15 09:00:00", JP_ERA_2019_NARROW " 1 05 15 09:00:00", "GGGGGyMd", "H31/04/15\\uFF5E" JP_ERA_2019_NARROW "1/05/15",
1081
1082 "ja-u-ca-japanese", "H 31 04 15 09:00:00", JP_ERA_2019_NARROW " 1 05 15 09:00:00", "yyMMdd", "H31/04/15\\uFF5E" JP_ERA_2019_NARROW "1/05/15",
1083
1084 "ar@calendar=islamic", "1438 10 10 10:10:10", "1438 10 20 10:10:10", "MMMd", "\\u0661\\u0660\\u2013\\u0662\\u0660 \\u0634\\u0648\\u0627\\u0644",
1085 };
1086 expect(DATA, UPRV_LENGTHOF(DATA));
1087 }
1088
1089
1090 void DateIntervalFormatTest::expect(const char** data, int32_t data_length) {
1091 int32_t i = 0;
1092 UErrorCode ec = U_ZERO_ERROR;
1093 UnicodeString str, str2;
1094 const char* pattern = data[i++];
1095
1096 while (i<data_length) {
1097 const char* locName = data[i++];
1098 const char* datestr = data[i++];
1099 const char* datestr_2 = data[i++];
1100
1101 Locale loc(locName);
1102 LocalPointer<Calendar> defCal(Calendar::createInstance(loc, ec));
1103 if (U_FAILURE(ec)) {
1104 dataerrln("Calendar::createInstance fails for loc %s with: %s", locName, u_errorName(ec));
1105 return;
1106 }
1107 const char* calType = defCal->getType();
1108
1109 Locale refLoc("root");
1110 if (calType) {
1111 refLoc.setKeywordValue("calendar", calType, ec);
1112 }
1113 SimpleDateFormat ref(pattern, refLoc, ec);
1114 logln( "case %d, locale: %s\n", (i-1)/5, locName);
1115 if (U_FAILURE(ec)) {
1116 dataerrln("contruct SimpleDateFormat in expect failed: %s", u_errorName(ec));
1117 return;
1118 }
1119
1120 // 'f'
1121 logln("original date: %s - %s\n", datestr, datestr_2);
1122 UDate date = ref.parse(ctou(datestr), ec);
1123 if (!assertSuccess("parse 1st data in expect", ec)) return;
1124 UDate date_2 = ref.parse(ctou(datestr_2), ec);
1125 if (!assertSuccess("parse 2nd data in expect", ec)) return;
1126 DateInterval dtitv(date, date_2);
1127
1128 const UnicodeString& oneSkeleton(ctou(data[i++]));
1129
1130 DateIntervalFormat* dtitvfmt = DateIntervalFormat::createInstance(oneSkeleton, loc, ec);
1131 if (!assertSuccess("createInstance(skeleton) in expect", ec)) return;
1132 FieldPosition pos(FieldPosition::DONT_CARE);
1133 dtitvfmt->format(&dtitv, str.remove(), pos, ec);
1134 if (!assertSuccess("format in expect", ec)) return;
1135 assertEquals((UnicodeString)"\"" + locName + "\\" + oneSkeleton + "\\" + ctou(datestr) + "\\" + ctou(datestr_2) + "\"", ctou(data[i++]), str);
1136
1137 logln("interval date:" + str + "\"" + locName + "\", "
1138 + "\"" + datestr + "\", "
1139 + "\"" + datestr_2 + "\", " + oneSkeleton);
1140 delete dtitvfmt;
1141 }
1142 }
1143
1144
1145 /*
1146 * Test format using user defined DateIntervalInfo
1147 */
1148 void DateIntervalFormatTest::testFormatUserDII() {
1149 // first item is date pattern
1150 const char* DATA[] = {
1151 "yyyy MM dd HH:mm:ss",
1152 "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "Oct 10, 2007 --- Oct 10, 2008",
1153
1154 "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "2007 Oct 10 - Nov 2007",
1155
1156 "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "Nov 10, 2007 --- Nov 20, 2007",
1157
1158 "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "Jan 10, 2007",
1159
1160 "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "Jan 10, 2007",
1161
1162 "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "Jan 10, 2007",
1163
1164 "zh", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "2007\\u5e7410\\u670810\\u65e5 --- 2008\\u5e7410\\u670810\\u65e5",
1165
1166 "zh", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "2007 10\\u6708 10 - 11\\u6708 2007",
1167
1168 "zh", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "2007\\u5e7411\\u670810\\u65e5 --- 2007\\u5e7411\\u670820\\u65e5",
1169
1170 "zh", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "2007\\u5e741\\u670810\\u65e5", // (fixed expected result per ticket:6626:)
1171
1172 "zh", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "2007\\u5e741\\u670810\\u65e5", // (fixed expected result per ticket:6626:)
1173
1174 "zh", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "2007\\u5e741\\u670810\\u65e5", // (fixed expected result per ticket:6626:)
1175
1176 "de", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "10. Okt. 2007 --- 10. Okt. 2008",
1177
1178
1179 "de", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "10. Nov. 2007 --- 20. Nov. 2007",
1180
1181 "de", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "10. Jan. 2007",
1182
1183 "de", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "10. Jan. 2007",
1184
1185
1186 "es", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "10 oct 2007 --- 10 oct 2008",
1187
1188 "es", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "2007 oct 10 - nov 2007",
1189
1190 "es", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "10 nov 2007 --- 20 nov 2007",
1191
1192 "es", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "10 ene 2007",
1193
1194 "es", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "10 ene 2007",
1195
1196 "es", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "10 ene 2007",
1197 };
1198 expectUserDII(DATA, UPRV_LENGTHOF(DATA));
1199 }
1200
1201
1202 void DateIntervalFormatTest::testSetIntervalPatternNoSideEffect() {
1203 UErrorCode ec = U_ZERO_ERROR;
1204 LocalPointer<DateIntervalInfo> dtitvinf(new DateIntervalInfo(ec), ec);
1205 if (U_FAILURE(ec)) {
1206 errln("Failure encountered: %s", u_errorName(ec));
1207 return;
1208 }
1209 UnicodeString expected;
1210 dtitvinf->getIntervalPattern(ctou("yMd"), UCAL_DATE, expected, ec);
1211 dtitvinf->setIntervalPattern(ctou("yMd"), UCAL_DATE, ctou("M/d/y \\u2013 d"), ec);
1212 if (U_FAILURE(ec)) {
1213 errln("Failure encountered: %s", u_errorName(ec));
1214 return;
1215 }
1216 dtitvinf.adoptInsteadAndCheckErrorCode(new DateIntervalInfo(ec), ec);
1217 if (U_FAILURE(ec)) {
1218 errln("Failure encountered: %s", u_errorName(ec));
1219 return;
1220 }
1221 UnicodeString actual;
1222 dtitvinf->getIntervalPattern(ctou("yMd"), UCAL_DATE, actual, ec);
1223 if (U_FAILURE(ec)) {
1224 errln("Failure encountered: %s", u_errorName(ec));
1225 return;
1226 }
1227 if (expected != actual) {
1228 errln("DateIntervalInfo.setIntervalPattern should have no side effects.");
1229 }
1230 }
1231
1232 void DateIntervalFormatTest::testYearFormats() {
1233 const Locale &enLocale = Locale::getEnglish();
1234 UErrorCode status = U_ZERO_ERROR;
1235 LocalPointer<Calendar> fromTime(Calendar::createInstance(enLocale, status));
1236 LocalPointer<Calendar> toTime(Calendar::createInstance(enLocale, status));
1237 if (U_FAILURE(status)) {
1238 errln("Failure encountered: %s", u_errorName(status));
1239 return;
1240 }
1241 // April 26, 113. Three digit year so that we can test 2 digit years;
1242 // 4 digit years with padded 0's and full years.
1243 fromTime->set(113, 3, 26);
1244 // April 28, 113.
1245 toTime->set(113, 3, 28);
1246 {
1247 LocalPointer<DateIntervalFormat> dif(DateIntervalFormat::createInstance("yyyyMd", enLocale, status));
1248 if (U_FAILURE(status)) {
1249 dataerrln("Failure encountered: %s", u_errorName(status));
1250 return;
1251 }
1252 UnicodeString actual;
1253 UnicodeString expected(ctou("4/26/0113\\u2009\\u2013\\u20094/28/0113"));
1254 FieldPosition pos = 0;
1255 dif->format(*fromTime, *toTime, actual, pos, status);
1256 if (U_FAILURE(status)) {
1257 errln("Failure encountered: %s", u_errorName(status));
1258 return;
1259 }
1260 if (actual != expected) {
1261 errln("Expected " + expected + ", got: " + actual);
1262 }
1263 }
1264 {
1265 LocalPointer<DateIntervalFormat> dif(DateIntervalFormat::createInstance("yyMd", enLocale, status));
1266 if (U_FAILURE(status)) {
1267 errln("Failure encountered: %s", u_errorName(status));
1268 return;
1269 }
1270 UnicodeString actual;
1271 UnicodeString expected(ctou("4/26/13\\u2009\\u2013\\u20094/28/13"));
1272 FieldPosition pos(FieldPosition::DONT_CARE);
1273 dif->format(*fromTime, *toTime, actual, pos, status);
1274 if (U_FAILURE(status)) {
1275 errln("Failure encountered: %s", u_errorName(status));
1276 return;
1277 }
1278 if (actual != expected) {
1279 errln("Expected " + expected + ", got: " + actual);
1280 }
1281 }
1282 {
1283 LocalPointer<DateIntervalFormat> dif(DateIntervalFormat::createInstance("yMd", enLocale, status));
1284 if (U_FAILURE(status)) {
1285 errln("Failure encountered: %s", u_errorName(status));
1286 return;
1287 }
1288 UnicodeString actual;
1289 UnicodeString expected(ctou("4/26/113\\u2009\\u2013\\u20094/28/113"));
1290 FieldPosition pos(FieldPosition::DONT_CARE);
1291 dif->format(*fromTime, *toTime, actual, pos, status);
1292 if (U_FAILURE(status)) {
1293 errln("Failure encountered: %s", u_errorName(status));
1294 return;
1295 }
1296 if (actual != expected) {
1297 errln("Expected " + expected + ", got: " + actual);
1298 }
1299 }
1300 }
1301
1302 void DateIntervalFormatTest::expectUserDII(const char** data,
1303 int32_t data_length) {
1304 int32_t i = 0;
1305 UnicodeString str;
1306 UErrorCode ec = U_ZERO_ERROR;
1307 const char* pattern = data[0];
1308 i++;
1309
1310 while ( i < data_length ) {
1311 const char* locName = data[i++];
1312 Locale loc(locName);
1313 SimpleDateFormat ref(pattern, loc, ec);
1314 if (U_FAILURE(ec)) {
1315 dataerrln("contruct SimpleDateFormat in expectUserDII failed: %s", u_errorName(ec));
1316 return;
1317 }
1318 const char* datestr = data[i++];
1319 const char* datestr_2 = data[i++];
1320 UDate date = ref.parse(ctou(datestr), ec);
1321 if (!assertSuccess("parse in expectUserDII", ec)) return;
1322 UDate date_2 = ref.parse(ctou(datestr_2), ec);
1323 if (!assertSuccess("parse in expectUserDII", ec)) return;
1324 DateInterval dtitv(date, date_2);
1325
1326 ec = U_ZERO_ERROR;
1327 // test user created DateIntervalInfo
1328 DateIntervalInfo* dtitvinf = new DateIntervalInfo(ec);
1329 dtitvinf->setFallbackIntervalPattern("{0} --- {1}", ec);
1330 dtitvinf->setIntervalPattern(UDAT_YEAR_ABBR_MONTH_DAY, UCAL_MONTH, "yyyy MMM d - MMM y",ec);
1331 if (!assertSuccess("DateIntervalInfo::setIntervalPattern", ec)) return;
1332 dtitvinf->setIntervalPattern(UDAT_YEAR_ABBR_MONTH_DAY, UCAL_HOUR_OF_DAY, "yyyy MMM d HH:mm - HH:mm", ec);
1333 if (!assertSuccess("DateIntervalInfo::setIntervalPattern", ec)) return;
1334 DateIntervalFormat* dtitvfmt = DateIntervalFormat::createInstance(UDAT_YEAR_ABBR_MONTH_DAY, loc, *dtitvinf, ec);
1335 delete dtitvinf;
1336 if (!assertSuccess("createInstance(skeleton,dtitvinf) in expectUserDII", ec)) return;
1337 FieldPosition pos(FieldPosition::DONT_CARE);
1338 dtitvfmt->format(&dtitv, str.remove(), pos, ec);
1339 if (!assertSuccess("format in expectUserDII", ec)) return;
1340 assertEquals((UnicodeString)"\"" + locName + "\\" + datestr + "\\" + datestr_2 + "\"", ctou(data[i++]), str);
1341 #ifdef DTIFMTTS_DEBUG
1342 char result[1000];
1343 char mesg[1000];
1344 PRINTMESG("interval format using user defined DateIntervalInfo\n");
1345 str.extract(0, str.length(), result, "UTF-8");
1346 sprintf(mesg, "interval date: %s\n", result);
1347 PRINTMESG(mesg);
1348 #endif
1349 delete dtitvfmt;
1350 }
1351 }
1352
1353
1354 void DateIntervalFormatTest::testStress() {
1355 if(quick){
1356 logln("Quick mode: Skipping test");
1357 return;
1358 }
1359 const char* DATA[] = {
1360 "yyyy MM dd HH:mm:ss",
1361 "2007 10 10 10:10:10", "2008 10 10 10:10:10",
1362 "2007 10 10 10:10:10", "2007 11 10 10:10:10",
1363 "2007 11 10 10:10:10", "2007 11 20 10:10:10",
1364 "2007 01 10 10:00:10", "2007 01 10 14:10:10",
1365 "2007 01 10 10:00:10", "2007 01 10 10:20:10",
1366 "2007 01 10 10:10:10", "2007 01 10 10:10:20",
1367 };
1368
1369 const char* testLocale[][3] = {
1370 //{"th", "", ""},
1371 {"en", "", ""},
1372 {"zh", "", ""},
1373 {"de", "", ""},
1374 {"ar", "", ""},
1375 {"en", "GB", ""},
1376 {"fr", "", ""},
1377 {"it", "", ""},
1378 {"nl", "", ""},
1379 {"zh", "TW", ""},
1380 {"ja", "", ""},
1381 {"pt", "BR", ""},
1382 {"ru", "", ""},
1383 {"pl", "", ""},
1384 {"tr", "", ""},
1385 {"es", "", ""},
1386 {"ko", "", ""},
1387 {"sv", "", ""},
1388 {"fi", "", ""},
1389 {"da", "", ""},
1390 {"pt", "PT", ""},
1391 {"ro", "", ""},
1392 {"hu", "", ""},
1393 {"he", "", ""},
1394 {"in", "", ""},
1395 {"cs", "", ""},
1396 {"el", "", ""},
1397 {"no", "", ""},
1398 {"vi", "", ""},
1399 {"bg", "", ""},
1400 {"hr", "", ""},
1401 {"lt", "", ""},
1402 {"sk", "", ""},
1403 {"sl", "", ""},
1404 {"sr", "", ""},
1405 {"ca", "", ""},
1406 {"lv", "", ""},
1407 {"uk", "", ""},
1408 {"hi", "", ""},
1409 };
1410
1411 uint32_t localeIndex;
1412 for ( localeIndex = 0; localeIndex < UPRV_LENGTHOF(testLocale); ++localeIndex ) {
1413 char locName[32];
1414 uprv_strcpy(locName, testLocale[localeIndex][0]);
1415 uprv_strcat(locName, testLocale[localeIndex][1]);
1416 stress(DATA, UPRV_LENGTHOF(DATA), Locale(testLocale[localeIndex][0], testLocale[localeIndex][1], testLocale[localeIndex][2]), locName);
1417 }
1418 }
1419
1420
1421 void DateIntervalFormatTest::stress(const char** data, int32_t data_length,
1422 const Locale& loc, const char* locName) {
1423 UnicodeString skeleton[] = {
1424 "EEEEdMMMMy",
1425 "dMMMMy",
1426 "dMMMM",
1427 "MMMMy",
1428 "EEEEdMMMM",
1429 "EdMMMy",
1430 "dMMMy",
1431 "dMMM",
1432 "MMMy",
1433 "EdMMM",
1434 "EdMy",
1435 "dMy",
1436 "dM",
1437 "My",
1438 "EdM",
1439 "d",
1440 "Ed",
1441 "y",
1442 "M",
1443 "MMM",
1444 "MMMM",
1445 "hm",
1446 "hmv",
1447 "hmz",
1448 "h",
1449 "hv",
1450 "hz",
1451 "EEddMMyyyy", // following could be normalized
1452 "EddMMy",
1453 "hhmm",
1454 "hhmmzz",
1455 "hms", // following could not be normalized
1456 "dMMMMMy",
1457 "EEEEEdM",
1458 };
1459
1460 int32_t i = 0;
1461 UErrorCode ec = U_ZERO_ERROR;
1462 UnicodeString str, str2;
1463 SimpleDateFormat ref(data[i++], loc, ec);
1464 if (!assertSuccess("construct SimpleDateFormat", ec)) return;
1465
1466 #ifdef DTIFMTTS_DEBUG
1467 char result[1000];
1468 char mesg[1000];
1469 sprintf(mesg, "locale: %s\n", locName);
1470 PRINTMESG(mesg);
1471 #endif
1472
1473 while (i<data_length) {
1474
1475 // 'f'
1476 const char* datestr = data[i++];
1477 const char* datestr_2 = data[i++];
1478 #ifdef DTIFMTTS_DEBUG
1479 sprintf(mesg, "original date: %s - %s\n", datestr, datestr_2);
1480 PRINTMESG(mesg)
1481 #endif
1482 UDate date = ref.parse(ctou(datestr), ec);
1483 if (!assertSuccess("parse", ec)) return;
1484 UDate date_2 = ref.parse(ctou(datestr_2), ec);
1485 if (!assertSuccess("parse", ec)) return;
1486 DateInterval dtitv(date, date_2);
1487
1488 for ( uint32_t skeletonIndex = 0;
1489 skeletonIndex < UPRV_LENGTHOF(skeleton);
1490 ++skeletonIndex ) {
1491 const UnicodeString& oneSkeleton = skeleton[skeletonIndex];
1492 DateIntervalFormat* dtitvfmt = DateIntervalFormat::createInstance(oneSkeleton, loc, ec);
1493 if (!assertSuccess("createInstance(skeleton)", ec)) return;
1494 /*
1495 // reset the calendar to be Gregorian calendar for "th"
1496 if ( uprv_strcmp(locName, "th") == 0 ) {
1497 GregorianCalendar* gregCal = new GregorianCalendar(loc, ec);
1498 if (!assertSuccess("GregorianCalendar()", ec)) return;
1499 const DateFormat* dformat = dtitvfmt->getDateFormat();
1500 DateFormat* newOne = dformat->clone();
1501 newOne->adoptCalendar(gregCal);
1502 //dtitvfmt->adoptDateFormat(newOne, ec);
1503 dtitvfmt->setDateFormat(*newOne, ec);
1504 delete newOne;
1505 if (!assertSuccess("adoptDateFormat()", ec)) return;
1506 }
1507 */
1508 FieldPosition pos(FieldPosition::DONT_CARE);
1509 dtitvfmt->format(&dtitv, str.remove(), pos, ec);
1510 if (!assertSuccess("format", ec)) return;
1511 #ifdef DTIFMTTS_DEBUG
1512 oneSkeleton.extract(0, oneSkeleton.length(), result, "UTF-8");
1513 sprintf(mesg, "interval by skeleton: %s\n", result);
1514 PRINTMESG(mesg)
1515 str.extract(0, str.length(), result, "UTF-8");
1516 sprintf(mesg, "interval date: %s\n", result);
1517 PRINTMESG(mesg)
1518 #endif
1519 delete dtitvfmt;
1520 }
1521
1522 // test user created DateIntervalInfo
1523 ec = U_ZERO_ERROR;
1524 DateIntervalInfo* dtitvinf = new DateIntervalInfo(ec);
1525 dtitvinf->setFallbackIntervalPattern("{0} --- {1}", ec);
1526 dtitvinf->setIntervalPattern(UDAT_YEAR_ABBR_MONTH_DAY, UCAL_MONTH, "yyyy MMM d - MMM y",ec);
1527 if (!assertSuccess("DateIntervalInfo::setIntervalPattern", ec)) return;
1528 dtitvinf->setIntervalPattern(UDAT_YEAR_ABBR_MONTH_DAY, UCAL_HOUR_OF_DAY, "yyyy MMM d HH:mm - HH:mm", ec);
1529 if (!assertSuccess("DateIntervalInfo::setIntervalPattern", ec)) return;
1530 DateIntervalFormat* dtitvfmt = DateIntervalFormat::createInstance(UDAT_YEAR_ABBR_MONTH_DAY, loc, *dtitvinf, ec);
1531 delete dtitvinf;
1532 if (!assertSuccess("createInstance(skeleton,dtitvinf)", ec)) return;
1533 FieldPosition pos(FieldPosition::DONT_CARE);
1534 dtitvfmt->format(&dtitv, str.remove(), pos, ec);
1535 if ( uprv_strcmp(locName, "th") ) {
1536 if (!assertSuccess("format", ec)) return;
1537 #ifdef DTIFMTTS_DEBUG
1538 PRINTMESG("interval format using user defined DateIntervalInfo\n");
1539 str.extract(0, str.length(), result, "UTF-8");
1540 sprintf(mesg, "interval date: %s\n", result);
1541 PRINTMESG(mesg)
1542 #endif
1543 } else {
1544 // for "th", the default calendar is Budhist,
1545 // not Gregorian.
1546 assertTrue("Default calendar for \"th\" is Budhist", ec == U_ILLEGAL_ARGUMENT_ERROR);
1547 ec = U_ZERO_ERROR;
1548 }
1549 delete dtitvfmt;
1550 }
1551 }
1552
1553 void DateIntervalFormatTest::testTicket11583_2() {
1554 UErrorCode status = U_ZERO_ERROR;
1555 LocalPointer<DateIntervalFormat> fmt(
1556 DateIntervalFormat::createInstance("yMMM", "es-US", status));
1557 if (!assertSuccess("Error create format object", status)) {
1558 return;
1559 }
1560 DateInterval interval((UDate) 1232364615000.0, (UDate) 1328787015000.0);
1561 UnicodeString appendTo;
1562 FieldPosition fpos(FieldPosition::DONT_CARE);
1563 UnicodeString expected("ene. 2009\\u2009\\u2013\\u2009feb. 2012");
1564 assertEquals(
1565 "",
1566 expected.unescape(),
1567 fmt->format(&interval, appendTo, fpos, status));
1568 if (!assertSuccess("Error formatting", status)) {
1569 return;
1570 }
1571 }
1572
1573
1574 void DateIntervalFormatTest::testTicket11985() {
1575 UErrorCode status = U_ZERO_ERROR;
1576 LocalPointer<DateIntervalFormat> fmt(
1577 DateIntervalFormat::createInstance(UDAT_HOUR_MINUTE, Locale::getEnglish(), status));
1578 if (!assertSuccess("createInstance", status)) {
1579 return;
1580 }
1581 UnicodeString pattern;
1582 static_cast<const SimpleDateFormat*>(fmt->getDateFormat())->toPattern(pattern);
1583 assertEquals("Format pattern", "h:mm a", pattern);
1584 }
1585
1586 // Ticket 11669 - thread safety of DateIntervalFormat::format(). This test failed before
1587 // the implementation was fixed.
1588
1589 static const DateIntervalFormat *gIntervalFormatter = NULL; // The Formatter to be used concurrently by test threads.
1590 static const DateInterval *gInterval = NULL; // The date interval to be formatted concurrently.
1591 static const UnicodeString *gExpectedResult = NULL;
1592
1593 void DateIntervalFormatTest::threadFunc11669(int32_t threadNum) {
1594 (void)threadNum;
1595 for (int loop=0; loop<1000; ++loop) {
1596 UErrorCode status = U_ZERO_ERROR;
1597 FieldPosition pos(FieldPosition::DONT_CARE);
1598 UnicodeString result;
1599 gIntervalFormatter->format(gInterval, result, pos, status);
1600 if (U_FAILURE(status)) {
1601 errln("%s:%d %s", __FILE__, __LINE__, u_errorName(status));
1602 return;
1603 }
1604 if (result != *gExpectedResult) {
1605 errln("%s:%d Expected \"%s\", got \"%s\"", __FILE__, __LINE__, CStr(*gExpectedResult)(), CStr(result)());
1606 return;
1607 }
1608 }
1609 }
1610
1611 void DateIntervalFormatTest::testTicket11669() {
1612 UErrorCode status = U_ZERO_ERROR;
1613 LocalPointer<DateIntervalFormat> formatter(DateIntervalFormat::createInstance(UDAT_YEAR_MONTH_DAY, Locale::getEnglish(), status), status);
1614 LocalPointer<TimeZone> tz(TimeZone::createTimeZone("America/Los_Angleles"), status);
1615 LocalPointer<Calendar> intervalStart(Calendar::createInstance(*tz, Locale::getEnglish(), status), status);
1616 LocalPointer<Calendar> intervalEnd(Calendar::createInstance(*tz, Locale::getEnglish(), status), status);
1617 if (U_FAILURE(status)) {
1618 errcheckln(status, "%s:%d %s", __FILE__, __LINE__, u_errorName(status));
1619 return;
1620 }
1621
1622 intervalStart->set(2009, 6, 1, 14, 0);
1623 intervalEnd->set(2009, 6, 2, 14, 0);
1624 DateInterval interval(intervalStart->getTime(status), intervalEnd->getTime(status));
1625 FieldPosition pos(FieldPosition::DONT_CARE);
1626 UnicodeString expectedResult;
1627 formatter->format(&interval, expectedResult, pos, status);
1628 if (U_FAILURE(status)) {
1629 errln("%s:%d %s", __FILE__, __LINE__, u_errorName(status));
1630 return;
1631 }
1632
1633 gInterval = &interval;
1634 gIntervalFormatter = formatter.getAlias();
1635 gExpectedResult = &expectedResult;
1636
1637 ThreadPool<DateIntervalFormatTest> threads(this, 4, &DateIntervalFormatTest::threadFunc11669);
1638 threads.start();
1639 threads.join();
1640
1641 gInterval = NULL; // Don't leave dangling pointers lying around. Not strictly necessary.
1642 gIntervalFormatter = NULL;
1643 gExpectedResult = NULL;
1644 }
1645
1646
1647 // testTicket12065
1648 // Using a DateIntervalFormat to format shouldn't change its state in any way
1649 // that changes how the behavior of operator ==.
1650 void DateIntervalFormatTest::testTicket12065() {
1651 UErrorCode status = U_ZERO_ERROR;
1652 LocalPointer<DateIntervalFormat> formatter(DateIntervalFormat::createInstance(UDAT_YEAR_MONTH_DAY, Locale::getEnglish(), status), status);
1653 if (formatter.isNull()) {
1654 dataerrln("FAIL: DateIntervalFormat::createInstance failed for Locale::getEnglish()");
1655 return;
1656 }
1657 LocalPointer<DateIntervalFormat> clone(formatter->clone());
1658 if (*formatter != *clone) {
1659 errln("%s:%d DateIntervalFormat and clone are not equal.", __FILE__, __LINE__);
1660 return;
1661 }
1662 DateInterval interval((UDate) 1232364615000.0, (UDate) 1328787015000.0);
1663 UnicodeString appendTo;
1664 FieldPosition fpos(FieldPosition::DONT_CARE);
1665 formatter->format(&interval, appendTo, fpos, status);
1666 if (*formatter != *clone) {
1667 errln("%s:%d DateIntervalFormat and clone are not equal after formatting.", __FILE__, __LINE__);
1668 return;
1669 }
1670 if (U_FAILURE(status)) {
1671 errln("%s:%d %s", __FILE__, __LINE__, u_errorName(status));
1672 }
1673 }
1674
1675
1676 void DateIntervalFormatTest::testFormattedDateInterval() {
1677 IcuTestErrorCode status(*this, "testFormattedDateInterval");
1678 LocalPointer<DateIntervalFormat> fmt(DateIntervalFormat::createInstance(u"dMMMMy", "en-US", status), status);
1679
1680 {
1681 const char16_t* message = u"FormattedDateInterval test 1";
1682 const char16_t* expectedString = u"July 20\u2009\u2013\u200925, 2018";
1683 LocalPointer<Calendar> input1(Calendar::createInstance("en-GB", status));
1684 if (status.errIfFailureAndReset()) { return; }
1685 LocalPointer<Calendar> input2(Calendar::createInstance("en-GB", status));
1686 if (status.errIfFailureAndReset()) { return; }
1687 input1->set(2018, 6, 20);
1688 input2->set(2018, 6, 25);
1689 FormattedDateInterval result = fmt->formatToValue(*input1, *input2, status);
1690 static const UFieldPositionWithCategory expectedFieldPositions[] = {
1691 // field, begin index, end index
1692 {UFIELD_CATEGORY_DATE, UDAT_MONTH_FIELD, 0, 4},
1693 {UFIELD_CATEGORY_DATE_INTERVAL_SPAN, 0, 5, 7},
1694 {UFIELD_CATEGORY_DATE, UDAT_DATE_FIELD, 5, 7},
1695 {UFIELD_CATEGORY_DATE_INTERVAL_SPAN, 1, 10, 12},
1696 {UFIELD_CATEGORY_DATE, UDAT_DATE_FIELD, 10, 12},
1697 {UFIELD_CATEGORY_DATE, UDAT_YEAR_FIELD, 14, 18}};
1698 checkMixedFormattedValue(
1699 message,
1700 result,
1701 expectedString,
1702 expectedFieldPositions,
1703 UPRV_LENGTHOF(expectedFieldPositions));
1704 }
1705
1706 {
1707 const char16_t* message = u"FormattedDateInterval identical dates test: no span field";
1708 const char16_t* expectedString = u"July 20, 2018";
1709 LocalPointer<Calendar> input1(Calendar::createInstance("en-GB", status));
1710 input1->set(2018, 6, 20);
1711 FormattedDateInterval result = fmt->formatToValue(*input1, *input1, status);
1712 static const UFieldPositionWithCategory expectedFieldPositions[] = {
1713 // field, begin index, end index
1714 {UFIELD_CATEGORY_DATE, UDAT_MONTH_FIELD, 0, 4},
1715 {UFIELD_CATEGORY_DATE, UDAT_DATE_FIELD, 5, 7},
1716 {UFIELD_CATEGORY_DATE, UDAT_YEAR_FIELD, 9, 13}};
1717 checkMixedFormattedValue(
1718 message,
1719 result,
1720 expectedString,
1721 expectedFieldPositions,
1722 UPRV_LENGTHOF(expectedFieldPositions));
1723 }
1724
1725 // Test sample code
1726 {
1727 LocalPointer<Calendar> input1(Calendar::createInstance("en-GB", status));
1728 LocalPointer<Calendar> input2(Calendar::createInstance("en-GB", status));
1729 input1->set(2018, 6, 20);
1730 input2->set(2018, 7, 3);
1731
1732 // Let fmt be a DateIntervalFormat for locale en-US and skeleton dMMMMy
1733 // Let input1 be July 20, 2018 and input2 be August 3, 2018:
1734 FormattedDateInterval result = fmt->formatToValue(*input1, *input2, status);
1735 assertEquals("Expected output from format",
1736 u"July 20\u2009\u2013\u2009August 3, 2018", result.toString(status)); // Apple data mod
1737 ConstrainedFieldPosition cfpos;
1738 cfpos.constrainField(UFIELD_CATEGORY_DATE_INTERVAL_SPAN, 0);
1739 if (result.nextPosition(cfpos, status)) {
1740 assertEquals("Expect start index", 0, cfpos.getStart());
1741 assertEquals("Expect end index", 7, cfpos.getLimit());
1742 } else {
1743 // No such span: can happen if input dates are equal.
1744 }
1745 assertFalse("No more than one occurrence of the field",
1746 result.nextPosition(cfpos, status));
1747 }
1748
1749 // To test the fallback pattern behavior, make a custom DateIntervalInfo.
1750 DateIntervalInfo dtitvinf(status);
1751 dtitvinf.setFallbackIntervalPattern("<< {1} --- {0} >>", status);
1752 fmt.adoptInsteadAndCheckErrorCode(
1753 DateIntervalFormat::createInstance(u"dMMMMy", "en-US", dtitvinf, status),
1754 status);
1755
1756 {
1757 const char16_t* message = u"FormattedDateInterval with fallback format test 1";
1758 const char16_t* expectedString = u"<< July 25, 2018 --- July 20, 2018 >>";
1759 LocalPointer<Calendar> input1(Calendar::createInstance("en-GB", status));
1760 if (status.errIfFailureAndReset()) { return; }
1761 LocalPointer<Calendar> input2(Calendar::createInstance("en-GB", status));
1762 if (status.errIfFailureAndReset()) { return; }
1763 input1->set(2018, 6, 20);
1764 input2->set(2018, 6, 25);
1765 FormattedDateInterval result = fmt->formatToValue(*input1, *input2, status);
1766 static const UFieldPositionWithCategory expectedFieldPositions[] = {
1767 // field, begin index, end index
1768 {UFIELD_CATEGORY_DATE_INTERVAL_SPAN, 1, 3, 16},
1769 {UFIELD_CATEGORY_DATE, UDAT_MONTH_FIELD, 3, 7},
1770 {UFIELD_CATEGORY_DATE, UDAT_DATE_FIELD, 8, 10},
1771 {UFIELD_CATEGORY_DATE, UDAT_YEAR_FIELD, 12, 16},
1772 {UFIELD_CATEGORY_DATE_INTERVAL_SPAN, 0, 21, 34},
1773 {UFIELD_CATEGORY_DATE, UDAT_MONTH_FIELD, 21, 25},
1774 {UFIELD_CATEGORY_DATE, UDAT_DATE_FIELD, 26, 28},
1775 {UFIELD_CATEGORY_DATE, UDAT_YEAR_FIELD, 30, 34}};
1776 checkMixedFormattedValue(
1777 message,
1778 result,
1779 expectedString,
1780 expectedFieldPositions,
1781 UPRV_LENGTHOF(expectedFieldPositions));
1782 }
1783 }
1784
1785 void DateIntervalFormatTest::testCreateInstanceForAllLocales() {
1786 IcuTestErrorCode status(*this, "testCreateInstanceForAllLocales");
1787 int32_t locale_count = 0;
1788 const Locale* locales = icu::Locale::getAvailableLocales(locale_count);
1789 // Iterate through all locales
1790 for (int32_t i = 0; i < locale_count; i++) {
1791 std::unique_ptr<icu::StringEnumeration> calendars(
1792 icu::Calendar::getKeywordValuesForLocale(
1793 "calendar", locales[i], FALSE, status));
1794 int32_t calendar_count = calendars->count(status);
1795 if (status.errIfFailureAndReset()) { break; }
1796 // In quick mode, only run 1/5 of locale combination
1797 // to make the test run faster.
1798 if (quick && (i % 5 != 0)) continue;
1799 LocalPointer<DateIntervalFormat> fmt(
1800 DateIntervalFormat::createInstance(u"dMMMMy", locales[i], status),
1801 status);
1802 if (status.errIfFailureAndReset(locales[i].getName())) {
1803 continue;
1804 }
1805 // Iterate through all calendars in this locale
1806 for (int32_t j = 0; j < calendar_count; j++) {
1807 // In quick mode, only run 1/7 of locale/calendar combination
1808 // to make the test run faster.
1809 if (quick && ((i * j) % 7 != 0)) continue;
1810 const char* calendar = calendars->next(nullptr, status);
1811 Locale locale(locales[i]);
1812 locale.setKeywordValue("calendar", calendar, status);
1813 fmt.adoptInsteadAndCheckErrorCode(
1814 DateIntervalFormat::createInstance(u"dMMMMy", locale, status),
1815 status);
1816 status.errIfFailureAndReset(locales[i].getName());
1817 }
1818 }
1819 }
1820
1821 #endif /* #if !UCONFIG_NO_FORMATTING */