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