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