1 2 /******************************************************************** 3 * COPYRIGHT: 4 * Copyright (c) 1997-2010, 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 " + (int32_t) 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