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