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