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