Home | History | Annotate | Download | only in intltest
      1 // Copyright (C) 2016 and later: Unicode, Inc. and others.
      2 // License & terms of use: http://www.unicode.org/copyright.html
      3 /***********************************************************************
      4  * Copyright (c) 1997-2011, International Business Machines Corporation
      5  * and others. All Rights Reserved.
      6  ***********************************************************************/
      7 
      8 #include "unicode/utypes.h"
      9 
     10 #if !UCONFIG_NO_FORMATTING
     11 
     12 #include "miscdtfm.h"
     13 
     14 #include "unicode/format.h"
     15 #include "unicode/decimfmt.h"
     16 #include "unicode/datefmt.h"
     17 #include "unicode/smpdtfmt.h"
     18 #include "unicode/dtfmtsym.h"
     19 #include "unicode/locid.h"
     20 #include "unicode/msgfmt.h"
     21 #include "unicode/numfmt.h"
     22 #include "unicode/choicfmt.h"
     23 #include "unicode/gregocal.h"
     24 
     25 // *****************************************************************************
     26 // class DateFormatMiscTests
     27 // *****************************************************************************
     28 
     29 #define CASE(id,test) case id: name = #test; if (exec) { logln(#test "---"); logln((UnicodeString)""); test(); } break;
     30 
     31 void
     32 DateFormatMiscTests::runIndexedTest( int32_t index, UBool exec, const char* &name, char* /*par*/ )
     33 {
     34     // if (exec) logln((UnicodeString)"TestSuite DateFormatMiscTests");
     35     switch (index) {
     36         CASE(0, test4097450)
     37         CASE(1, test4099975)
     38         CASE(2, test4117335)
     39 
     40         default: name = ""; break;
     41     }
     42 }
     43 
     44 UBool
     45 DateFormatMiscTests::failure(UErrorCode status, const char* msg)
     46 {
     47     if(U_FAILURE(status)) {
     48         errcheckln(status, UnicodeString("FAIL: ") + msg + " failed, error " + u_errorName(status));
     49         return TRUE;
     50     }
     51 
     52     return FALSE;
     53 }
     54 
     55 /*
     56  * @bug 4097450
     57  */
     58 void
     59 DateFormatMiscTests::test4097450()
     60 {
     61     //
     62     // Date parse requiring 4 digit year.
     63     //
     64     UnicodeString  dstring [] = {
     65         UnicodeString("97"),
     66         UnicodeString("1997"),
     67         UnicodeString("97"),
     68         UnicodeString("1997"),
     69         UnicodeString("01"),
     70         UnicodeString("2001"),
     71         UnicodeString("01"),
     72         UnicodeString("2001"),
     73         UnicodeString("1"),
     74         UnicodeString("1"),
     75         UnicodeString("11"),
     76         UnicodeString("11"),
     77         UnicodeString("111"),
     78         UnicodeString("111")
     79     };
     80 
     81     UnicodeString dformat [] = {
     82         UnicodeString("yy"),
     83         UnicodeString("yy"),
     84         UnicodeString("yyyy"),
     85         UnicodeString("yyyy"),
     86         UnicodeString("yy"),
     87         UnicodeString("yy"),
     88         UnicodeString("yyyy"),
     89         UnicodeString("yyyy"),
     90         UnicodeString("yy"),
     91         UnicodeString("yyyy"),
     92         UnicodeString("yy"),
     93         UnicodeString("yyyy"),
     94         UnicodeString("yy"),
     95         UnicodeString("yyyy")
     96     };
     97 
     98 /*    UBool dresult [] = {
     99         TRUE,
    100         FALSE,
    101         FALSE,
    102         TRUE,
    103         TRUE,
    104         FALSE,
    105         FALSE,
    106         TRUE,
    107         FALSE,
    108         FALSE,
    109         TRUE,
    110         FALSE,
    111         FALSE,
    112         FALSE
    113     };*/
    114 
    115     UErrorCode status = U_ZERO_ERROR;
    116     SimpleDateFormat *formatter;
    117     SimpleDateFormat *resultFormatter = new SimpleDateFormat((UnicodeString)"yyyy", status);
    118     if (U_FAILURE(status)) {
    119         dataerrln("Fail new SimpleDateFormat: %s", u_errorName(status));
    120         return;
    121     }
    122 
    123     logln("Format\tSource\tResult");
    124     logln("-------\t-------\t-------");
    125     for (int i = 0; i < 14/*dstring.length*/; i++)
    126     {
    127         log(dformat[i] + "\t" + dstring[i] + "\t");
    128         formatter = new SimpleDateFormat(dformat[i], status);
    129         if(failure(status, "new SimpleDateFormat")) return;
    130         //try {
    131         UnicodeString str;
    132         FieldPosition pos(FieldPosition::DONT_CARE);
    133         logln(resultFormatter->format(formatter->parse(dstring[i], status), str, pos));
    134         failure(status, "resultFormatter->format");
    135             //if ( !dresult[i] ) System.out.print("   <-- error!");
    136         /*}
    137         catch (ParseException exception) {
    138             //if ( dresult[i] ) System.out.print("   <-- error!");
    139             System.out.print("exception --> " + exception);
    140         }*/
    141         delete formatter;
    142         logln();
    143     }
    144 
    145     delete resultFormatter;
    146 }
    147 
    148 /*
    149  * @bug 4099975
    150  */
    151 void
    152 DateFormatMiscTests::test4099975()
    153 {
    154     /**
    155      * Test Constructor SimpleDateFormat::SimpleDateFormat (const UnicodeString & pattern,
    156      *                                    const DateFormatSymbols & formatData, UErrorCode & status )
    157      * The DateFormatSymbols object is NOT adopted; Modifying the original DateFormatSymbols
    158      * should not change the SimpleDateFormat's behavior.
    159      */
    160     UDate d = Calendar::getNow();
    161     {
    162         UErrorCode status = U_ZERO_ERROR;
    163         DateFormatSymbols* symbols = new DateFormatSymbols(Locale::getUS(), status);
    164         if (U_FAILURE(status)) {
    165             dataerrln("Unable to create DateFormatSymbols - %s", u_errorName(status));
    166             return;
    167         }
    168         SimpleDateFormat *df = new SimpleDateFormat(UnicodeString("E hh:mm"), *symbols, status);
    169         if(failure(status, "new SimpleDateFormat")) return;
    170         UnicodeString format0;
    171         format0 = df->format(d, format0);
    172         UnicodeString localizedPattern0;
    173         localizedPattern0 = df->toLocalizedPattern(localizedPattern0, status);
    174         failure(status, "df->toLocalizedPattern");
    175         symbols->setLocalPatternChars(UnicodeString("abcdefghijklmonpqr")); // change value of field
    176         UnicodeString format1;
    177         format1 = df->format(d, format1);
    178         if (format0 != format1) {
    179             errln(UnicodeString("Formats are different. format0: ") + format0
    180                 + UnicodeString("; format1: ") + format1);
    181         }
    182         UnicodeString localizedPattern1;
    183         localizedPattern1 = df->toLocalizedPattern(localizedPattern1, status);
    184         failure(status, "df->toLocalizedPattern");
    185         if (localizedPattern0 != localizedPattern1) {
    186             errln(UnicodeString("Pattern has been changed. localizedPattern0: ") + localizedPattern0
    187                 + UnicodeString("; localizedPattern1: ") + localizedPattern1);
    188         }
    189         delete symbols;
    190         delete df;
    191     }
    192     /*
    193      * Test void SimpleDateFormat::setDateFormatSymbols (  const DateFormatSymbols & newFormatSymbols )
    194      * Modifying the original DateFormatSymbols should not change the SimpleDateFormat's behavior.
    195      */
    196     {
    197         UErrorCode status = U_ZERO_ERROR;
    198         DateFormatSymbols* symbols = new DateFormatSymbols(Locale::getUS(), status);
    199         if(failure(status, "new DateFormatSymbols")) return;
    200         SimpleDateFormat *df = new SimpleDateFormat(UnicodeString("E hh:mm"), status);
    201         if(failure(status, "new SimpleDateFormat")) return;
    202         df->setDateFormatSymbols(*symbols);
    203         UnicodeString format0;
    204         format0 = df->format(d, format0);
    205         UnicodeString localizedPattern0;
    206         localizedPattern0 = df->toLocalizedPattern(localizedPattern0, status);
    207         failure(status, "df->toLocalizedPattern");
    208         symbols->setLocalPatternChars(UnicodeString("abcdefghijklmonpqr")); // change value of field
    209         UnicodeString format1;
    210         format1 = df->format(d, format1);
    211         if (format0 != format1) {
    212             errln(UnicodeString("Formats are different. format0: ") + format0
    213                 + UnicodeString("; format1: ") + format1);
    214         }
    215         UnicodeString localizedPattern1;
    216         localizedPattern1 = df->toLocalizedPattern(localizedPattern1, status);
    217         failure(status, "df->toLocalizedPattern");
    218         if (localizedPattern0 != localizedPattern1) {
    219             errln(UnicodeString("Pattern has been changed. localizedPattern0: ") + localizedPattern0
    220                 + UnicodeString("; localizedPattern1: ") + localizedPattern1);
    221         }
    222         delete symbols;
    223         delete df;
    224 
    225     }
    226     //Test the pointer version of the constructor (and the adoptDateFormatSymbols method)
    227     {
    228         UErrorCode status = U_ZERO_ERROR;
    229         DateFormatSymbols* symbols = new DateFormatSymbols(Locale::getUS(), status);
    230         if(failure(status, "new DateFormatSymbols")) return;
    231         SimpleDateFormat *df = new SimpleDateFormat(UnicodeString("E hh:mm"), symbols, status);
    232         if(failure(status, "new SimpleDateFormat")) return;
    233         UnicodeString format0;
    234         format0 = df->format(d, format0);
    235         UnicodeString localizedPattern0;
    236         localizedPattern0 = df->toLocalizedPattern(localizedPattern0, status);
    237         failure(status, "df->toLocalizedPattern");
    238         symbols->setLocalPatternChars(UnicodeString("abcdefghijklmonpqr")); // change value of field
    239         UnicodeString format1;
    240         format1 = df->format(d, format1);
    241         if (format0 != format1) {
    242             errln(UnicodeString("Formats are different. format0: ") + format0
    243                 + UnicodeString("; format1: ") + format1);
    244         }
    245         UnicodeString localizedPattern1;
    246         localizedPattern1 = df->toLocalizedPattern(localizedPattern1, status);
    247         failure(status, "df->toLocalizedPattern");
    248         if (localizedPattern0 == localizedPattern1) {
    249             errln(UnicodeString("Pattern should have been changed. localizedPattern0: ") + localizedPattern0
    250                 + UnicodeString("; localizedPattern1: ") + localizedPattern1);
    251         }
    252         //delete symbols; the caller is no longer responsible for deleting the symbols
    253         delete df;
    254     }
    255     //
    256     {
    257         UErrorCode status = U_ZERO_ERROR;
    258         DateFormatSymbols* symbols = new DateFormatSymbols(Locale::getUS(), status);
    259         failure(status, "new DateFormatSymbols");
    260         SimpleDateFormat *df = new SimpleDateFormat(UnicodeString("E hh:mm"), status);
    261         if(failure(status, "new SimpleDateFormat")) return;
    262         df-> adoptDateFormatSymbols(symbols);
    263         UnicodeString format0;
    264         format0 = df->format(d, format0);
    265         UnicodeString localizedPattern0;
    266         localizedPattern0 = df->toLocalizedPattern(localizedPattern0, status);
    267         failure(status, "df->toLocalizedPattern");
    268         symbols->setLocalPatternChars(UnicodeString("abcdefghijklmonpqr")); // change value of field
    269         UnicodeString format1;
    270         format1 = df->format(d, format1);
    271         if (format0 != format1) {
    272             errln(UnicodeString("Formats are different. format0: ") + format0
    273                 + UnicodeString("; format1: ") + format1);
    274         }
    275         UnicodeString localizedPattern1;
    276         localizedPattern1 = df->toLocalizedPattern(localizedPattern1, status);
    277         failure(status, "df->toLocalizedPattern");
    278         if (localizedPattern0 == localizedPattern1) {
    279             errln(UnicodeString("Pattern should have been changed. localizedPattern0: ") + localizedPattern0
    280                 + UnicodeString("; localizedPattern1: ") + localizedPattern1);
    281         }
    282         //delete symbols; the caller is no longer responsible for deleting the symbols
    283         delete df;
    284     }
    285 }
    286 
    287 /*
    288  * @test @(#)bug4117335.java    1.1 3/5/98
    289  *
    290  * @bug 4117335
    291  */
    292 void
    293 DateFormatMiscTests::test4117335()
    294 {
    295     //UnicodeString bc = "\u7d00\u5143\u524d";
    296     UChar bcC [] = {
    297         0x7D00,
    298         0x5143,
    299         0x524D
    300     };
    301     UnicodeString bc(bcC, 3, 3);
    302 
    303     //UnicodeString ad = "\u897f\u66a6";
    304     UChar adC [] = {
    305         0x897F,
    306         0x66A6
    307     };
    308     UnicodeString ad(adC, 2, 2);
    309 
    310     //UnicodeString jstLong = "\u65e5\u672c\u6a19\u6e96\u6642";
    311     UChar jstLongC [] = {
    312         0x65e5,
    313         0x672c,
    314         0x6a19,
    315         0x6e96,
    316         0x6642
    317     };
    318     UChar jdtLongC [] = {0x65E5, 0x672C, 0x590F, 0x6642, 0x9593};
    319 
    320     UnicodeString jstLong(jstLongC, 5, 5);
    321 
    322 //    UnicodeString jstShort = "JST";
    323 
    324     UnicodeString tzID = "Asia/Tokyo";
    325 
    326     UnicodeString jdtLong(jdtLongC, 5, 5);
    327 
    328 //    UnicodeString jdtShort = "JDT";
    329     UErrorCode status = U_ZERO_ERROR;
    330     DateFormatSymbols *symbols = new DateFormatSymbols(Locale::getJapan(), status);
    331     if(U_FAILURE(status)) {
    332       dataerrln("Failure creating DateFormatSymbols, %s", u_errorName(status));
    333       delete symbols;
    334       return;
    335     }
    336     failure(status, "new DateFormatSymbols");
    337     int32_t eraCount = 0;
    338     const UnicodeString *eras = symbols->getEraNames(eraCount);
    339 
    340     logln(UnicodeString("BC = ") + eras[0]);
    341     if (eras[0] != bc) {
    342         errln("*** Should have been " + bc);
    343         //throw new Exception("Error in BC");
    344     }
    345 
    346     logln(UnicodeString("AD = ") + eras[1]);
    347     if (eras[1] != ad) {
    348         errln("*** Should have been " + ad);
    349         //throw new Exception("Error in AD");
    350     }
    351 
    352     int32_t rowCount, colCount;
    353     const UnicodeString **zones = symbols->getZoneStrings(rowCount, colCount);
    354     //don't hard code the index .. compute it.
    355     int32_t index = -1;
    356     for (int32_t i = 0; i < rowCount; ++i) {
    357         if (tzID == (zones[i][0])) {
    358             index = i;
    359             break;
    360         }
    361     }
    362     logln(UnicodeString("Long zone name = ") + zones[index][1]);
    363     if (zones[index][1] != jstLong) {
    364         errln("*** Should have been " + prettify(jstLong)+ " but it is: " + prettify(zones[index][1]));
    365         //throw new Exception("Error in long TZ name");
    366     }
    367 //    logln(UnicodeString("Short zone name = ") + zones[index][2]);
    368 //    if (zones[index][2] != jstShort) {
    369 //        errln("*** Should have been " + prettify(jstShort) + " but it is: " + prettify(zones[index][2]));
    370 //        //throw new Exception("Error in short TZ name");
    371 //    }
    372     logln(UnicodeString("Long zone name = ") + zones[index][3]);
    373     if (zones[index][3] != jdtLong) {
    374         errln("*** Should have been " + prettify(jstLong) + " but it is: " + prettify(zones[index][3]));
    375         //throw new Exception("Error in long TZ name");
    376     }
    377 //    logln(UnicodeString("SHORT zone name = ") + zones[index][4]);
    378 //    if (zones[index][4] != jdtShort) {
    379 //        errln("*** Should have been " + prettify(jstShort)+ " but it is: " + prettify(zones[index][4]));
    380 //        //throw new Exception("Error in short TZ name");
    381 //    }
    382     delete symbols;
    383 
    384 }
    385 
    386 #endif /* #if !UCONFIG_NO_FORMATTING */
    387