Upstream version 9.38.198.0
[platform/framework/web/crosswalk.git] / src / third_party / icu / source / test / intltest / dtifmtts.cpp
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
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  */
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  */
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         "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", 
995         
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
1036     };
1037     expect(DATA, ARRAY_SIZE(DATA));
1038 }
1039
1040
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  */
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
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
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
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
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
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 */