Home | History | Annotate | Download | only in intltest
      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 
     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  */
     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  */
    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 
    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  */
   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 
   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 
   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 
   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