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 /********************************************************************
      5  * COPYRIGHT:
      6  * Copyright (c) 1997-2016, International Business Machines Corporation and
      7  * others. All Rights Reserved.
      8  ********************************************************************/
      9 
     10 #include "unicode/utypes.h"
     11 
     12 #if !UCONFIG_NO_FORMATTING
     13 
     14 #include "sdtfmtts.h"
     15 
     16 #include "unicode/smpdtfmt.h"
     17 #include "unicode/dtfmtsym.h"
     18 
     19 // This is an API test, not a unit test.  It doesn't test very many cases, and doesn't
     20 // try to test the full functionality.  It just calls each function in the class and
     21 // verifies that it works on a basic level.
     22 
     23 void IntlTestSimpleDateFormatAPI::runIndexedTest( int32_t index, UBool exec, const char* &name, char* /*par*/ )
     24 {
     25     if (exec) logln("TestSuite SimpleDateFormatAPI");
     26     switch (index) {
     27         case 0: name = "SimpleDateFormat API test";
     28                 if (exec) {
     29                     logln("SimpleDateFormat API test---"); logln("");
     30                     UErrorCode status = U_ZERO_ERROR;
     31                     Locale saveLocale;
     32                     Locale::setDefault(Locale::getEnglish(), status);
     33                     if(U_FAILURE(status)) {
     34                         errln("ERROR: Could not set default locale, test may not give correct results");
     35                     }
     36                     testAPI(/*par*/);
     37                     Locale::setDefault(saveLocale, status);
     38                 }
     39                 break;
     40 
     41         default: name = ""; break;
     42     }
     43 }
     44 
     45 /**
     46  * Test various generic API methods of SimpleDateFormat for API coverage.
     47  */
     48 void IntlTestSimpleDateFormatAPI::testAPI(/*char *par*/)
     49 {
     50     UErrorCode status = U_ZERO_ERROR;
     51 
     52 // ======= Test constructors
     53 
     54     logln("Testing SimpleDateFormat constructors");
     55 
     56     SimpleDateFormat def(status);
     57     if(U_FAILURE(status)) {
     58         dataerrln("ERROR: Could not create SimpleDateFormat (default) - exitting");
     59         return;
     60     }
     61 
     62     status = U_ZERO_ERROR;
     63     const UnicodeString pattern("yyyy.MM.dd G 'at' hh:mm:ss z", "");
     64     const UnicodeString override("y=hebr;d=thai;s=arab", ""); /* use invariant converter */
     65     const UnicodeString override_bogus("y=hebr;d=thai;s=bogus", "");
     66 
     67     SimpleDateFormat pat(pattern, status);
     68     if(U_FAILURE(status)) {
     69        errln("ERROR: Could not create SimpleDateFormat (pattern) - %s", u_errorName(status));
     70     }
     71 
     72     status = U_ZERO_ERROR;
     73     SimpleDateFormat pat_fr(pattern, Locale::getFrench(), status);
     74     if(U_FAILURE(status)) {
     75         errln("ERROR: Could not create SimpleDateFormat (pattern French)");
     76     }
     77 
     78     status = U_ZERO_ERROR;
     79     DateFormatSymbols *symbols = new DateFormatSymbols(Locale::getFrench(), status);
     80     if(U_FAILURE(status)) {
     81         errln("ERROR: Could not create DateFormatSymbols (French)");
     82     }
     83 
     84     status = U_ZERO_ERROR;
     85     SimpleDateFormat cust1(pattern, symbols, status);
     86     if(U_FAILURE(status)) {
     87         dataerrln("ERROR: Could not create SimpleDateFormat (pattern, symbols*) - exitting");
     88         return;
     89     }
     90 
     91     status = U_ZERO_ERROR;
     92     SimpleDateFormat cust2(pattern, *symbols, status);
     93     if(U_FAILURE(status)) {
     94         errln("ERROR: Could not create SimpleDateFormat (pattern, symbols)");
     95     }
     96 
     97     status = U_ZERO_ERROR;
     98     logln(UnicodeString("Override with: ") + override);
     99     SimpleDateFormat ovr1(pattern, override, status);
    100     if(U_FAILURE(status)) {
    101       errln("ERROR: Could not create SimpleDateFormat (pattern, override) - %s", u_errorName(status));
    102     }
    103 
    104     status = U_ZERO_ERROR;
    105     SimpleDateFormat ovr2(pattern, override, Locale::getGerman(), status);
    106     if(U_FAILURE(status)) {
    107         errln("ERROR: Could not create SimpleDateFormat (pattern, override, locale) - %s", u_errorName(status));
    108     }
    109 
    110     status = U_ZERO_ERROR;
    111     logln(UnicodeString("Override with: ") + override_bogus);
    112     SimpleDateFormat ovr3(pattern, override_bogus, Locale::getGerman(), status);
    113     if(U_SUCCESS(status)) {
    114         errln("ERROR: Should not have been able to create SimpleDateFormat (pattern, override, locale) with a bogus override");
    115     }
    116 
    117 
    118     SimpleDateFormat copy(pat);
    119 
    120 // ======= Test clone(), assignment, and equality
    121 
    122     logln("Testing clone(), assignment and equality operators");
    123 
    124     if( ! (copy == pat) || copy != pat) {
    125         errln("ERROR: Copy constructor (or ==) failed");
    126     }
    127 
    128     copy = cust1;
    129     if(copy != cust1) {
    130         errln("ERROR: Assignment (or !=) failed");
    131     }
    132 
    133     Format *clone = def.clone();
    134     if( ! (*clone == def) ) {
    135         errln("ERROR: Clone() (or ==) failed");
    136     }
    137     delete clone;
    138 
    139 // ======= Test various format() methods
    140 
    141     logln("Testing various format() methods");
    142 
    143     UDate d = 837039928046.0;
    144     Formattable fD(d, Formattable::kIsDate);
    145 
    146     UnicodeString res1, res2;
    147     FieldPosition pos1(FieldPosition::DONT_CARE), pos2(FieldPosition::DONT_CARE);
    148 
    149     res1 = def.format(d, res1, pos1);
    150     logln( (UnicodeString) "" + d + " formatted to " + res1);
    151 
    152     status = U_ZERO_ERROR;
    153     res2 = cust1.format(fD, res2, pos2, status);
    154     if(U_FAILURE(status)) {
    155         errln("ERROR: format(Formattable [Date]) failed");
    156     }
    157     logln((UnicodeString) "" + fD.getDate() + " formatted to " + res2);
    158 
    159 // ======= Test parse()
    160 
    161     logln("Testing parse()");
    162 
    163     UnicodeString text("02/03/76 2:50 AM, CST");
    164     UDate result1, result2;
    165     ParsePosition pos(0);
    166     result1 = def.parse(text, pos);
    167     logln(text + " parsed into " + result1);
    168 
    169     status = U_ZERO_ERROR;
    170     result2 = def.parse(text, status);
    171     if(U_FAILURE(status)) {
    172         errln("ERROR: parse() failed");
    173     }
    174     logln(text + " parsed into " + result2);
    175 
    176 // ======= Test getters and setters
    177 
    178     logln("Testing getters and setters");
    179 
    180     const DateFormatSymbols *syms = pat.getDateFormatSymbols();
    181     if(!syms) {
    182       errln("Couldn't obtain DateFormatSymbols. Quitting test!");
    183       return;
    184     }
    185     if(syms->getDynamicClassID() != DateFormatSymbols::getStaticClassID()) {
    186         errln("ERROR: format->getDateFormatSymbols()->getDynamicClassID() != DateFormatSymbols::getStaticClassID()");
    187     }
    188     DateFormatSymbols *newSyms = new DateFormatSymbols(*syms);
    189     def.adoptDateFormatSymbols(newSyms);
    190     pat_fr.setDateFormatSymbols(*newSyms);
    191     if( *(pat.getDateFormatSymbols()) != *(def.getDateFormatSymbols())) {
    192         errln("ERROR: adopt or set DateFormatSymbols() failed");
    193     }
    194 
    195     status = U_ZERO_ERROR;
    196     UDate startDate = pat.get2DigitYearStart(status);
    197     if(U_FAILURE(status)) {
    198         errln("ERROR: getTwoDigitStartDate() failed");
    199     }
    200 
    201     status = U_ZERO_ERROR;
    202     pat_fr.set2DigitYearStart(startDate, status);
    203     if(U_FAILURE(status)) {
    204         errln("ERROR: setTwoDigitStartDate() failed");
    205     }
    206 
    207 // ======= Test DateFormatSymbols constructor
    208     newSyms  =new DateFormatSymbols("gregorian", status);
    209     if(U_FAILURE(status)) {
    210         errln("ERROR: new DateFormatSymbols() failed");
    211     }
    212     def.adoptDateFormatSymbols(newSyms);
    213 
    214 // ======= Test applyPattern()
    215 
    216     logln("Testing applyPattern()");
    217 
    218     UnicodeString p1("yyyy.MM.dd G 'at' hh:mm:ss z");
    219     logln("Applying pattern " + p1);
    220     status = U_ZERO_ERROR;
    221     pat.applyPattern(p1);
    222 
    223     UnicodeString s2;
    224     s2 = pat.toPattern(s2);
    225     logln("Extracted pattern is " + s2);
    226     if(s2 != p1) {
    227         errln("ERROR: toPattern() result did not match pattern applied");
    228     }
    229 
    230     logln("Applying pattern " + p1);
    231     status = U_ZERO_ERROR;
    232     pat.applyLocalizedPattern(p1, status);
    233     if(U_FAILURE(status)) {
    234         errln("ERROR: applyPattern() failed with %s", u_errorName(status));
    235     }
    236     UnicodeString s3;
    237     status = U_ZERO_ERROR;
    238     s3 = pat.toLocalizedPattern(s3, status);
    239     if(U_FAILURE(status)) {
    240         errln("ERROR: toLocalizedPattern() failed");
    241     }
    242     logln("Extracted pattern is " + s3);
    243     if(s3 != p1) {
    244         errln("ERROR: toLocalizedPattern() result did not match pattern applied");
    245     }
    246 
    247 // ======= Test getStaticClassID()
    248 
    249     logln("Testing getStaticClassID()");
    250 
    251     status = U_ZERO_ERROR;
    252     DateFormat *test = new SimpleDateFormat(status);
    253     if(U_FAILURE(status)) {
    254         errln("ERROR: Couldn't create a SimpleDateFormat");
    255     }
    256 
    257     if(test->getDynamicClassID() != SimpleDateFormat::getStaticClassID()) {
    258         errln("ERROR: getDynamicClassID() didn't return the expected value");
    259     }
    260 
    261     delete test;
    262 
    263 // ======= Test Ticket 5684 (Parsing with 'e' and 'Y')
    264     SimpleDateFormat object(UNICODE_STRING_SIMPLE("YYYY'W'wwe"), status);
    265     if(U_FAILURE(status)) {
    266         errln("ERROR: Couldn't create a SimpleDateFormat");
    267     }
    268     object.setLenient(false);
    269     ParsePosition pp(0);
    270     UDate udDate = object.parse("2007W014", pp);
    271     if ((double)udDate == 0.0) {
    272         errln("ERROR: Parsing failed using 'Y' and 'e'");
    273     }
    274 
    275 // ====== Test ticket 11295 getNumberFormatForField returns wild pointer
    276     if (object.getNumberFormatForField('N') != NULL) {
    277         errln("N is not a valid field, "
    278               "getNumberFormatForField should return NULL");
    279     }
    280 }
    281 
    282 #endif /* #if !UCONFIG_NO_FORMATTING */
    283