• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 
2 /********************************************************************
3  * COPYRIGHT:
4  * Copyright (c) 1997-2011, 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         "zh", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "hmv", "2007\\u5e7410\\u670810\\u65e5 \\u4e0a\\u534810:10 \\u7f8e\\u56fd\\u65F6\\u95F4\\uff08\\u6d1b\\u6749\\u77f6\\uff09\\u20132007\\u5e7411\\u670810\\u65e5 \\u4e0a\\u534810:10 \\u7f8e\\u56fd\\u65F6\\u95F4\\uff08\\u6d1b\\u6749\\u77f6\\uff09",
769 
770         "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",
771 
772 
773         "zh", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "dMMMM", "11\\u670810\\u65e5\\u81f320\\u65e5",
774 
775         "zh", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "MMMMy", "2007\\u5E7411\\u6708", // (fixed expected result per ticket:6626:)
776 
777         "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",
778 
779 
780         "zh", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "EdMy", "07-11-10\\u5468\\u516d\\u81f307-11-20\\u5468\\u4e8c",
781 
782 
783         "zh", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "dM", "11-10\\u81f311-20",
784 
785         "zh", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "My", "2007-11",
786 
787         "zh", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "EdM", "11-10\\u5468\\u516d\\u81f311-20\\u5468\\u4e8c",
788 
789 
790         "zh", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "y", "2007\\u5E74", // (fixed expected result per ticket:6626:)
791 
792         "zh", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "M", "11\\u6708",
793 
794         "zh", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "MMM", "\\u5341\\u4E00\\u6708", // (fixed expected result per ticket:6626: and others)
795 
796 
797         "zh", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "hmz", "2007\\u5e7411\\u670810\\u65e5 \\u4e0a\\u534810:10 \\u683c\\u6797\\u5c3c\\u6cbb\\u6807\\u51c6\\u65f6\\u95f4-0800\\u20132007\\u5e7411\\u670820\\u65e5 \\u4e0a\\u534810:10 \\u683c\\u6797\\u5c3c\\u6cbb\\u6807\\u51c6\\u65f6\\u95f4-0800",
798 
799         "zh", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "h", "2007\\u5e7411\\u670810\\u65e5 \\u4e0a\\u534810\\u65f6\\u20132007\\u5e7411\\u670820\\u65e5 \\u4e0a\\u534810\\u65f6",
800 
801         "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:)
802 
803         "zh", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "hm", "\\u4e0a\\u534810:00\\u81f3\\u4e0b\\u53482:10",
804 
805 
806         "zh", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "hmz", "\\u683c\\u6797\\u5c3c\\u6cbb\\u6807\\u51c6\\u65f6\\u95f4-0800\\u4e0a\\u534810:00\\u81f3\\u4e0b\\u53482:10",
807 
808         "zh", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "h", "\\u4e0a\\u534810\\u81f3\\u4e0b\\u53482\\u65f6",
809 
810         "zh", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "hv", "\\u7f8e\\u56fd\\u65F6\\u95F4\\uff08\\u6d1b\\u6749\\u77f6\\uff09\\u4e0a\\u534810\\u81f3\\u4e0b\\u53482\\u65f6",
811 
812         "zh", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "hm", "\\u4e0a\\u534810:00\\u81f310:20",
813 
814         "zh", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "hmv", "\\u7f8e\\u56fd\\u65F6\\u95F4\\uff08\\u6d1b\\u6749\\u77f6\\uff09\\u4e0a\\u534810:00\\u81f310:20",
815 
816         "zh", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "hz", "\\u4e0a\\u534810\\u65f6 \\u683c\\u6797\\u5c3c\\u6cbb\\u6807\\u51c6\\u65f6\\u95f4-0800",
817 
818         "zh", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "hm", "\\u4e0a\\u534810:10",
819 
820         "zh", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "h", "\\u4e0a\\u534810\\u65f6",
821 
822         "de", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "EEEEdMMMy", "Mittwoch, 10. Okt 2007 - Freitag, 10. Okt 2008",
823 
824 
825         "de", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "dMMM", "10. Okt 2007 - 10. Okt 2008",
826 
827         "de", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "MMMy", "Okt 2007 - Okt 2008",
828 
829 
830         "de", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "EdMy", "Mi., 10.10.07 - Fr., 10.10.08",
831 
832         "de", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "dMy", "10.10.07 - 10.10.08",
833 
834 
835         "de", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "My", "10.07 - 10.08",
836 
837         "de", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "EdM", "Mi., 10.10.07 - Fr., 10.10.08",
838 
839 
840         "de", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "y", "2007-2008",
841 
842         "de", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "M", "10.07 - 10.08",
843 
844 
845         "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.",
846         "de", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "Hm", "10.10.2007 10:10 - 10.10.2008 10:10",
847 
848         "de", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "EEEEdMMMy", "Mittwoch, 10. Okt - Samstag, 10. Nov 2007",
849 
850 
851         "de", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "dMMM", "10. Okt - 10. Nov",
852 
853         "de", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "MMMy", "Okt-Nov 2007",
854 
855         "de", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "EEEEdMMM", "Mittwoch, 10. Okt - Samstag, 10. Nov",
856 
857 
858         "de", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "dM", "10.10. - 10.11.",
859 
860         "de", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "My", "10.07 - 11.07",
861 
862 
863         "de", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "d", "10.10. - 10.11.",
864 
865         "de", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "y", "2007",
866 
867 
868         "de", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "MMM", "Okt-Nov",
869 
870 
871         "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.",
872         "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",
873 
874         "de", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "EEEEdMMMy", "Samstag, 10. - Dienstag, 20. Nov 2007",
875 
876         "de", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "dMMMy", "10.-20. Nov 2007",
877 
878 
879         "de", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "MMMy", "Nov 2007",
880 
881         "de", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "EEEEdMMM", "Samstag, 10. - Dienstag, 20. Nov",
882 
883         "de", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "EdMy", "Sa., 10.11.07 - Di., 20.11.07",
884 
885 
886         "de", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "dM", "10.11. - 20.11.",
887 
888         "de", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "My", "11.2007",
889 
890 
891         "de", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "d", "10.-20.",
892 
893         "de", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "y", "2007",
894 
895 
896         "de", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "hmv", "10.11.2007 10:10 vorm. Vereinigte Staaten Zeit (Los Angeles) - 20.11.2007 10:10 vorm. Vereinigte Staaten Zeit (Los Angeles)",
897 
898         "de", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "EEEEdMMMy", "Mittwoch, 10. Jan 2007",
899 
900 
901         "de", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "dMMM", "10. Jan",
902 
903         "de", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "MMMy", "Jan 2007",
904 
905         "de", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "EEEEdMMM", "Mittwoch, 10. Jan",
906 
907 
908         "de", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "h", "10 vorm. - 2 nachm.",
909         "de", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "H", "10-14 Uhr",
910 
911         "de", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "EEEEdMMM", "Mittwoch, 10. Jan",
912 
913 
914         "de", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "hmv", "10:00-10:20 vorm. Vereinigte Staaten Zeit (Los Angeles)",
915 
916         "de", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "hmz", "10:00-10:20 vorm. GMT-08:00",
917 
918         "de", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "h", "10 vorm.",
919         "de", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "H", "10 Uhr",
920 
921 
922         "de", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "hz", "10 vorm. GMT-08:00",
923 
924         "de", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "EEEEdMMMy", "Mittwoch, 10. Jan 2007",
925 
926 
927         "de", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "hmv", "10:10 vorm. Vereinigte Staaten Zeit (Los Angeles)",
928 
929         "de", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "hmz", "10:10 vorm. GMT-08:00",
930 
931 
932         "de", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "hv", "10 vorm. Vereinigte Staaten Zeit (Los Angeles)",
933 
934         "de", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "hz", "10 vorm. GMT-08:00",
935 
936         // Thai (default calendar buddhist)
937 
938         "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",
939 
940 
941         "th", "2550 10 10 10:10:10", "2551 10 10 10:10:10", "dMMM", "10 \\u0E15.\\u0E04. 2550 \\u2013 10 \\u0E15.\\u0E04. 2551",
942 
943         "th", "2550 10 10 10:10:10", "2551 10 10 10:10:10", "MMMy", "\\u0E15.\\u0E04. 2550 - \\u0E15.\\u0E04. 2551",
944 
945 
946         "th", "2550 10 10 10:10:10", "2551 10 10 10:10:10", "EdMy", "\\u0E1E. 10/10/50 \\u2013 \\u0E28. 10/10/51",
947 
948         "th", "2550 10 10 10:10:10", "2551 10 10 10:10:10", "dMy", "10/10/50 \\u2013 10/10/51",
949 
950 
951         "th", "2550 10 10 10:10:10", "2551 10 10 10:10:10", "My", "10/50 \\u2013 10/51",
952 
953         "th", "2550 10 10 10:10:10", "2551 10 10 10:10:10", "EdM", "\\u0E1E. 10/10/50 \\u2013 \\u0E28. 10/10/51",
954 
955 
956         "th", "2550 10 10 10:10:10", "2551 10 10 10:10:10", "y", "2550-2551",
957 
958         "th", "2550 10 10 10:10:10", "2551 10 10 10:10:10", "M", "10/50 \\u2013 10/51",
959 
960 
961         "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",
962 
963 
964         "th", "2550 10 10 10:10:10", "2550 11 10 10:10:10", "dMMM", "10 \\u0E15.\\u0E04. \\u2013 10 \\u0E1E.\\u0E22.",
965 
966         "th", "2550 10 10 10:10:10", "2550 11 10 10:10:10", "MMMy", "\\u0E15.\\u0E04.-\\u0E1E.\\u0E22. 2550",
967 
968        "th", "2550 10 10 10:10:10", "2550 11 10 10:10:10", "dM", "10/10 - 10/11",
969 
970         "th", "2550 10 10 10:10:10", "2550 11 10 10:10:10", "My", "10/50 \\u2013 11/50",
971 
972 
973         "th", "2550 10 10 10:10:10", "2550 11 10 10:10:10", "d", "10/10 - 10/11",
974 
975         "th", "2550 10 10 10:10:10", "2550 11 10 10:10:10", "y", "\\u0E1E.\\u0E28. 2550",
976 
977 
978         "th", "2550 10 10 10:10:10", "2550 11 10 10:10:10", "MMM", "\\u0E15.\\u0E04.-\\u0E1E.\\u0E22.",
979 
980     };
981     expect(DATA, ARRAY_SIZE(DATA));
982 }
983 
984 
expect(const char ** data,int32_t data_length)985 void DateIntervalFormatTest::expect(const char** data, int32_t data_length) {
986     int32_t i = 0;
987     UErrorCode ec = U_ZERO_ERROR;
988     UnicodeString str, str2;
989     const char* pattern = data[0];
990     i++;
991 
992 #ifdef DTIFMTTS_DEBUG
993     char result[1000];
994     char mesg[1000];
995     sprintf(mesg, "locale: %s\n", locName);
996     PRINTMESG(mesg);
997 #endif
998 
999     while (i<data_length) {
1000         const char* locName = data[i++];
1001         Locale loc(locName);
1002         SimpleDateFormat ref(pattern, loc, ec);
1003         if (U_FAILURE(ec)) {
1004             dataerrln("contruct SimpleDateFormat in expect failed: %s", u_errorName(ec));
1005             return;
1006         }
1007         // 'f'
1008         const char* datestr = data[i++];
1009         const char* datestr_2 = data[i++];
1010 #ifdef DTIFMTTS_DEBUG
1011         sprintf(mesg, "original date: %s - %s\n", datestr, datestr_2);
1012         PRINTMESG(mesg)
1013 #endif
1014         UDate date = ref.parse(ctou(datestr), ec);
1015         if (!assertSuccess("parse 1st data in expect", ec)) return;
1016         UDate date_2 = ref.parse(ctou(datestr_2), ec);
1017         if (!assertSuccess("parse 2nd data in expect", ec)) return;
1018         DateInterval dtitv(date, date_2);
1019 
1020         const UnicodeString& oneSkeleton = data[i++];
1021 
1022         DateIntervalFormat* dtitvfmt = DateIntervalFormat::createInstance(oneSkeleton, loc, ec);
1023         if (!assertSuccess("createInstance(skeleton) in expect", ec)) return;
1024         FieldPosition pos=0;
1025         dtitvfmt->format(&dtitv, str.remove(), pos, ec);
1026         if (!assertSuccess("format in expect", ec)) return;
1027         assertEquals((UnicodeString)"\"" + locName + "\\" + oneSkeleton + "\\" + datestr + "\\" + datestr_2 + "\"", ctou(data[i++]), str);
1028 
1029 
1030 
1031 #ifdef DTIFMTTS_DEBUG
1032         str.extract(0,  str.length(), result, "UTF-8");
1033         sprintf(mesg, "interval date: %s\n", result);
1034         std::cout << "//";
1035         PRINTMESG(mesg)
1036         std::cout << "\"" << locName << "\", "
1037                  << "\"" << datestr << "\", "
1038                  << "\"" << datestr_2 << "\", ";
1039         printUnicodeString(oneSkeleton);
1040         printUnicodeString(str);
1041         std::cout << "\n\n";
1042 #endif
1043         delete dtitvfmt;
1044     }
1045 }
1046 
1047 
1048 /*
1049  * Test format using user defined DateIntervalInfo
1050  */
testFormatUserDII()1051 void DateIntervalFormatTest::testFormatUserDII() {
1052     // first item is date pattern
1053     const char* DATA[] = {
1054         "yyyy MM dd HH:mm:ss",
1055         "en", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "Oct 10, 2007 --- Oct 10, 2008",
1056 
1057         "en", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "2007 Oct 10 - Nov 2007",
1058 
1059         "en", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "Nov 10, 2007 --- Nov 20, 2007",
1060 
1061         "en", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "Jan 10, 2007",
1062 
1063         "en", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "Jan 10, 2007",
1064 
1065         "en", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "Jan 10, 2007",
1066 
1067         "zh", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "2007\\u5e7410\\u670810\\u65e5 --- 2008\\u5e7410\\u670810\\u65e5",
1068 
1069         "zh", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "2007 10\\u6708 10 - 11\\u6708 2007",
1070 
1071         "zh", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "2007\\u5e7411\\u670810\\u65e5 --- 2007\\u5e7411\\u670820\\u65e5",
1072 
1073         "zh", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "2007\\u5e741\\u670810\\u65e5", // (fixed expected result per ticket:6626:)
1074 
1075         "zh", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "2007\\u5e741\\u670810\\u65e5", // (fixed expected result per ticket:6626:)
1076 
1077         "zh", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "2007\\u5e741\\u670810\\u65e5", // (fixed expected result per ticket:6626:)
1078 
1079         "de", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "10. Okt 2007 --- 10. Okt 2008",
1080 
1081 
1082         "de", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "10. Nov 2007 --- 20. Nov 2007",
1083 
1084         "de", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "10. Jan 2007",
1085 
1086         "de", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "10. Jan 2007",
1087 
1088 
1089         "es", "2007 10 10 10:10:10", "2008 10 10 10:10:10", "10 oct 2007 --- 10 oct 2008",
1090 
1091         "es", "2007 10 10 10:10:10", "2007 11 10 10:10:10", "2007 oct 10 - nov 2007",
1092 
1093         "es", "2007 11 10 10:10:10", "2007 11 20 10:10:10", "10 nov 2007 --- 20 nov 2007",
1094 
1095         "es", "2007 01 10 10:00:10", "2007 01 10 14:10:10", "10 ene 2007",
1096 
1097         "es", "2007 01 10 10:00:10", "2007 01 10 10:20:10", "10 ene 2007",
1098 
1099         "es", "2007 01 10 10:10:10", "2007 01 10 10:10:20", "10 ene 2007",
1100     };
1101     expectUserDII(DATA, ARRAY_SIZE(DATA));
1102 }
1103 
1104 
expectUserDII(const char ** data,int32_t data_length)1105 void DateIntervalFormatTest::expectUserDII(const char** data,
1106                                            int32_t data_length) {
1107     int32_t i = 0;
1108     UnicodeString str;
1109     UErrorCode ec = U_ZERO_ERROR;
1110     const char* pattern = data[0];
1111     i++;
1112 
1113     while ( i < data_length ) {
1114         const char* locName = data[i++];
1115         Locale loc(locName);
1116         SimpleDateFormat ref(pattern, loc, ec);
1117         if (U_FAILURE(ec)) {
1118             dataerrln("contruct SimpleDateFormat in expectUserDII failed: %s", u_errorName(ec));
1119             return;
1120         }
1121         const char* datestr = data[i++];
1122         const char* datestr_2 = data[i++];
1123         UDate date = ref.parse(ctou(datestr), ec);
1124         if (!assertSuccess("parse in expectUserDII", ec)) return;
1125         UDate date_2 = ref.parse(ctou(datestr_2), ec);
1126         if (!assertSuccess("parse in expectUserDII", ec)) return;
1127         DateInterval dtitv(date, date_2);
1128 
1129         ec = U_ZERO_ERROR;
1130         // test user created DateIntervalInfo
1131         DateIntervalInfo* dtitvinf = new DateIntervalInfo(ec);
1132         dtitvinf->setFallbackIntervalPattern("{0} --- {1}", ec);
1133         dtitvinf->setIntervalPattern(UDAT_YEAR_ABBR_MONTH_DAY, UCAL_MONTH, "yyyy MMM d - MMM y",ec);
1134         if (!assertSuccess("DateIntervalInfo::setIntervalPattern", ec)) return;
1135         dtitvinf->setIntervalPattern(UDAT_YEAR_ABBR_MONTH_DAY, UCAL_HOUR_OF_DAY, "yyyy MMM d HH:mm - HH:mm", ec);
1136         if (!assertSuccess("DateIntervalInfo::setIntervalPattern", ec)) return;
1137         DateIntervalFormat* dtitvfmt = DateIntervalFormat::createInstance(UDAT_YEAR_ABBR_MONTH_DAY, loc, *dtitvinf, ec);
1138         delete dtitvinf;
1139         if (!assertSuccess("createInstance(skeleton,dtitvinf) in expectUserDII", ec)) return;
1140         FieldPosition pos=0;
1141         dtitvfmt->format(&dtitv, str.remove(), pos, ec);
1142         if (!assertSuccess("format in expectUserDII", ec)) return;
1143         assertEquals((UnicodeString)"\"" + locName + "\\" + datestr + "\\" + datestr_2 + "\"", ctou(data[i++]), str);
1144 #ifdef DTIFMTTS_DEBUG
1145         char result[1000];
1146         char mesg[1000];
1147         PRINTMESG("interval format using user defined DateIntervalInfo\n");
1148         str.extract(0,  str.length(), result, "UTF-8");
1149         sprintf(mesg, "interval date: %s\n", result);
1150         PRINTMESG(mesg);
1151 #endif
1152         delete dtitvfmt;
1153     }
1154 }
1155 
1156 
testStress()1157 void DateIntervalFormatTest::testStress() {
1158     if(quick){
1159     	logln("Quick mode: Skipping test");
1160     	return;
1161     }
1162 	const char* DATA[] = {
1163         "yyyy MM dd HH:mm:ss",
1164         "2007 10 10 10:10:10", "2008 10 10 10:10:10",
1165         "2007 10 10 10:10:10", "2007 11 10 10:10:10",
1166         "2007 11 10 10:10:10", "2007 11 20 10:10:10",
1167         "2007 01 10 10:00:10", "2007 01 10 14:10:10",
1168         "2007 01 10 10:00:10", "2007 01 10 10:20:10",
1169         "2007 01 10 10:10:10", "2007 01 10 10:10:20",
1170     };
1171 
1172     const char* testLocale[][3] = {
1173         //{"th", "", ""},
1174         {"en", "", ""},
1175         {"zh", "", ""},
1176         {"de", "", ""},
1177         {"ar", "", ""},
1178         {"en", "GB",  ""},
1179         {"fr", "", ""},
1180         {"it", "", ""},
1181         {"nl", "", ""},
1182         {"zh", "TW",  ""},
1183         {"ja", "", ""},
1184         {"pt", "BR", ""},
1185         {"ru", "", ""},
1186         {"pl", "", ""},
1187         {"tr", "", ""},
1188         {"es", "", ""},
1189         {"ko", "", ""},
1190         {"sv", "", ""},
1191         {"fi", "", ""},
1192         {"da", "", ""},
1193         {"pt", "PT", ""},
1194         {"ro", "", ""},
1195         {"hu", "", ""},
1196         {"he", "", ""},
1197         {"in", "", ""},
1198         {"cs", "", ""},
1199         {"el", "", ""},
1200         {"no", "", ""},
1201         {"vi", "", ""},
1202         {"bg", "", ""},
1203         {"hr", "", ""},
1204         {"lt", "", ""},
1205         {"sk", "", ""},
1206         {"sl", "", ""},
1207         {"sr", "", ""},
1208         {"ca", "", ""},
1209         {"lv", "", ""},
1210         {"uk", "", ""},
1211         {"hi", "", ""},
1212     };
1213 
1214     uint32_t localeIndex;
1215     for ( localeIndex = 0; localeIndex < ARRAY_SIZE(testLocale); ++localeIndex ) {
1216         char locName[32];
1217         uprv_strcpy(locName, testLocale[localeIndex][0]);
1218         uprv_strcat(locName, testLocale[localeIndex][1]);
1219         stress(DATA, ARRAY_SIZE(DATA), Locale(testLocale[localeIndex][0], testLocale[localeIndex][1], testLocale[localeIndex][2]), locName);
1220     }
1221 }
1222 
1223 
stress(const char ** data,int32_t data_length,const Locale & loc,const char * locName)1224 void DateIntervalFormatTest::stress(const char** data, int32_t data_length,
1225                                     const Locale& loc, const char* locName) {
1226     UnicodeString skeleton[] = {
1227         "EEEEdMMMMy",
1228         "dMMMMy",
1229         "dMMMM",
1230         "MMMMy",
1231         "EEEEdMMMM",
1232         "EdMMMy",
1233         "dMMMy",
1234         "dMMM",
1235         "MMMy",
1236         "EdMMM",
1237         "EdMy",
1238         "dMy",
1239         "dM",
1240         "My",
1241         "EdM",
1242         "d",
1243         "Ed",
1244         "y",
1245         "M",
1246         "MMM",
1247         "MMMM",
1248         "hm",
1249         "hmv",
1250         "hmz",
1251         "h",
1252         "hv",
1253         "hz",
1254         "EEddMMyyyy", // following could be normalized
1255         "EddMMy",
1256         "hhmm",
1257         "hhmmzz",
1258         "hms",  // following could not be normalized
1259         "dMMMMMy",
1260         "EEEEEdM",
1261     };
1262 
1263     int32_t i = 0;
1264     UErrorCode ec = U_ZERO_ERROR;
1265     UnicodeString str, str2;
1266     SimpleDateFormat ref(data[i++], loc, ec);
1267     if (!assertSuccess("construct SimpleDateFormat", ec)) return;
1268 
1269 #ifdef DTIFMTTS_DEBUG
1270     char result[1000];
1271     char mesg[1000];
1272     sprintf(mesg, "locale: %s\n", locName);
1273     PRINTMESG(mesg);
1274 #endif
1275 
1276     while (i<data_length) {
1277 
1278         // 'f'
1279         const char* datestr = data[i++];
1280         const char* datestr_2 = data[i++];
1281 #ifdef DTIFMTTS_DEBUG
1282         sprintf(mesg, "original date: %s - %s\n", datestr, datestr_2);
1283         PRINTMESG(mesg)
1284 #endif
1285         UDate date = ref.parse(ctou(datestr), ec);
1286         if (!assertSuccess("parse", ec)) return;
1287         UDate date_2 = ref.parse(ctou(datestr_2), ec);
1288         if (!assertSuccess("parse", ec)) return;
1289         DateInterval dtitv(date, date_2);
1290 
1291         for ( uint32_t skeletonIndex = 0;
1292               skeletonIndex < ARRAY_SIZE(skeleton);
1293               ++skeletonIndex ) {
1294             const UnicodeString& oneSkeleton = skeleton[skeletonIndex];
1295             DateIntervalFormat* dtitvfmt = DateIntervalFormat::createInstance(oneSkeleton, loc, ec);
1296             if (!assertSuccess("createInstance(skeleton)", ec)) return;
1297             /*
1298             // reset the calendar to be Gregorian calendar for "th"
1299             if ( uprv_strcmp(locName, "th") == 0 ) {
1300                 GregorianCalendar* gregCal = new GregorianCalendar(loc, ec);
1301                 if (!assertSuccess("GregorianCalendar()", ec)) return;
1302                 const DateFormat* dformat = dtitvfmt->getDateFormat();
1303                 DateFormat* newOne = (DateFormat*)dformat->clone();
1304                 newOne->adoptCalendar(gregCal);
1305                 //dtitvfmt->adoptDateFormat(newOne, ec);
1306                 dtitvfmt->setDateFormat(*newOne, ec);
1307                 delete newOne;
1308                 if (!assertSuccess("adoptDateFormat()", ec)) return;
1309             }
1310             */
1311             FieldPosition pos=0;
1312             dtitvfmt->format(&dtitv, str.remove(), pos, ec);
1313             if (!assertSuccess("format", ec)) return;
1314 #ifdef DTIFMTTS_DEBUG
1315             oneSkeleton.extract(0,  oneSkeleton.length(), result, "UTF-8");
1316             sprintf(mesg, "interval by skeleton: %s\n", result);
1317             PRINTMESG(mesg)
1318             str.extract(0,  str.length(), result, "UTF-8");
1319             sprintf(mesg, "interval date: %s\n", result);
1320             PRINTMESG(mesg)
1321 #endif
1322             delete dtitvfmt;
1323         }
1324 
1325         // test user created DateIntervalInfo
1326         ec = U_ZERO_ERROR;
1327         DateIntervalInfo* dtitvinf = new DateIntervalInfo(ec);
1328         dtitvinf->setFallbackIntervalPattern("{0} --- {1}", ec);
1329         dtitvinf->setIntervalPattern(UDAT_YEAR_ABBR_MONTH_DAY, UCAL_MONTH, "yyyy MMM d - MMM y",ec);
1330         if (!assertSuccess("DateIntervalInfo::setIntervalPattern", ec)) return;
1331         dtitvinf->setIntervalPattern(UDAT_YEAR_ABBR_MONTH_DAY, UCAL_HOUR_OF_DAY, "yyyy MMM d HH:mm - HH:mm", ec);
1332         if (!assertSuccess("DateIntervalInfo::setIntervalPattern", ec)) return;
1333         DateIntervalFormat* dtitvfmt = DateIntervalFormat::createInstance(UDAT_YEAR_ABBR_MONTH_DAY, loc, *dtitvinf, ec);
1334         delete dtitvinf;
1335         if (!assertSuccess("createInstance(skeleton,dtitvinf)", ec)) return;
1336         FieldPosition pos=0;
1337         dtitvfmt->format(&dtitv, str.remove(), pos, ec);
1338         if ( uprv_strcmp(locName, "th") ) {
1339             if (!assertSuccess("format", ec)) return;
1340 #ifdef DTIFMTTS_DEBUG
1341             PRINTMESG("interval format using user defined DateIntervalInfo\n");
1342             str.extract(0,  str.length(), result, "UTF-8");
1343             sprintf(mesg, "interval date: %s\n", result);
1344             PRINTMESG(mesg)
1345 #endif
1346         } else {
1347             // for "th", the default calendar is Budhist,
1348             // not Gregorian.
1349             assertTrue("Default calendar for \"th\" is Budhist", ec == U_ILLEGAL_ARGUMENT_ERROR);
1350             ec = U_ZERO_ERROR;
1351         }
1352         delete dtitvfmt;
1353     }
1354 }
1355 
1356 #endif /* #if !UCONFIG_NO_FORMATTING */
1357