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