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