| OLD | NEW |
| (Empty) |
| 1 /******************************************************************** | |
| 2 * COPYRIGHT: | |
| 3 * Copyright (c) 1997-2015, International Business Machines Corporation and | |
| 4 * others. All Rights Reserved. | |
| 5 ********************************************************************/ | |
| 6 | |
| 7 #include "unicode/utypes.h" | |
| 8 | |
| 9 #if !UCONFIG_NO_FORMATTING | |
| 10 #include "dtfmrgts.h" | |
| 11 | |
| 12 #include "unicode/timezone.h" | |
| 13 #include "unicode/gregocal.h" | |
| 14 #include "unicode/smpdtfmt.h" | |
| 15 #include "unicode/datefmt.h" | |
| 16 #include "unicode/simpletz.h" | |
| 17 #include "unicode/resbund.h" | |
| 18 | |
| 19 // ***************************************************************************** | |
| 20 // class DateFormatRegressionTest | |
| 21 // ***************************************************************************** | |
| 22 | |
| 23 #define CASE(id,test) case id: name = #test; if (exec) { logln(#test "---"); log
ln((UnicodeString)""); test(); } break; | |
| 24 | |
| 25 void | |
| 26 DateFormatRegressionTest::runIndexedTest( int32_t index, UBool exec, const char*
&name, char* /*par*/ ) | |
| 27 { | |
| 28 // if (exec) logln((UnicodeString)"TestSuite DateFormatRegressionTest"); | |
| 29 switch (index) { | |
| 30 CASE(0,Test4029195) | |
| 31 CASE(1,Test4052408) | |
| 32 CASE(2,Test4056591) | |
| 33 CASE(3,Test4059917) | |
| 34 CASE(4,Test4060212) | |
| 35 CASE(5,Test4061287) | |
| 36 CASE(6,Test4065240) | |
| 37 CASE(7,Test4071441) | |
| 38 CASE(8,Test4073003) | |
| 39 CASE(9,Test4089106) | |
| 40 CASE(10,Test4100302) | |
| 41 CASE(11,Test4101483) | |
| 42 CASE(12,Test4103340) | |
| 43 CASE(13,Test4103341) | |
| 44 CASE(14,Test4104136) | |
| 45 CASE(15,Test4104522) | |
| 46 CASE(16,Test4106807) | |
| 47 CASE(17,Test4108407) | |
| 48 CASE(18,Test4134203) | |
| 49 CASE(19,Test4151631) | |
| 50 CASE(20,Test4151706) | |
| 51 CASE(21,Test4162071) | |
| 52 CASE(22,Test4182066) | |
| 53 CASE(23,Test4210209) | |
| 54 CASE(24,Test714) | |
| 55 CASE(25,Test1684) | |
| 56 CASE(26,Test5554) | |
| 57 CASE(27,Test9237) | |
| 58 CASE(28,TestParsing) | |
| 59 CASE(29,TestT10334) | |
| 60 CASE(30,TestT10619) | |
| 61 CASE(31,TestT10855) | |
| 62 CASE(32,TestT10906) | |
| 63 default: name = ""; break; | |
| 64 } | |
| 65 } | |
| 66 | |
| 67 /** | |
| 68 * @bug 4029195 | |
| 69 */ | |
| 70 void DateFormatRegressionTest::Test4029195(void) | |
| 71 { | |
| 72 UErrorCode status = U_ZERO_ERROR; | |
| 73 | |
| 74 UDate today = Calendar::getNow(); | |
| 75 logln((UnicodeString) "today: " + today); | |
| 76 | |
| 77 SimpleDateFormat *sdf = (SimpleDateFormat*) DateFormat::createDateInstance()
; | |
| 78 if (failure(status, "SimpleDateFormat::createDateInstance")) { | |
| 79 return; | |
| 80 } | |
| 81 UnicodeString pat; | |
| 82 if(sdf == NULL){ | |
| 83 dataerrln("Error calling DateFormat::createDateTimeInstance"); | |
| 84 return; | |
| 85 } | |
| 86 | |
| 87 pat = sdf->toPattern(pat); | |
| 88 logln("pattern: " + pat); | |
| 89 UnicodeString fmtd; | |
| 90 | |
| 91 FieldPosition pos(FieldPosition::DONT_CARE); | |
| 92 fmtd = sdf->format(today, fmtd, pos); | |
| 93 logln("today: " + fmtd); | |
| 94 | |
| 95 sdf->applyPattern("G yyyy DDD"); | |
| 96 UnicodeString todayS; | |
| 97 todayS = sdf->format(today, todayS, pos); | |
| 98 logln("today: " + todayS); | |
| 99 //try { | |
| 100 today = sdf->parse(todayS, status); | |
| 101 failure(status, "sdf->parse"); | |
| 102 logln((UnicodeString)"today date: " + today); | |
| 103 /*} catch(Exception e) { | |
| 104 logln("Error reparsing date: " + e.getMessage()); | |
| 105 }*/ | |
| 106 | |
| 107 //try { | |
| 108 UnicodeString rt; | |
| 109 rt = sdf->format(sdf->parse(todayS, status), rt, pos); | |
| 110 failure(status, "sdf->parse"); | |
| 111 logln("round trip: " + rt); | |
| 112 if(rt != todayS) | |
| 113 errln("Fail: Want " + todayS + " Got " + rt); | |
| 114 /*} | |
| 115 catch (ParseException e) { | |
| 116 errln("Fail: " + e); | |
| 117 e.printStackTrace(); | |
| 118 }*/ | |
| 119 | |
| 120 delete sdf; | |
| 121 } | |
| 122 | |
| 123 /** | |
| 124 * @bug 4052408 | |
| 125 */ | |
| 126 void DateFormatRegressionTest::Test4052408(void) | |
| 127 { | |
| 128 | |
| 129 DateFormat *fmt = DateFormat::createDateTimeInstance(DateFormat::SHORT, | |
| 130 DateFormat::SHORT, Locale::getUS
()); | |
| 131 if (fmt == NULL) { | |
| 132 dataerrln("Error calling DateFormat::createDateTimeInstance"); | |
| 133 return; | |
| 134 } | |
| 135 | |
| 136 UDate dt = date(97, UCAL_MAY, 3, 8, 55); | |
| 137 UnicodeString str; | |
| 138 str = fmt->format(dt, str); | |
| 139 logln(str); | |
| 140 | |
| 141 if(str != "5/3/97, 8:55 AM") | |
| 142 errln("Fail: Test broken; Want 5/3/97 8:55 AM Got " + str); | |
| 143 | |
| 144 UnicodeString expected[] = { | |
| 145 (UnicodeString) "", //"ERA_FIELD", | |
| 146 (UnicodeString) "97", //"YEAR_FIELD", | |
| 147 (UnicodeString) "5", //"MONTH_FIELD", | |
| 148 (UnicodeString) "3", //"DATE_FIELD", | |
| 149 (UnicodeString) "", //"HOUR_OF_DAY1_FIELD", | |
| 150 (UnicodeString) "", //"HOUR_OF_DAY0_FIELD", | |
| 151 (UnicodeString) "55", //"MINUTE_FIELD", | |
| 152 (UnicodeString) "", //"SECOND_FIELD", | |
| 153 (UnicodeString) "", //"MILLISECOND_FIELD", | |
| 154 (UnicodeString) "", //"DAY_OF_WEEK_FIELD", | |
| 155 (UnicodeString) "", //"DAY_OF_YEAR_FIELD", | |
| 156 (UnicodeString) "", //"DAY_OF_WEEK_IN_MONTH_FIELD", | |
| 157 (UnicodeString) "", //"WEEK_OF_YEAR_FIELD", | |
| 158 (UnicodeString) "", //"WEEK_OF_MONTH_FIELD", | |
| 159 (UnicodeString) "AM", //"AM_PM_FIELD", | |
| 160 (UnicodeString) "8", //"HOUR1_FIELD", | |
| 161 (UnicodeString) "", //"HOUR0_FIELD", | |
| 162 (UnicodeString) "" //"TIMEZONE_FIELD" | |
| 163 }; | |
| 164 | |
| 165 //Hashtable expected;// = new Hashtable(); | |
| 166 //expected.put(new LongKey(DateFormat.MONTH_FIELD), "5"); | |
| 167 //expected.put(new LongKey(DateFormat.DATE_FIELD), "3"); | |
| 168 //expected.put(new LongKey(DateFormat.YEAR_FIELD), "97"); | |
| 169 //expected.put(new LongKey(DateFormat.HOUR1_FIELD), "8"); | |
| 170 //expected.put(new LongKey(DateFormat.MINUTE_FIELD), "55"); | |
| 171 //expected.put(new LongKey(DateFormat.AM_PM_FIELD), "AM"); | |
| 172 | |
| 173 //StringBuffer buf = new StringBuffer(); | |
| 174 UnicodeString fieldNames[] = { | |
| 175 (UnicodeString) "ERA_FIELD", | |
| 176 (UnicodeString) "YEAR_FIELD", | |
| 177 (UnicodeString) "MONTH_FIELD", | |
| 178 (UnicodeString) "DATE_FIELD", | |
| 179 (UnicodeString) "HOUR_OF_DAY1_FIELD", | |
| 180 (UnicodeString) "HOUR_OF_DAY0_FIELD", | |
| 181 (UnicodeString) "MINUTE_FIELD", | |
| 182 (UnicodeString) "SECOND_FIELD", | |
| 183 (UnicodeString) "MILLISECOND_FIELD", | |
| 184 (UnicodeString) "DAY_OF_WEEK_FIELD", | |
| 185 (UnicodeString) "DAY_OF_YEAR_FIELD", | |
| 186 (UnicodeString) "DAY_OF_WEEK_IN_MONTH_FIELD", | |
| 187 (UnicodeString) "WEEK_OF_YEAR_FIELD", | |
| 188 (UnicodeString) "WEEK_OF_MONTH_FIELD", | |
| 189 (UnicodeString) "AM_PM_FIELD", | |
| 190 (UnicodeString) "HOUR1_FIELD", | |
| 191 (UnicodeString) "HOUR0_FIELD", | |
| 192 (UnicodeString) "TIMEZONE_FIELD" | |
| 193 }; | |
| 194 | |
| 195 UBool pass = TRUE; | |
| 196 for(int i = 0; i <= 17; ++i) { | |
| 197 FieldPosition pos(i); | |
| 198 UnicodeString buf; | |
| 199 fmt->format(dt, buf, pos); | |
| 200 //char[] dst = new char[pos.getEndIndex() - pos.getBeginIndex()]; | |
| 201 UnicodeString dst; | |
| 202 buf.extractBetween(pos.getBeginIndex(), pos.getEndIndex(), dst); | |
| 203 UnicodeString str(dst); | |
| 204 logln((UnicodeString)"" + i + (UnicodeString)": " + fieldNames[i] + | |
| 205 (UnicodeString)", \"" + str + (UnicodeString)"\", " + | |
| 206 pos.getBeginIndex() + (UnicodeString)", " + | |
| 207 pos.getEndIndex()); | |
| 208 UnicodeString exp = expected[i]; | |
| 209 if((exp.length() == 0 && str.length() == 0) || str == exp) | |
| 210 logln(" ok"); | |
| 211 else { | |
| 212 errln(UnicodeString(" expected ") + exp); | |
| 213 pass = FALSE; | |
| 214 } | |
| 215 | |
| 216 } | |
| 217 if( ! pass) | |
| 218 errln("Fail: FieldPosition not set right by DateFormat"); | |
| 219 | |
| 220 delete fmt; | |
| 221 } | |
| 222 | |
| 223 /** | |
| 224 * @bug 4056591 | |
| 225 * Verify the function of the [s|g]et2DigitYearStart() API. | |
| 226 */ | |
| 227 void DateFormatRegressionTest::Test4056591(void) | |
| 228 { | |
| 229 UErrorCode status = U_ZERO_ERROR; | |
| 230 | |
| 231 //try { | |
| 232 SimpleDateFormat *fmt = new SimpleDateFormat(UnicodeString("yyMMdd"), Lo
cale::getUS(), status); | |
| 233 if (failure(status, "new SimpleDateFormat", TRUE)) { | |
| 234 delete fmt; | |
| 235 return; | |
| 236 } | |
| 237 UDate start = date(1809-1900, UCAL_DECEMBER, 25); | |
| 238 fmt->set2DigitYearStart(start, status); | |
| 239 failure(status, "fmt->setTwoDigitStartDate"); | |
| 240 if( (fmt->get2DigitYearStart(status) != start) || failure(status, "get2D
igitStartDate")) | |
| 241 errln("get2DigitYearStart broken"); | |
| 242 UDate dates [] = { | |
| 243 date(1809-1900, UCAL_DECEMBER, 25), | |
| 244 date(1909-1900, UCAL_DECEMBER, 24), | |
| 245 date(1809-1900, UCAL_DECEMBER, 26), | |
| 246 date(1861-1900, UCAL_DECEMBER, 25), | |
| 247 }; | |
| 248 | |
| 249 UnicodeString strings [] = { | |
| 250 (UnicodeString) "091225", | |
| 251 (UnicodeString) "091224", | |
| 252 (UnicodeString) "091226", | |
| 253 (UnicodeString) "611225" | |
| 254 }; | |
| 255 | |
| 256 /*Object[] DATA = { | |
| 257 "091225", new Date(1809-1900, Calendar.DECEMBER, 25), | |
| 258 "091224", new Date(1909-1900, Calendar.DECEMBER, 24), | |
| 259 "091226", new Date(1809-1900, Calendar.DECEMBER, 26), | |
| 260 "611225", new Date(1861-1900, Calendar.DECEMBER, 25), | |
| 261 };*/ | |
| 262 | |
| 263 for(int i = 0; i < 4; i++) { | |
| 264 UnicodeString s = strings[i]; | |
| 265 UDate exp = dates[i]; | |
| 266 UDate got = fmt->parse(s, status); | |
| 267 failure(status, "fmt->parse"); | |
| 268 logln(s + " -> " + got + "; exp " + exp); | |
| 269 if(got != exp) | |
| 270 errln("set2DigitYearStart broken"); | |
| 271 } | |
| 272 /*} | |
| 273 catch (ParseException e) { | |
| 274 errln("Fail: " + e); | |
| 275 e.printStackTrace(); | |
| 276 }*/ | |
| 277 | |
| 278 delete fmt; | |
| 279 } | |
| 280 | |
| 281 /** | |
| 282 * @bug 4059917 | |
| 283 */ | |
| 284 void DateFormatRegressionTest::Test4059917(void) | |
| 285 { | |
| 286 UErrorCode status = U_ZERO_ERROR; | |
| 287 | |
| 288 SimpleDateFormat *fmt; | |
| 289 UnicodeString myDate; | |
| 290 | |
| 291 fmt = new SimpleDateFormat( UnicodeString("yyyy/MM/dd"), status ); | |
| 292 if (failure(status, "new SimpleDateFormat", TRUE)) return; | |
| 293 myDate = "1997/01/01"; | |
| 294 aux917( fmt, myDate ); | |
| 295 | |
| 296 delete fmt; | |
| 297 fmt = NULL; | |
| 298 | |
| 299 fmt = new SimpleDateFormat( UnicodeString("yyyyMMdd"), status ); | |
| 300 if(failure(status, "new SimpleDateFormat")) return; | |
| 301 myDate = "19970101"; | |
| 302 aux917( fmt, myDate ); | |
| 303 | |
| 304 delete fmt; | |
| 305 } | |
| 306 | |
| 307 void DateFormatRegressionTest::aux917( SimpleDateFormat *fmt, UnicodeString& str
) { | |
| 308 //try { | |
| 309 UnicodeString pat; | |
| 310 pat = fmt->toPattern(pat); | |
| 311 logln( "==================" ); | |
| 312 logln( "testIt: pattern=" + pat + | |
| 313 " string=" + str ); | |
| 314 | |
| 315 | |
| 316 Formattable o; | |
| 317 //Object o; | |
| 318 ParsePosition pos(0); | |
| 319 fmt->parseObject( str, o, pos ); | |
| 320 //logln( UnicodeString("Parsed object: ") + o ); | |
| 321 | |
| 322 UErrorCode status = U_ZERO_ERROR; | |
| 323 UnicodeString formatted; | |
| 324 FieldPosition poss(FieldPosition::DONT_CARE); | |
| 325 formatted = fmt->format( o, formatted, poss, status ); | |
| 326 failure(status, "fmt->format"); | |
| 327 logln( "Formatted string: " + formatted ); | |
| 328 if( formatted != str) | |
| 329 errln("Fail: Want " + str + " Got " + formatted); | |
| 330 /*} | |
| 331 catch (ParseException e) { | |
| 332 errln("Fail: " + e); | |
| 333 e.printStackTrace(); | |
| 334 }*/ | |
| 335 } | |
| 336 | |
| 337 /** | |
| 338 * @bug 4060212 | |
| 339 */ | |
| 340 void DateFormatRegressionTest::Test4060212(void) | |
| 341 { | |
| 342 UnicodeString dateString = "1995-040.05:01:29"; | |
| 343 | |
| 344 logln( "dateString= " + dateString ); | |
| 345 logln("Using yyyy-DDD.hh:mm:ss"); | |
| 346 UErrorCode status = U_ZERO_ERROR; | |
| 347 SimpleDateFormat *formatter = new SimpleDateFormat(UnicodeString("yyyy-DDD.h
h:mm:ss"), status); | |
| 348 if (failure(status, "new SimpleDateFormat", TRUE)) return; | |
| 349 ParsePosition pos(0); | |
| 350 UDate myDate = formatter->parse( dateString, pos ); | |
| 351 UnicodeString myString; | |
| 352 DateFormat *fmt = DateFormat::createDateTimeInstance( DateFormat::FULL, | |
| 353 DateFormat::LONG); | |
| 354 if (fmt == NULL) { | |
| 355 dataerrln("Error calling DateFormat::createDateTimeInstance"); | |
| 356 delete formatter; | |
| 357 return; | |
| 358 } | |
| 359 | |
| 360 myString = fmt->format( myDate, myString); | |
| 361 logln( myString ); | |
| 362 | |
| 363 Calendar *cal = new GregorianCalendar(status); | |
| 364 failure(status, "new GregorianCalendar"); | |
| 365 cal->setTime(myDate, status); | |
| 366 failure(status, "cal->setTime"); | |
| 367 if ((cal->get(UCAL_DAY_OF_YEAR, status) != 40) || failure(status, "cal->get"
)) | |
| 368 errln((UnicodeString) "Fail: Got " + cal->get(UCAL_DAY_OF_YEAR, status)
+ | |
| 369 " Want 40"); | |
| 370 | |
| 371 // this is an odd usage of "ddd" and it doesn't | |
| 372 // work now that date values are range checked per #3579. | |
| 373 logln("Using yyyy-ddd.hh:mm:ss"); | |
| 374 delete formatter; | |
| 375 formatter = NULL; | |
| 376 formatter = new SimpleDateFormat(UnicodeString("yyyy-ddd.hh:mm:ss"), status)
; | |
| 377 if(failure(status, "new SimpleDateFormat")) return; | |
| 378 pos.setIndex(0); | |
| 379 myDate = formatter->parse( dateString, pos ); | |
| 380 myString = fmt->format( myDate, myString ); | |
| 381 logln( myString ); | |
| 382 cal->setTime(myDate, status); | |
| 383 failure(status, "cal->setTime"); | |
| 384 if ((cal->get(UCAL_DAY_OF_YEAR, status) != 40) || failure(status, "cal->get"
)) | |
| 385 errln((UnicodeString) "Fail: Got " + cal->get(UCAL_DAY_OF_YEAR, status)
+ | |
| 386 " Want 40"); | |
| 387 | |
| 388 delete formatter; | |
| 389 delete fmt; | |
| 390 delete cal; | |
| 391 } | |
| 392 | |
| 393 /** | |
| 394 * @bug 4061287 | |
| 395 */ | |
| 396 void DateFormatRegressionTest::Test4061287(void) | |
| 397 { | |
| 398 UErrorCode status = U_ZERO_ERROR; | |
| 399 | |
| 400 SimpleDateFormat *df = new SimpleDateFormat(UnicodeString("dd/MM/yyyy"), sta
tus); | |
| 401 if (U_FAILURE(status)) { | |
| 402 dataerrln("Fail new SimpleDateFormat: %s", u_errorName(status)); | |
| 403 delete df; | |
| 404 return; | |
| 405 } | |
| 406 failure(status, "new SimpleDateFormat"); | |
| 407 //try { | |
| 408 logln(UnicodeString("") + df->parse("35/01/1971", status)); | |
| 409 failure(status, "df->parse(\"35/01/1971\")"); | |
| 410 //logln(df.parse("35/01/1971").toString()); | |
| 411 //} | |
| 412 /*catch (ParseException e) { | |
| 413 errln("Fail: " + e); | |
| 414 e.printStackTrace(); | |
| 415 }*/ | |
| 416 df->setLenient(FALSE); | |
| 417 UBool ok = FALSE; | |
| 418 //try { | |
| 419 logln(UnicodeString("") + df->parse("35/01/1971", status)); | |
| 420 if(U_FAILURE(status)) | |
| 421 ok = TRUE; | |
| 422 //logln(df.parse("35/01/1971").toString()); | |
| 423 //} catch (ParseException e) {ok=TRUE;} | |
| 424 if(!ok) | |
| 425 errln("Fail: Lenient not working"); | |
| 426 delete df; | |
| 427 } | |
| 428 | |
| 429 /** | |
| 430 * @bug 4065240 | |
| 431 */ | |
| 432 void DateFormatRegressionTest::Test4065240(void) | |
| 433 { | |
| 434 UDate curDate; | |
| 435 DateFormat *shortdate, *fulldate; | |
| 436 UnicodeString strShortDate, strFullDate; | |
| 437 Locale saveLocale = Locale::getDefault(); | |
| 438 TimeZone *saveZone = TimeZone::createDefault(); | |
| 439 | |
| 440 UErrorCode status = U_ZERO_ERROR; | |
| 441 //try { | |
| 442 Locale *curLocale = new Locale("de","DE"); | |
| 443 Locale::setDefault(*curLocale, status); | |
| 444 failure(status, "Locale::setDefault"); | |
| 445 // {sfb} adoptDefault instead of setDefault | |
| 446 //TimeZone::setDefault(TimeZone::createTimeZone("EST")); | |
| 447 TimeZone::adoptDefault(TimeZone::createTimeZone("EST")); | |
| 448 curDate = date(98, 0, 1); | |
| 449 shortdate = DateFormat::createDateInstance(DateFormat::SHORT); | |
| 450 if (shortdate == NULL){ | |
| 451 dataerrln("Error calling DateFormat::createDateInstance"); | |
| 452 return; | |
| 453 } | |
| 454 | |
| 455 fulldate = DateFormat::createDateTimeInstance(DateFormat::LONG, DateForm
at::LONG); | |
| 456 if (fulldate == NULL){ | |
| 457 dataerrln("Error calling DateFormat::createDateTimeInstance"); | |
| 458 return; | |
| 459 } | |
| 460 strShortDate = "The current date (short form) is "; | |
| 461 UnicodeString temp; | |
| 462 temp = shortdate->format(curDate, temp); | |
| 463 strShortDate += temp; | |
| 464 strFullDate = "The current date (long form) is "; | |
| 465 UnicodeString temp2; | |
| 466 fulldate->format(curDate, temp2); | |
| 467 strFullDate += temp2; | |
| 468 | |
| 469 logln(strShortDate); | |
| 470 logln(strFullDate); | |
| 471 | |
| 472 // {sfb} What to do with resource bundle stuff????? | |
| 473 | |
| 474 // Check to see if the resource is present; if not, we can't test | |
| 475 ResourceBundle *bundle = new ResourceBundle( | |
| 476 NULL, *curLocale, status); | |
| 477 failure(status, "new ResourceBundle"); | |
| 478 //(UnicodeString) "java.text.resources.DateFormatZoneData", curLocal
e); | |
| 479 | |
| 480 // {sfb} API change to ResourceBundle -- add getLocale() | |
| 481 /*if (bundle->getLocale().getLanguage(temp) == UnicodeString("de")) { | |
| 482 // UPDATE THIS AS ZONE NAME RESOURCE FOR <EST> in de_DE is updated | |
| 483 if (!strFullDate.endsWith(UnicodeString("GMT-05:00"))) | |
| 484 errln("Fail: Want GMT-05:00"); | |
| 485 } | |
| 486 else { | |
| 487 logln("*** TEST COULD NOT BE COMPLETED BECAUSE DateFormatZoneData **
*"); | |
| 488 logln("*** FOR LOCALE de OR de_DE IS MISSING ***"); | |
| 489 }*/ | |
| 490 //} | |
| 491 //finally { | |
| 492 Locale::setDefault(saveLocale, status); | |
| 493 failure(status, "Locale::setDefault"); | |
| 494 TimeZone::setDefault(*saveZone); | |
| 495 //} | |
| 496 delete shortdate; | |
| 497 delete fulldate; | |
| 498 delete saveZone; | |
| 499 delete curLocale; | |
| 500 delete bundle; | |
| 501 } | |
| 502 | |
| 503 /* | |
| 504 DateFormat.equals is too narrowly defined. As a result, MessageFormat | |
| 505 does not work correctly. DateFormat.equals needs to be written so | |
| 506 that the Calendar sub-object is not compared using Calendar.equals, | |
| 507 but rather compared for equivalency. This may necessitate adding a | |
| 508 (package private) method to Calendar to test for equivalency. | |
| 509 | |
| 510 Currently this bug breaks MessageFormat.toPattern | |
| 511 */ | |
| 512 /** | |
| 513 * @bug 4071441 | |
| 514 */ | |
| 515 void DateFormatRegressionTest::Test4071441(void) | |
| 516 { | |
| 517 DateFormat *fmtA = DateFormat::createInstance(); | |
| 518 DateFormat *fmtB = DateFormat::createInstance(); | |
| 519 | |
| 520 if (fmtA == NULL || fmtB == NULL){ | |
| 521 dataerrln("Error calling DateFormat::createInstance"); | |
| 522 delete fmtA; | |
| 523 delete fmtB; | |
| 524 return; | |
| 525 } | |
| 526 | |
| 527 // {sfb} Is it OK to cast away const here? | |
| 528 Calendar *calA = (Calendar*) fmtA->getCalendar(); | |
| 529 Calendar *calB = (Calendar*) fmtB->getCalendar(); | |
| 530 if(!calA || !calB) { | |
| 531 errln("Couldn't get proper calendars, exiting"); | |
| 532 delete fmtA; | |
| 533 delete fmtB; | |
| 534 return; | |
| 535 } | |
| 536 UDate epoch = date(0, 0, 0); | |
| 537 UDate xmas = date(61, UCAL_DECEMBER, 25); | |
| 538 | |
| 539 UErrorCode status = U_ZERO_ERROR; | |
| 540 calA->setTime(epoch, status); | |
| 541 failure(status, "calA->setTime"); | |
| 542 calB->setTime(epoch, status); | |
| 543 failure(status, "calB->setTime"); | |
| 544 if (*calA != *calB) | |
| 545 errln("Fail: Can't complete test; Calendar instances unequal"); | |
| 546 if (*fmtA != *fmtB) | |
| 547 errln("Fail: DateFormat unequal when Calendars equal"); | |
| 548 calB->setTime(xmas, status); | |
| 549 failure(status, "calB->setTime"); | |
| 550 if (*calA == *calB) | |
| 551 errln("Fail: Can't complete test; Calendar instances equal"); | |
| 552 if (*fmtA != *fmtB) | |
| 553 errln("Fail: DateFormat unequal when Calendars equivalent"); | |
| 554 | |
| 555 logln("DateFormat.equals ok"); | |
| 556 | |
| 557 delete fmtA; | |
| 558 delete fmtB; | |
| 559 } | |
| 560 | |
| 561 /* The java.text.DateFormat.parse(String) method expects for the | |
| 562 US locale a string formatted according to mm/dd/yy and parses it | |
| 563 correctly. | |
| 564 | |
| 565 When given a string mm/dd/yyyy [sic] it only parses up to the first | |
| 566 two y's, typically resulting in a date in the year 1919. | |
| 567 | |
| 568 Please extend the parsing method(s) to handle strings with | |
| 569 four-digit year values (probably also applicable to various | |
| 570 other locales. */ | |
| 571 /** | |
| 572 * @bug 4073003 | |
| 573 */ | |
| 574 void DateFormatRegressionTest::Test4073003(void) | |
| 575 { | |
| 576 //try { | |
| 577 UErrorCode ec = U_ZERO_ERROR; | |
| 578 SimpleDateFormat fmt("MM/dd/yy", Locale::getUK(), ec); | |
| 579 if (U_FAILURE(ec)) { | |
| 580 dataerrln("FAIL: SimpleDateFormat constructor - %s", u_errorName(ec)); | |
| 581 return; | |
| 582 } | |
| 583 UnicodeString tests [] = { | |
| 584 (UnicodeString) "12/25/61", | |
| 585 (UnicodeString) "12/25/1961", | |
| 586 (UnicodeString) "4/3/2010", | |
| 587 (UnicodeString) "4/3/10" | |
| 588 }; | |
| 589 UErrorCode status = U_ZERO_ERROR; | |
| 590 for(int i= 0; i < 4; i+=2) { | |
| 591 UDate d = fmt.parse(tests[i], status); | |
| 592 failure(status, "fmt.parse"); | |
| 593 UDate dd = fmt.parse(tests[i+1], status); | |
| 594 failure(status, "fmt.parse"); | |
| 595 UnicodeString s; | |
| 596 s = fmt.format(d, s); | |
| 597 UnicodeString ss; | |
| 598 ss = fmt.format(dd, ss); | |
| 599 if (d != dd) | |
| 600 errln((UnicodeString) "Fail: " + d + " != " + dd); | |
| 601 if (s != ss) | |
| 602 errln((UnicodeString)"Fail: " + s + " != " + ss); | |
| 603 logln("Ok: " + s + " " + d); | |
| 604 } | |
| 605 } | |
| 606 | |
| 607 /** | |
| 608 * @bug 4089106 | |
| 609 */ | |
| 610 void DateFormatRegressionTest::Test4089106(void) | |
| 611 { | |
| 612 TimeZone *def = TimeZone::createDefault(); | |
| 613 //try { | |
| 614 TimeZone *z = new SimpleTimeZone((int)(1.25 * 3600000), "FAKEZONE"); | |
| 615 TimeZone::setDefault(*z); | |
| 616 UErrorCode status = U_ZERO_ERROR; | |
| 617 SimpleDateFormat *f = new SimpleDateFormat(status); | |
| 618 if(U_FAILURE(status)) { | |
| 619 dataerrln("Couldn't create SimpleDateFormat, error %s", u_errorName(st
atus)); | |
| 620 delete f; | |
| 621 delete def; | |
| 622 delete z; | |
| 623 return; | |
| 624 } | |
| 625 failure(status, "new SimpleDateFormat"); | |
| 626 if (f->getTimeZone()!= *z) | |
| 627 errln("Fail: SimpleTimeZone should use TimeZone.getDefault()"); | |
| 628 | |
| 629 //} | |
| 630 //finally { | |
| 631 TimeZone::setDefault(*def); | |
| 632 //} | |
| 633 | |
| 634 delete z; | |
| 635 delete f; | |
| 636 delete def; | |
| 637 } | |
| 638 | |
| 639 /** | |
| 640 * @bug 4100302 | |
| 641 */ | |
| 642 | |
| 643 // {sfb} not applicable in C++?? | |
| 644 | |
| 645 void DateFormatRegressionTest::Test4100302(void) | |
| 646 { | |
| 647 /* Locale locales [] = { | |
| 648 Locale::CANADA, | |
| 649 Locale::CANADA_FRENCH, | |
| 650 Locale::CHINA, | |
| 651 Locale::CHINESE, | |
| 652 Locale::ENGLISH, | |
| 653 Locale::FRANCE, | |
| 654 Locale::FRENCH, | |
| 655 Locale::GERMAN, | |
| 656 Locale::GERMANY, | |
| 657 Locale::ITALIAN, | |
| 658 Locale::ITALY, | |
| 659 Locale::JAPAN, | |
| 660 Locale::JAPANESE, | |
| 661 Locale::KOREA, | |
| 662 Locale::KOREAN, | |
| 663 Locale::PRC, | |
| 664 Locale::SIMPLIFIED_CHINESE, | |
| 665 Locale::TAIWAN, | |
| 666 Locale::TRADITIONAL_CHINESE, | |
| 667 Locale::UK, | |
| 668 Locale::US | |
| 669 }; | |
| 670 //try { | |
| 671 UBool pass = TRUE; | |
| 672 for(int i = 0; i < 21; i++) { | |
| 673 | |
| 674 Format *format = DateFormat::createDateTimeInstance(DateFormat::FULL
, | |
| 675 DateFormat::FULL, locales[i]); | |
| 676 byte[] bytes; | |
| 677 | |
| 678 ByteArrayOutputStream baos = new ByteArrayOutputStream(); | |
| 679 ObjectOutputStream oos = new ObjectOutputStream(baos); | |
| 680 | |
| 681 oos.writeObject(format); | |
| 682 oos.flush(); | |
| 683 | |
| 684 baos.close(); | |
| 685 bytes = baos.toByteArray(); | |
| 686 | |
| 687 ObjectInputStream ois = | |
| 688 new ObjectInputStream(new ByteArrayInputStream(bytes)); | |
| 689 | |
| 690 if (!format.equals(ois.readObject())) { | |
| 691 pass = FALSE; | |
| 692 logln("DateFormat instance for locale " + | |
| 693 locales[i] + " is incorrectly serialized/deserialized."); | |
| 694 } else { | |
| 695 logln("DateFormat instance for locale " + | |
| 696 locales[i] + " is OKAY."); | |
| 697 } | |
| 698 } | |
| 699 if (!pass) errln("Fail: DateFormat serialization/equality bug"); | |
| 700 } | |
| 701 catch (IOException e) { | |
| 702 errln("Fail: " + e); | |
| 703 e.printStackTrace(); | |
| 704 } | |
| 705 catch (ClassNotFoundException e) { | |
| 706 errln("Fail: " + e); | |
| 707 e.printStackTrace(); | |
| 708 } | |
| 709 */} | |
| 710 | |
| 711 /** | |
| 712 * @bug 4101483 | |
| 713 */ | |
| 714 void DateFormatRegressionTest::Test4101483(void) | |
| 715 { | |
| 716 UErrorCode status = U_ZERO_ERROR; | |
| 717 SimpleDateFormat *sdf = new SimpleDateFormat(UnicodeString("z"), Locale::get
US(), status); | |
| 718 if (failure(status, "new SimpleDateFormat", TRUE)) return; | |
| 719 FieldPosition fp(UDAT_TIMEZONE_FIELD); | |
| 720 //Date d = date(9234567890L); | |
| 721 UDate d = 9234567890.0; | |
| 722 //StringBuffer buf = new StringBuffer(""); | |
| 723 UnicodeString buf; | |
| 724 sdf->format(d, buf, fp); | |
| 725 //logln(sdf.format(d, buf, fp).toString()); | |
| 726 logln(dateToString(d) + " => " + buf); | |
| 727 logln(UnicodeString("beginIndex = ") + fp.getBeginIndex()); | |
| 728 logln(UnicodeString("endIndex = ") + fp.getEndIndex()); | |
| 729 if (fp.getBeginIndex() == fp.getEndIndex()) | |
| 730 errln("Fail: Empty field"); | |
| 731 | |
| 732 delete sdf; | |
| 733 } | |
| 734 | |
| 735 /** | |
| 736 * @bug 4103340 | |
| 737 * @bug 4138203 | |
| 738 * This bug really only works in Locale.US, since that's what the locale | |
| 739 * used for Date.toString() is. Bug 4138203 reports that it fails on Korean | |
| 740 * NT; it would actually have failed on any non-US locale. Now it should | |
| 741 * work on all locales. | |
| 742 */ | |
| 743 void DateFormatRegressionTest::Test4103340(void) | |
| 744 { | |
| 745 UErrorCode status = U_ZERO_ERROR; | |
| 746 | |
| 747 // choose a date that is the FIRST of some month | |
| 748 // and some arbitrary time | |
| 749 UDate d = date(97, 3, 1, 1, 1, 1); | |
| 750 SimpleDateFormat *df = new SimpleDateFormat(UnicodeString("MMMM"), Locale::g
etUS(), status); | |
| 751 if (failure(status, "new SimpleDateFormat", TRUE)) return; | |
| 752 | |
| 753 UnicodeString s; | |
| 754 s = dateToString(d, s); | |
| 755 UnicodeString s2; | |
| 756 FieldPosition pos(FieldPosition::DONT_CARE); | |
| 757 s2 = df->format(d, s2, pos); | |
| 758 logln("Date=" + s); | |
| 759 logln("DF=" + s2); | |
| 760 UnicodeString substr; | |
| 761 s2.extract(0,2, substr); | |
| 762 if (s.indexOf(substr) == -1) | |
| 763 errln("Months should match"); | |
| 764 | |
| 765 delete df; | |
| 766 } | |
| 767 | |
| 768 /** | |
| 769 * @bug 4103341 | |
| 770 */ | |
| 771 void DateFormatRegressionTest::Test4103341(void) | |
| 772 { | |
| 773 TimeZone *saveZone =TimeZone::createDefault(); | |
| 774 //try { | |
| 775 | |
| 776 // {sfb} changed from setDefault to adoptDefault | |
| 777 TimeZone::adoptDefault(TimeZone::createTimeZone("CST")); | |
| 778 UErrorCode status = U_ZERO_ERROR; | |
| 779 SimpleDateFormat *simple = new SimpleDateFormat(UnicodeString("MM/dd/yyyy HH
:mm"), status); | |
| 780 if(U_FAILURE(status)) { | |
| 781 dataerrln("Couldn't create SimpleDateFormat, error %s", u_errorName(status
)); | |
| 782 delete simple; | |
| 783 return; | |
| 784 } | |
| 785 failure(status, "new SimpleDateFormat"); | |
| 786 TimeZone *temp = TimeZone::createDefault(); | |
| 787 if(simple->getTimeZone() != *temp) | |
| 788 errln("Fail: SimpleDateFormat not using default zone"); | |
| 789 //} | |
| 790 //finally { | |
| 791 TimeZone::adoptDefault(saveZone); | |
| 792 //} | |
| 793 | |
| 794 delete temp; | |
| 795 delete simple; | |
| 796 } | |
| 797 | |
| 798 /** | |
| 799 * @bug 4104136 | |
| 800 */ | |
| 801 void DateFormatRegressionTest::Test4104136(void) | |
| 802 { | |
| 803 UErrorCode status = U_ZERO_ERROR; | |
| 804 SimpleDateFormat *sdf = new SimpleDateFormat(status); | |
| 805 if(U_FAILURE(status)) { | |
| 806 dataerrln("Couldn't create SimpleDateFormat, error %s", u_errorName(status
)); | |
| 807 delete sdf; | |
| 808 return; | |
| 809 } | |
| 810 if(failure(status, "new SimpleDateFormat")) return; | |
| 811 UnicodeString pattern = "'time' hh:mm"; | |
| 812 sdf->applyPattern(pattern); | |
| 813 logln("pattern: \"" + pattern + "\""); | |
| 814 | |
| 815 UnicodeString strings [] = { | |
| 816 (UnicodeString)"time 10:30", | |
| 817 (UnicodeString) "time 10:x", | |
| 818 (UnicodeString) "time 10x" | |
| 819 }; | |
| 820 | |
| 821 ParsePosition ppos [] = { | |
| 822 ParsePosition(10), | |
| 823 ParsePosition(0), | |
| 824 ParsePosition(0) | |
| 825 }; | |
| 826 | |
| 827 UDate dates [] = { | |
| 828 date(70, UCAL_JANUARY, 1, 10, 30), | |
| 829 -1, | |
| 830 -1 | |
| 831 }; | |
| 832 | |
| 833 /*Object[] DATA = { | |
| 834 "time 10:30", new ParsePosition(10), new Date(70, Calendar.JANUARY, 1, 1
0, 30), | |
| 835 "time 10:x", new ParsePosition(0), null, | |
| 836 "time 10x", new ParsePosition(0), null, | |
| 837 };*/ | |
| 838 | |
| 839 for(int i = 0; i < 3; i++) { | |
| 840 UnicodeString text = strings[i]; | |
| 841 ParsePosition finish = ppos[i]; | |
| 842 UDate exp = dates[i]; | |
| 843 | |
| 844 ParsePosition pos(0); | |
| 845 UDate d = sdf->parse(text, pos); | |
| 846 logln(" text: \"" + text + "\""); | |
| 847 logln(" index: %d", pos.getIndex()); | |
| 848 logln((UnicodeString) " result: " + d); | |
| 849 if(pos.getIndex() != finish.getIndex()) | |
| 850 errln(UnicodeString("Fail: Expected pos ") + finish.getIndex()); | |
| 851 if (! ((d == 0 && exp == -1) || (d == exp))) | |
| 852 errln((UnicodeString) "Fail: Expected result " + exp); | |
| 853 } | |
| 854 | |
| 855 delete sdf; | |
| 856 } | |
| 857 | |
| 858 /** | |
| 859 * @bug 4104522 | |
| 860 * CANNOT REPRODUCE | |
| 861 * According to the bug report, this test should throw a | |
| 862 * StringIndexOutOfBoundsException during the second parse. However, | |
| 863 * this is not seen. | |
| 864 */ | |
| 865 void DateFormatRegressionTest::Test4104522(void) | |
| 866 { | |
| 867 UErrorCode status = U_ZERO_ERROR; | |
| 868 | |
| 869 SimpleDateFormat *sdf = new SimpleDateFormat(status); | |
| 870 if(U_FAILURE(status)) { | |
| 871 dataerrln("Couldn't create SimpleDateFormat, error %s", u_errorName(status
)); | |
| 872 delete sdf; | |
| 873 return; | |
| 874 } | |
| 875 failure(status, "new SimpleDateFormat"); | |
| 876 UnicodeString pattern = "'time' hh:mm"; | |
| 877 sdf->applyPattern(pattern); | |
| 878 logln("pattern: \"" + pattern + "\""); | |
| 879 | |
| 880 // works correctly | |
| 881 ParsePosition pp(0); | |
| 882 UnicodeString text = "time "; | |
| 883 UDate dt = sdf->parse(text, pp); | |
| 884 logln(" text: \"" + text + "\"" + | |
| 885 " date: " + dt); | |
| 886 | |
| 887 // works wrong | |
| 888 pp.setIndex(0); | |
| 889 text = "time"; | |
| 890 dt = sdf->parse(text, pp); | |
| 891 logln(" text: \"" + text + "\"" + | |
| 892 " date: " + dt); | |
| 893 | |
| 894 delete sdf; | |
| 895 } | |
| 896 | |
| 897 /** | |
| 898 * @bug 4106807 | |
| 899 */ | |
| 900 void DateFormatRegressionTest::Test4106807(void) | |
| 901 { | |
| 902 UDate dt; | |
| 903 DateFormat *df = DateFormat::createDateTimeInstance(); | |
| 904 | |
| 905 UErrorCode status = U_ZERO_ERROR; | |
| 906 SimpleDateFormat *sdfs [] = { | |
| 907 new SimpleDateFormat(UnicodeString("yyyyMMddHHmmss"), status), | |
| 908 new SimpleDateFormat(UnicodeString("yyyyMMddHHmmss'Z'"), status), | |
| 909 new SimpleDateFormat(UnicodeString("yyyyMMddHHmmss''"), status), | |
| 910 new SimpleDateFormat(UnicodeString("yyyyMMddHHmmss'a''a'"), status), | |
| 911 new SimpleDateFormat(UnicodeString("yyyyMMddHHmmss %"), status) | |
| 912 }; | |
| 913 if(U_FAILURE(status)) { | |
| 914 dataerrln("Couldn't create SimpleDateFormat, error %s", u_errorName(status
)); | |
| 915 delete sdfs[0]; | |
| 916 delete sdfs[1]; | |
| 917 delete sdfs[2]; | |
| 918 delete sdfs[3]; | |
| 919 delete sdfs[4]; | |
| 920 return; | |
| 921 } | |
| 922 | |
| 923 failure(status, "new SimpleDateFormat"); | |
| 924 | |
| 925 UnicodeString strings [] = { | |
| 926 (UnicodeString) "19980211140000", | |
| 927 (UnicodeString) "19980211140000", | |
| 928 (UnicodeString) "19980211140000", | |
| 929 (UnicodeString) "19980211140000a", | |
| 930 (UnicodeString) "19980211140000 " | |
| 931 }; | |
| 932 | |
| 933 /*Object[] data = { | |
| 934 new SimpleDateFormat("yyyyMMddHHmmss"), "19980211140000", | |
| 935 new SimpleDateFormat("yyyyMMddHHmmss'Z'"), "19980211140000", | |
| 936 new SimpleDateFormat("yyyyMMddHHmmss''"), "19980211140000", | |
| 937 new SimpleDateFormat("yyyyMMddHHmmss'a''a'"), "19980211140000a", | |
| 938 new SimpleDateFormat("yyyyMMddHHmmss %"), "19980211140000 ", | |
| 939 };*/ | |
| 940 GregorianCalendar *gc = new GregorianCalendar(status); | |
| 941 failure(status, "new GregorianCalendar"); | |
| 942 TimeZone *timeZone = TimeZone::createDefault(); | |
| 943 | |
| 944 TimeZone *gmt = timeZone->clone(); | |
| 945 | |
| 946 gmt->setRawOffset(0); | |
| 947 | |
| 948 for(int32_t i = 0; i < 5; i++) { | |
| 949 SimpleDateFormat *format = sdfs[i]; | |
| 950 UnicodeString dateString = strings[i]; | |
| 951 //try { | |
| 952 format->setTimeZone(*gmt); | |
| 953 dt = format->parse(dateString, status); | |
| 954 // {sfb} some of these parses will fail purposely | |
| 955 if(U_FAILURE(status)) | |
| 956 break; | |
| 957 status = U_ZERO_ERROR; | |
| 958 UnicodeString fmtd; | |
| 959 FieldPosition pos(FieldPosition::DONT_CARE); | |
| 960 fmtd = df->format(dt, fmtd, pos); | |
| 961 logln(fmtd); | |
| 962 //logln(df->format(dt)); | |
| 963 gc->setTime(dt, status); | |
| 964 failure(status, "gc->getTime"); | |
| 965 logln(UnicodeString("") + gc->get(UCAL_ZONE_OFFSET, status)); | |
| 966 failure(status, "gc->get"); | |
| 967 UnicodeString s; | |
| 968 s = format->format(dt, s, pos); | |
| 969 logln(s); | |
| 970 /*} | |
| 971 catch (ParseException e) { | |
| 972 logln("No way Jose"); | |
| 973 }*/ | |
| 974 } | |
| 975 | |
| 976 delete timeZone; | |
| 977 delete df; | |
| 978 for(int32_t j = 0; j < 5; j++) | |
| 979 delete sdfs [j]; | |
| 980 delete gc; | |
| 981 delete gmt; | |
| 982 } | |
| 983 | |
| 984 /* | |
| 985 Synopsis: Chinese time zone CTT is not recogonized correctly. | |
| 986 Description: Platform Chinese Windows 95 - ** Time zone set to CST ** | |
| 987 */ | |
| 988 /** | |
| 989 * @bug 4108407 | |
| 990 */ | |
| 991 | |
| 992 // {sfb} what to do with this one ?? | |
| 993 void DateFormatRegressionTest::Test4108407(void) | |
| 994 { | |
| 995 /*long l = System.currentTimeMillis(); | |
| 996 logln("user.timezone = " + System.getProperty("user.timezone", "?")); | |
| 997 logln("Time Zone :" + | |
| 998 DateFormat.getDateInstance().getTimeZone().getID()); | |
| 999 logln("Default format :" + | |
| 1000 DateFormat.getDateInstance().format(new Date(l))); | |
| 1001 logln("Full format :" + | |
| 1002 DateFormat.getDateInstance(DateFormat.FULL).format(new | |
| 1003 Date(l
))); | |
| 1004 logln("*** Set host TZ to CST ***"); | |
| 1005 logln("*** THE RESULTS OF THIS TEST MUST BE VERIFIED MANUALLY ***");*/ | |
| 1006 } | |
| 1007 | |
| 1008 /** | |
| 1009 * @bug 4134203 | |
| 1010 * SimpleDateFormat won't parse "GMT" | |
| 1011 */ | |
| 1012 void DateFormatRegressionTest::Test4134203(void) | |
| 1013 { | |
| 1014 UErrorCode status = U_ZERO_ERROR; | |
| 1015 UnicodeString dateFormat = "MM/dd/yy HH:mm:ss zzz"; | |
| 1016 SimpleDateFormat *fmt = new SimpleDateFormat(dateFormat, status); | |
| 1017 if (failure(status, "new SimpleDateFormat", TRUE)) return; | |
| 1018 ParsePosition p0(0); | |
| 1019 UDate d = fmt->parse("01/22/92 04:52:00 GMT", p0); | |
| 1020 logln(dateToString(d)); | |
| 1021 if(p0 == ParsePosition(0)) | |
| 1022 errln("Fail: failed to parse 'GMT'"); | |
| 1023 // In the failure case an exception is thrown by parse(); | |
| 1024 // if no exception is thrown, the test passes. | |
| 1025 | |
| 1026 delete fmt; | |
| 1027 } | |
| 1028 | |
| 1029 /** | |
| 1030 * @bug 4151631 | |
| 1031 * SimpleDateFormat incorrect handling of 2 single quotes in format() | |
| 1032 */ | |
| 1033 void DateFormatRegressionTest::Test4151631(void) | |
| 1034 { | |
| 1035 UnicodeString pattern = "'TO_DATE('''dd'-'MM'-'yyyy HH:mm:ss''' , ''DD-MM-YY
YY HH:MI:SS'')'"; | |
| 1036 logln("pattern=" + pattern); | |
| 1037 UErrorCode status = U_ZERO_ERROR; | |
| 1038 SimpleDateFormat *format = new SimpleDateFormat(pattern, Locale::getUS(), st
atus); | |
| 1039 if (failure(status, "new SimpleDateFormat", TRUE)) return; | |
| 1040 UnicodeString result; | |
| 1041 FieldPosition pos(FieldPosition::DONT_CARE); | |
| 1042 result = format->format(date(1998-1900, UCAL_JUNE, 30, 13, 30, 0), result, p
os); | |
| 1043 if (result != "TO_DATE('30-06-1998 13:30:00' , 'DD-MM-YYYY HH:MI:SS')") { | |
| 1044 errln("Fail: result=" + result); | |
| 1045 } | |
| 1046 else { | |
| 1047 logln("Pass: result=" + result); | |
| 1048 } | |
| 1049 | |
| 1050 delete format; | |
| 1051 } | |
| 1052 | |
| 1053 /** | |
| 1054 * @bug 4151706 | |
| 1055 * 'z' at end of date format throws index exception in SimpleDateFormat | |
| 1056 * CANNOT REPRODUCE THIS BUG ON 1.2FCS | |
| 1057 */ | |
| 1058 void DateFormatRegressionTest::Test4151706(void) | |
| 1059 { | |
| 1060 UnicodeString dateString("Thursday, 31-Dec-98 23:00:00 GMT"); | |
| 1061 UErrorCode status = U_ZERO_ERROR; | |
| 1062 SimpleDateFormat fmt(UnicodeString("EEEE, dd-MMM-yy HH:mm:ss z"), Locale::ge
tUS(), status); | |
| 1063 if (failure(status, "new SimpleDateFormat", TRUE)) return; | |
| 1064 //try { | |
| 1065 UDate d = fmt.parse(dateString, status); | |
| 1066 failure(status, "fmt->parse"); | |
| 1067 // {sfb} what about next two lines? | |
| 1068 //if (d.getTime() != Date.UTC(1998-1900, Calendar.DECEMBER, 31, 23, 0, 0
)) | |
| 1069 // errln("Incorrect value: " + d); | |
| 1070 /*} catch (Exception e) { | |
| 1071 errln("Fail: " + e); | |
| 1072 }*/ | |
| 1073 UnicodeString temp; | |
| 1074 FieldPosition pos(0); | |
| 1075 logln(dateString + " -> " + fmt.format(d, temp, pos)); | |
| 1076 } | |
| 1077 | |
| 1078 /** | |
| 1079 * @bug 4162071 | |
| 1080 * Cannot reproduce this bug under 1.2 FCS -- it may be a convoluted duplicate | |
| 1081 * of some other bug that has been fixed. | |
| 1082 */ | |
| 1083 void | |
| 1084 DateFormatRegressionTest::Test4162071(void) | |
| 1085 { | |
| 1086 UnicodeString dateString("Thu, 30-Jul-1999 11:51:14 GMT"); | |
| 1087 UnicodeString format("EEE', 'dd-MMM-yyyy HH:mm:ss z"); // RFC 822/1123 | |
| 1088 UErrorCode status = U_ZERO_ERROR; | |
| 1089 SimpleDateFormat df(format, Locale::getUS(), status); | |
| 1090 if(U_FAILURE(status)) { | |
| 1091 dataerrln("Couldn't create SimpleDateFormat - %s", u_errorName(status)); | |
| 1092 return; | |
| 1093 } | |
| 1094 | |
| 1095 //try { | |
| 1096 UDate x = df.parse(dateString, status); | |
| 1097 if(U_SUCCESS(status)) | |
| 1098 logln("Parse format \"" + format + "\" ok"); | |
| 1099 else | |
| 1100 errln("Parse format \"" + format + "\" failed."); | |
| 1101 UnicodeString temp; | |
| 1102 FieldPosition pos(0); | |
| 1103 logln(dateString + " -> " + df.format(x, temp, pos)); | |
| 1104 //} catch (Exception e) { | |
| 1105 // errln("Parse format \"" + format + "\" failed."); | |
| 1106 //} | |
| 1107 } | |
| 1108 | |
| 1109 /** | |
| 1110 * DateFormat shouldn't parse year "-1" as a two-digit year (e.g., "-1" -> 1999)
. | |
| 1111 */ | |
| 1112 void DateFormatRegressionTest::Test4182066(void) { | |
| 1113 UErrorCode status = U_ZERO_ERROR; | |
| 1114 SimpleDateFormat fmt("MM/dd/yy", Locale::getUS(), status); | |
| 1115 SimpleDateFormat dispFmt("MMM dd yyyy GG", Locale::getUS(), status); | |
| 1116 if (U_FAILURE(status)) { | |
| 1117 dataerrln("Couldn't create SimpleDateFormat - %s", u_errorName(status)); | |
| 1118 return; | |
| 1119 } | |
| 1120 | |
| 1121 /* We expect 2-digit year formats to put 2-digit years in the right | |
| 1122 * window. Out of range years, that is, anything less than "00" or | |
| 1123 * greater than "99", are treated as literal years. So "1/2/3456" | |
| 1124 * becomes 3456 AD. Likewise, "1/2/-3" becomes -3 AD == 2 BC. | |
| 1125 */ | |
| 1126 const char* STRINGS[] = { | |
| 1127 "02/29/00", | |
| 1128 "01/23/01", | |
| 1129 "04/05/-1", | |
| 1130 "01/23/-9", | |
| 1131 "11/12/1314", | |
| 1132 "10/31/1", | |
| 1133 "09/12/+1", | |
| 1134 "09/12/001", | |
| 1135 }; | |
| 1136 int32_t STRINGS_COUNT = (int32_t)(sizeof(STRINGS) / sizeof(STRINGS[0])); | |
| 1137 UDate FAIL_DATE = (UDate) 0; | |
| 1138 UDate DATES[] = { | |
| 1139 date(2000-1900, UCAL_FEBRUARY, 29), | |
| 1140 date(2001-1900, UCAL_JANUARY, 23), | |
| 1141 date( -1-1900, UCAL_APRIL, 5), | |
| 1142 date( -9-1900, UCAL_JANUARY, 23), | |
| 1143 date(1314-1900, UCAL_NOVEMBER, 12), | |
| 1144 date( 1-1900, UCAL_OCTOBER, 31), | |
| 1145 FAIL_DATE, // "+1" isn't recognized by US NumberFormat | |
| 1146 date( 1-1900, UCAL_SEPTEMBER,12), | |
| 1147 }; | |
| 1148 | |
| 1149 UnicodeString out; | |
| 1150 UBool pass = TRUE; | |
| 1151 for (int32_t i=0; i<STRINGS_COUNT; ++i) { | |
| 1152 UnicodeString str(STRINGS[i]); | |
| 1153 UDate expected = DATES[i]; | |
| 1154 status = U_ZERO_ERROR; | |
| 1155 UDate actual = fmt.parse(str, status); | |
| 1156 if (U_FAILURE(status)) { | |
| 1157 actual = FAIL_DATE; | |
| 1158 } | |
| 1159 UnicodeString actStr; | |
| 1160 if (actual == FAIL_DATE) { | |
| 1161 actStr.append("null"); | |
| 1162 } else { | |
| 1163 // Yuck: See j25 | |
| 1164 ((DateFormat*)&dispFmt)->format(actual, actStr); | |
| 1165 } | |
| 1166 | |
| 1167 if (expected == actual) { | |
| 1168 out.append(str + " => " + actStr + "\n"); | |
| 1169 } else { | |
| 1170 UnicodeString expStr; | |
| 1171 if (expected == FAIL_DATE) { | |
| 1172 expStr.append("null"); | |
| 1173 } else { | |
| 1174 // Yuck: See j25 | |
| 1175 ((DateFormat*)&dispFmt)->format(expected, expStr); | |
| 1176 } | |
| 1177 out.append("FAIL: " + str + " => " + actStr | |
| 1178 + ", expected " + expStr + "\n"); | |
| 1179 pass = FALSE; | |
| 1180 } | |
| 1181 } | |
| 1182 if (pass) { | |
| 1183 log(out); | |
| 1184 } else { | |
| 1185 err(out); | |
| 1186 } | |
| 1187 } | |
| 1188 | |
| 1189 /** | |
| 1190 * j32 {JDK Bug 4210209 4209272} | |
| 1191 * DateFormat cannot parse Feb 29 2000 when setLenient(false) | |
| 1192 */ | |
| 1193 void | |
| 1194 DateFormatRegressionTest::Test4210209(void) { | |
| 1195 UErrorCode status = U_ZERO_ERROR; | |
| 1196 UnicodeString pattern("MMM d, yyyy"); | |
| 1197 SimpleDateFormat sfmt(pattern, Locale::getUS(), status); | |
| 1198 SimpleDateFormat sdisp("MMM dd yyyy GG", Locale::getUS(), status); | |
| 1199 DateFormat& fmt = *(DateFormat*)&sfmt; // Yuck: See j25 | |
| 1200 DateFormat& disp = *(DateFormat*)&sdisp; // Yuck: See j25 | |
| 1201 if (U_FAILURE(status)) { | |
| 1202 dataerrln("Couldn't create SimpleDateFormat - %s", u_errorName(status)); | |
| 1203 return; | |
| 1204 } | |
| 1205 Calendar* calx = (Calendar*)fmt.getCalendar(); // cast away const! | |
| 1206 calx->setLenient(FALSE); | |
| 1207 UDate d = date(2000-1900, UCAL_FEBRUARY, 29); | |
| 1208 UnicodeString s, ss; | |
| 1209 fmt.format(d, s); | |
| 1210 logln(disp.format(d, ss.remove()) + " f> " + pattern + | |
| 1211 " => \"" + s + "\""); | |
| 1212 ParsePosition pos(0); | |
| 1213 d = fmt.parse(s, pos); | |
| 1214 logln(UnicodeString("\"") + s + "\" p> " + pattern + | |
| 1215 " => " + disp.format(d, ss.remove())); | |
| 1216 logln(UnicodeString("Parse pos = ") + pos.getIndex() + | |
| 1217 ", error pos = " + pos.getErrorIndex()); | |
| 1218 if (pos.getErrorIndex() != -1) { | |
| 1219 errln(UnicodeString("FAIL: Error index should be -1")); | |
| 1220 } | |
| 1221 | |
| 1222 // The underlying bug is in GregorianCalendar. If the following lines | |
| 1223 // succeed, the bug is fixed. If the bug isn't fixed, they will throw | |
| 1224 // an exception. | |
| 1225 GregorianCalendar cal(status); | |
| 1226 if (U_FAILURE(status)) { | |
| 1227 errln("FAIL: Unable to create Calendar"); | |
| 1228 return; | |
| 1229 } | |
| 1230 cal.clear(); | |
| 1231 cal.setLenient(FALSE); | |
| 1232 cal.set(2000, UCAL_FEBRUARY, 29); // This should work! | |
| 1233 logln(UnicodeString("Attempt to set Calendar to Feb 29 2000: ") + | |
| 1234 disp.format(cal.getTime(status), ss.remove())); | |
| 1235 if (U_FAILURE(status)) { | |
| 1236 errln("FAIL: Unable to set Calendar to Feb 29 2000"); | |
| 1237 } | |
| 1238 } | |
| 1239 | |
| 1240 void DateFormatRegressionTest::Test714(void) | |
| 1241 { | |
| 1242 //try { | |
| 1243 UDate d(978103543000.); | |
| 1244 DateFormat *fmt = DateFormat::createDateTimeInstance(DateFormat::NONE, | |
| 1245 DateFormat::MEDIUM, | |
| 1246 Locale::getUS()); | |
| 1247 if (fmt == NULL) { | |
| 1248 dataerrln("Error calling DateFormat::createDateTimeInstance"); | |
| 1249 return; | |
| 1250 } | |
| 1251 | |
| 1252 UnicodeString s; | |
| 1253 UnicodeString tests = | |
| 1254 (UnicodeString) "7:25:43 AM" ; | |
| 1255 UErrorCode status = U_ZERO_ERROR; | |
| 1256 fmt->format (d,s); | |
| 1257 if(U_FAILURE(status)) | |
| 1258 { | |
| 1259 errln((UnicodeString) "Fail, errmsg " + u_errorName(status)); | |
| 1260 return; | |
| 1261 } | |
| 1262 | |
| 1263 if(s != tests) | |
| 1264 { | |
| 1265 errln((UnicodeString) "Fail: " + s + " != " + tests); | |
| 1266 } | |
| 1267 else | |
| 1268 { | |
| 1269 logln("OK: " + s + " == " + tests); | |
| 1270 } | |
| 1271 | |
| 1272 delete fmt; | |
| 1273 } | |
| 1274 | |
| 1275 class Test1684Data { | |
| 1276 public: | |
| 1277 int32_t year; | |
| 1278 int32_t month; | |
| 1279 int32_t date; | |
| 1280 int32_t womyear; | |
| 1281 int32_t wommon; | |
| 1282 int32_t wom; | |
| 1283 int32_t dow; | |
| 1284 UnicodeString data; | |
| 1285 UnicodeString normalized; | |
| 1286 | |
| 1287 Test1684Data(int32_t xyear, int32_t xmonth, int32_t xdate, | |
| 1288 int32_t xwomyear, int32_t xwommon, int32_t xwom, int32_t xdow, | |
| 1289 const char *xdata, const char *xnormalized) : | |
| 1290 year(xyear), | |
| 1291 month(xmonth-1), | |
| 1292 date(xdate), | |
| 1293 womyear(xwomyear), | |
| 1294 wommon(xwommon-1), | |
| 1295 wom(xwom), | |
| 1296 dow(xdow), | |
| 1297 data(xdata,""), | |
| 1298 normalized((xnormalized==NULL)?xdata:xnormalized,"") | |
| 1299 { } | |
| 1300 }; | |
| 1301 | |
| 1302 void DateFormatRegressionTest::Test1684(void) | |
| 1303 { | |
| 1304 // July 2001 August 2001 January 2002 | |
| 1305 // Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa | |
| 1306 // 1 2 3 4 5 6 7 1 2 3 4 1 2 3 4 5 | |
| 1307 // 8 9 10 11 12 13 14 5 6 7 8 9 10 11 6 7 8 9 10 11 12 | |
| 1308 // 15 16 17 18 19 20 21 12 13 14 15 16 17 18 13 14 15 16 17 18 19 | |
| 1309 // 22 23 24 25 26 27 28 19 20 21 22 23 24 25 20 21 22 23 24 25 26 | |
| 1310 // 29 30 31 26 27 28 29 30 31 27 28 29 30 31 | |
| 1311 Test1684Data *tests[] = { | |
| 1312 new Test1684Data(2001, 8, 6, 2001,8,2,UCAL_MONDAY, "2001 08 02 Mon", NU
LL), | |
| 1313 new Test1684Data(2001, 8, 7, 2001,8,2,UCAL_TUESDAY, "2001 08 02 Tue", NU
LL), | |
| 1314 new Test1684Data(2001, 8, 5,/*12,*/ 2001,8,2,UCAL_SUNDAY, "2001 08 02 Su
n", NULL), | |
| 1315 new Test1684Data(2001, 8,6, /*7, 30,*/ 2001,7,6,UCAL_MONDAY, "2001 07 06
Mon", "2001 08 02 Mon"), | |
| 1316 new Test1684Data(2001, 8,7, /*7, 31,*/ 2001,7,6,UCAL_TUESDAY, "2001 07 06
Tue", "2001 08 02 Tue"), | |
| 1317 new Test1684Data(2001, 8, 5, 2001,7,6,UCAL_SUNDAY, "2001 07 06 Sun", "2
001 08 02 Sun"), | |
| 1318 new Test1684Data(2001, 7, 30, 2001,8,1,UCAL_MONDAY, "2001 08 01 Mon", "2
001 07 05 Mon"), | |
| 1319 new Test1684Data(2001, 7, 31, 2001,8,1,UCAL_TUESDAY, "2001 08 01 Tue", "2
001 07 05 Tue"), | |
| 1320 new Test1684Data(2001, 7,29, /*8, 5,*/ 2001,8,1,UCAL_SUNDAY, "2001 08 0
1 Sun", "2001 07 05 Sun"), | |
| 1321 new Test1684Data(2001, 12, 31, 2001,12,6,UCAL_MONDAY, "2001 12 06 Mon", NU
LL), | |
| 1322 new Test1684Data(2002, 1, 1, 2002,1,1,UCAL_TUESDAY, "2002 01 01 Tue", NU
LL), | |
| 1323 new Test1684Data(2002, 1, 2, 2002,1,1,UCAL_WEDNESDAY, "2002 01 01 Wed", NU
LL), | |
| 1324 new Test1684Data(2002, 1, 3, 2002,1,1,UCAL_THURSDAY, "2002 01 01 Thu", NU
LL), | |
| 1325 new Test1684Data(2002, 1, 4, 2002,1,1,UCAL_FRIDAY, "2002 01 01 Fri", NU
LL), | |
| 1326 new Test1684Data(2002, 1, 5, 2002,1,1,UCAL_SATURDAY, "2002 01 01 Sat", NU
LL), | |
| 1327 new Test1684Data(2001,12,30, /*2002, 1, 6,*/ 2002,1,1,UCAL_SUNDAY, "200
2 01 01 Sun", "2001 12 06 Sun") | |
| 1328 }; | |
| 1329 | |
| 1330 #define kTest1684Count ((int32_t)(sizeof(tests)/sizeof(tests[0]))) | |
| 1331 | |
| 1332 int32_t pass = 0, error = 0, warning = 0; | |
| 1333 int32_t i; | |
| 1334 | |
| 1335 UErrorCode status = U_ZERO_ERROR; | |
| 1336 UnicodeString pattern("yyyy MM WW EEE",""); | |
| 1337 Calendar *cal = new GregorianCalendar(status); | |
| 1338 SimpleDateFormat *sdf = new SimpleDateFormat(pattern,status); | |
| 1339 if (U_FAILURE(status)) { | |
| 1340 dataerrln("Error constructing SimpleDateFormat"); | |
| 1341 for(i=0;i<kTest1684Count;i++) { | |
| 1342 delete tests[i]; | |
| 1343 } | |
| 1344 delete cal; | |
| 1345 delete sdf; | |
| 1346 return; | |
| 1347 } | |
| 1348 cal->setFirstDayOfWeek(UCAL_SUNDAY); | |
| 1349 cal->setMinimalDaysInFirstWeek(1); | |
| 1350 | |
| 1351 sdf->adoptCalendar(cal); | |
| 1352 | |
| 1353 cal = sdf->getCalendar()->clone(); // sdf may have deleted calendar | |
| 1354 | |
| 1355 if(!cal || !sdf || U_FAILURE(status)) { | |
| 1356 errln(UnicodeString("Error setting up test: ") + u_errorName(status)); | |
| 1357 } | |
| 1358 | |
| 1359 for (i = 0; i < kTest1684Count; ++i) { | |
| 1360 Test1684Data &test = *(tests[i]); | |
| 1361 logln(UnicodeString("#") + i + UnicodeString("\n-----\nTesting round trip of
") + test.year + | |
| 1362 " " + (test.month + 1) + | |
| 1363 " " + test.date + | |
| 1364 " (written as) " + test.data); | |
| 1365 | |
| 1366 cal->clear(); | |
| 1367 cal->set(test.year, test.month, test.date); | |
| 1368 UDate ms = cal->getTime(status); | |
| 1369 | |
| 1370 cal->clear(); | |
| 1371 cal->set(UCAL_YEAR, test.womyear); | |
| 1372 cal->set(UCAL_MONTH, test.wommon); | |
| 1373 cal->set(UCAL_WEEK_OF_MONTH, test.wom); | |
| 1374 cal->set(UCAL_DAY_OF_WEEK, test.dow); | |
| 1375 UDate ms2 = cal->getTime(status); | |
| 1376 | |
| 1377 if (ms2 != ms) { | |
| 1378 errln((UnicodeString)"\nError: GregorianUCAL_DOM gave " + ms + | |
| 1379 "\n GregorianUCAL_WOM gave " + ms2); | |
| 1380 error++; | |
| 1381 } else { | |
| 1382 pass++; | |
| 1383 } | |
| 1384 | |
| 1385 ms2 = sdf->parse(test.data, status); | |
| 1386 if(U_FAILURE(status)) { | |
| 1387 errln("parse exception: " + UnicodeString(u_errorName(status))); | |
| 1388 } | |
| 1389 | |
| 1390 if (ms2!=ms) { | |
| 1391 errln((UnicodeString)"\nError: GregorianCalendar gave " + ms + | |
| 1392 "\n SimpleDateFormat.parse gave " + ms2); | |
| 1393 error++; | |
| 1394 } else { | |
| 1395 pass++; | |
| 1396 } | |
| 1397 | |
| 1398 UnicodeString result; | |
| 1399 sdf->format(ms, result); | |
| 1400 if (result != test.normalized) { | |
| 1401 errln("\nWarning: format of '" + test.data + "' gave" + | |
| 1402 "\n '" + result + "'" + | |
| 1403 "\n expected '" + test.normalized + "'"); | |
| 1404 warning++; | |
| 1405 } else { | |
| 1406 pass++; | |
| 1407 } | |
| 1408 | |
| 1409 UDate ms3; | |
| 1410 ms3 = sdf->parse(result, status); | |
| 1411 if(U_FAILURE(status)) { | |
| 1412 errln("parse exception 2: " + (UnicodeString)u_errorName(status)); | |
| 1413 } | |
| 1414 | |
| 1415 if (ms3!=ms) { | |
| 1416 error++; | |
| 1417 errln((UnicodeString)"\nError: Re-parse of '" + result + "' gave time of "
+ | |
| 1418 "\n " + ms3 + | |
| 1419 "\n not " + ms); | |
| 1420 } else { | |
| 1421 pass++; | |
| 1422 } | |
| 1423 } | |
| 1424 | |
| 1425 UnicodeString info | |
| 1426 = UnicodeString("Passed: ") + pass + ", Warnings: " + warning + ", Errors: "
+ error; | |
| 1427 if (error > 0) { | |
| 1428 errln(info); | |
| 1429 } else { | |
| 1430 logln(info); | |
| 1431 } | |
| 1432 | |
| 1433 for(i=0;i<kTest1684Count;i++) { | |
| 1434 delete tests[i]; | |
| 1435 } | |
| 1436 delete cal; | |
| 1437 delete sdf; | |
| 1438 } | |
| 1439 | |
| 1440 void DateFormatRegressionTest::Test5554(void) | |
| 1441 { | |
| 1442 UErrorCode status = U_ZERO_ERROR; | |
| 1443 UnicodeString pattern("Z",""); | |
| 1444 UnicodeString newfoundland("Canada/Newfoundland", ""); | |
| 1445 TimeZone *zone = TimeZone::createTimeZone(newfoundland); | |
| 1446 Calendar *cal = new GregorianCalendar(zone, status); | |
| 1447 SimpleDateFormat *sdf = new SimpleDateFormat(pattern,status); | |
| 1448 if (U_FAILURE(status)) { | |
| 1449 dataerrln("Error constructing SimpleDateFormat"); | |
| 1450 delete cal; | |
| 1451 delete sdf; | |
| 1452 return; | |
| 1453 } | |
| 1454 cal->set(2007, 1, 14); | |
| 1455 UDate date = cal->getTime(status); | |
| 1456 if (U_FAILURE(status)) { | |
| 1457 errln("Error getting time to format"); | |
| 1458 return; | |
| 1459 }; | |
| 1460 sdf->adoptCalendar(cal); | |
| 1461 UnicodeString result; | |
| 1462 UnicodeString correct("-0330", ""); | |
| 1463 sdf->format(date, result); | |
| 1464 if (result != correct) { | |
| 1465 errln("\nError: Newfoundland Z of Jan 14, 2007 gave '" + result + "', expect
ed '" + correct + "'"); | |
| 1466 } | |
| 1467 delete sdf; | |
| 1468 } | |
| 1469 | |
| 1470 void DateFormatRegressionTest::Test9237(void) | |
| 1471 { | |
| 1472 UErrorCode status = U_ZERO_ERROR; | |
| 1473 UnicodeString pattern("VVVV"); | |
| 1474 | |
| 1475 SimpleDateFormat fmt(pattern, status); // default locale | |
| 1476 SimpleDateFormat fmtDE(pattern, Locale("de_DE"), status); | |
| 1477 if (U_FAILURE(status)) { | |
| 1478 dataerrln("Error constructing SimpleDateFormat"); | |
| 1479 return; | |
| 1480 } | |
| 1481 | |
| 1482 // copy constructor | |
| 1483 SimpleDateFormat fmtCopyDE(fmtDE); | |
| 1484 UnicodeString resDE, resCopyDE; | |
| 1485 | |
| 1486 fmtDE.format(0.0, resDE); | |
| 1487 fmtCopyDE.format(0.0, resCopyDE); | |
| 1488 | |
| 1489 if (resDE != resCopyDE) { | |
| 1490 errln(UnicodeString("Error: different result by the copied instance - or
g:") + resDE + " copy:" + resCopyDE); | |
| 1491 } | |
| 1492 | |
| 1493 // test for assignment operator | |
| 1494 fmt = fmtDE; | |
| 1495 | |
| 1496 UnicodeString resAssigned; | |
| 1497 fmt.format(0.0, resAssigned); | |
| 1498 | |
| 1499 if (resDE != resAssigned) { | |
| 1500 errln(UnicodeString("Error: different results by the assigned instance -
org:") + resDE + " assigned:" + resAssigned); | |
| 1501 } | |
| 1502 } | |
| 1503 | |
| 1504 void DateFormatRegressionTest::TestParsing(void) { | |
| 1505 UErrorCode status = U_ZERO_ERROR; | |
| 1506 UnicodeString pattern("EEE-WW-MMMM-yyyy"); | |
| 1507 UnicodeString text("mon-02-march-2011"); | |
| 1508 int32_t expectedDay = 7; | |
| 1509 | |
| 1510 SimpleDateFormat format(pattern, status); | |
| 1511 if (U_FAILURE(status)) { | |
| 1512 dataerrln("Unable to create SimpleDateFormat - %s", u_errorName(status))
; | |
| 1513 return; | |
| 1514 } | |
| 1515 | |
| 1516 Calendar *cal = new GregorianCalendar(status); | |
| 1517 if (cal == NULL || U_FAILURE(status)) { | |
| 1518 errln("Unable to create calendar - %s", u_errorName(status)); | |
| 1519 return; | |
| 1520 } | |
| 1521 | |
| 1522 ParsePosition pos(0); | |
| 1523 format.parse(text, *cal, pos); | |
| 1524 | |
| 1525 if (cal->get(UCAL_DAY_OF_MONTH, status) != expectedDay) { | |
| 1526 errln("Parsing failed: day of month should be '7' with pattern: \"" + pa
ttern + "\" for text: \"" + text + "\""); | |
| 1527 } | |
| 1528 | |
| 1529 delete cal; | |
| 1530 } | |
| 1531 | |
| 1532 void DateFormatRegressionTest::TestT10334(void) { | |
| 1533 UErrorCode status = U_ZERO_ERROR; | |
| 1534 UnicodeString pattern("'--: 'EEE-WW-MMMM-yyyy"); | |
| 1535 UnicodeString text("--mon-02-march-2011"); | |
| 1536 SimpleDateFormat format(pattern, status); | |
| 1537 | |
| 1538 logln("pattern["+pattern+"] text["+text+"]"); | |
| 1539 | |
| 1540 if (U_FAILURE(status)) { | |
| 1541 dataerrln("Fail creating SimpleDateFormat object - %s", u_errorName(stat
us)); | |
| 1542 return; | |
| 1543 } | |
| 1544 | |
| 1545 format.setBooleanAttribute(UDAT_PARSE_PARTIAL_LITERAL_MATCH, FALSE, status); | |
| 1546 format.parse(text, status); | |
| 1547 if (!U_FAILURE(status)) { | |
| 1548 errln("parse partial match did NOT fail in strict mode - %s", u_errorNam
e(status)); | |
| 1549 } | |
| 1550 | |
| 1551 status = U_ZERO_ERROR; | |
| 1552 format.setBooleanAttribute(UDAT_PARSE_PARTIAL_LITERAL_MATCH, TRUE, status); | |
| 1553 format.parse(text, status); | |
| 1554 if (U_FAILURE(status)) { | |
| 1555 errln("parse partial match failure in lenient mode - %s", u_errorName(st
atus)); | |
| 1556 } | |
| 1557 | |
| 1558 status = U_ZERO_ERROR; | |
| 1559 pattern = UnicodeString("YYYY MM dd"); | |
| 1560 text = UnicodeString("2013 12 10"); | |
| 1561 format.applyPattern(pattern); | |
| 1562 UDate referenceDate = format.parse(text, status); | |
| 1563 | |
| 1564 FieldPosition fp(0); | |
| 1565 UnicodeString formattedString(""); | |
| 1566 pattern = UnicodeString("YYYY LL dd ee cc qq QQ"); | |
| 1567 format.applyPattern(pattern); | |
| 1568 format.format(referenceDate, formattedString, fp, status); | |
| 1569 logln("ref date: " + formattedString); | |
| 1570 | |
| 1571 | |
| 1572 char patternArray[] = "YYYY LLL dd eee ccc qqq QQQ"; | |
| 1573 pattern = UnicodeString(patternArray); | |
| 1574 text = UnicodeString("2013 12 10 03 3 04 04"); | |
| 1575 status = U_ZERO_ERROR; | |
| 1576 format.setBooleanAttribute(UDAT_PARSE_ALLOW_NUMERIC, TRUE, status); | |
| 1577 format.applyPattern(pattern); | |
| 1578 ParsePosition pp(0); | |
| 1579 format.parse(text, pp); | |
| 1580 if (pp.getErrorIndex() != -1) { | |
| 1581 errln("numeric parse error"); | |
| 1582 } | |
| 1583 | |
| 1584 status = U_ZERO_ERROR; | |
| 1585 format.setBooleanAttribute(UDAT_PARSE_ALLOW_NUMERIC, FALSE, status); | |
| 1586 format.parse(text, status); | |
| 1587 if (!U_FAILURE(status)) { | |
| 1588 errln("numeric parse did NOT fail in strict mode", u_errorName(status)); | |
| 1589 } | |
| 1590 | |
| 1591 } | |
| 1592 | |
| 1593 | |
| 1594 typedef struct { | |
| 1595 const char * locale; | |
| 1596 UBool leniency; | |
| 1597 UnicodeString parseString; | |
| 1598 UnicodeString pattern; | |
| 1599 UnicodeString expectedResult; // null indicates expected error | |
| 1600 } TestDateFormatLeniencyItem; | |
| 1601 | |
| 1602 | |
| 1603 void DateFormatRegressionTest::TestT10619(void) { | |
| 1604 const UDate july022008 = 1215000001979.0; | |
| 1605 const TestDateFormatLeniencyItem items[] = { | |
| 1606 //locale leniency parse String pattern
expected result | |
| 1607 { "en", true, UnicodeString("2008-07 02"), UnicodeString("y
yyy-LLLL dd"), UnicodeString("2008-July 02") }, | |
| 1608 { "en", false, UnicodeString("2008-07 03"), UnicodeString("y
yyy-LLLL dd"), UnicodeString("") }, | |
| 1609 { "en", true, UnicodeString("2008-Jan. 04"), UnicodeString("y
yyy-LLL dd"), UnicodeString("2008-Jan 04") }, | |
| 1610 { "en", false, UnicodeString("2008-Jan. 05"), UnicodeString("y
yyy-LLL dd"), UnicodeString("") }, | |
| 1611 { "en", true, UnicodeString("2008-Jan--06"), UnicodeString("y
yyy-MMM -- dd"), UnicodeString("2008-Jan 06") }, | |
| 1612 { "en", false, UnicodeString("2008-Jan--07"), UnicodeString("y
yyy-MMM -- dd"), UnicodeString("") }, | |
| 1613 { "en", true, UnicodeString("6 Jan 08 2008"), UnicodeString("e
ee MMM dd yyyy"), UnicodeString("Sat Jan 08 2008") }, | |
| 1614 { "en", false, UnicodeString("6 Jan 09 2008"), UnicodeString("e
ee MMM dd yyyy"), UnicodeString("") }, | |
| 1615 // terminator | |
| 1616 { NULL, true, UnicodeString(""), UnicodeString(""
), UnicodeString("") } | |
| 1617 }; | |
| 1618 UErrorCode status = U_ZERO_ERROR; | |
| 1619 Calendar* cal = Calendar::createInstance(status); | |
| 1620 if (U_FAILURE(status)) { | |
| 1621 dataerrln(UnicodeString("FAIL: Unable to create Calendar for default tim
ezone and locale.")); | |
| 1622 } else { | |
| 1623 cal->setTime(july022008, status); | |
| 1624 const TestDateFormatLeniencyItem * itemPtr; | |
| 1625 for (itemPtr = items; itemPtr->locale != NULL; itemPtr++ ) { | |
| 1626 | |
| 1627 Locale locale = Locale::createFromName(itemPtr->locale); | |
| 1628 status = U_ZERO_ERROR; | |
| 1629 ParsePosition pos(0); | |
| 1630 SimpleDateFormat * sdmft = new SimpleDateFormat(itemPtr->pattern, lo
cale, status); | |
| 1631 if (U_FAILURE(status)) { | |
| 1632 dataerrln("Unable to create SimpleDateFormat - %s", u_errorName(
status)); | |
| 1633 continue; | |
| 1634 } | |
| 1635 logln("parsing " + itemPtr->parseString); | |
| 1636 sdmft->setLenient(itemPtr->leniency); | |
| 1637 sdmft->setBooleanAttribute(UDAT_PARSE_ALLOW_WHITESPACE, itemPtr->len
iency, status); | |
| 1638 sdmft->setBooleanAttribute(UDAT_PARSE_ALLOW_NUMERIC, itemPtr->lenien
cy, status); | |
| 1639 sdmft->setBooleanAttribute(UDAT_PARSE_PARTIAL_LITERAL_MATCH, itemPtr
->leniency, status); | |
| 1640 sdmft->parse(itemPtr->parseString, pos); | |
| 1641 | |
| 1642 delete sdmft; | |
| 1643 if(pos.getErrorIndex() > -1) { | |
| 1644 if(itemPtr->expectedResult.length() != 0) { | |
| 1645 errln("error: unexpected error - " + itemPtr->parseString + "
- error index " + pos.getErrorIndex() + | |
| 1646 " - leniency " + itemPtr->leniency); | |
| 1647 continue; | |
| 1648 } else { | |
| 1649 continue; | |
| 1650 } | |
| 1651 } | |
| 1652 } | |
| 1653 } | |
| 1654 delete cal; | |
| 1655 | |
| 1656 } | |
| 1657 | |
| 1658 | |
| 1659 typedef struct { | |
| 1660 UnicodeString text; | |
| 1661 UnicodeString pattern; | |
| 1662 int initialParsePos; | |
| 1663 } T10855Data; | |
| 1664 | |
| 1665 void DateFormatRegressionTest::TestT10855(void) { | |
| 1666 // NOTE: these should NOT parse | |
| 1667 const T10855Data items[] = { | |
| 1668 //parse String pattern
initial parse pos | |
| 1669 { UnicodeString("September 30, 1998"), UnicodeString("MM-dd-yyyy"),
0}, | |
| 1670 { UnicodeString("123-73-1950"), UnicodeString("MM-dd-yyyy"),
-1}, | |
| 1671 { UnicodeString("12-23-1950"), UnicodeString("MM-dd-yyyy"),
-1}, | |
| 1672 // terminator | |
| 1673 { UnicodeString(""), UnicodeString(""),
0} | |
| 1674 }; | |
| 1675 UErrorCode status = U_ZERO_ERROR; | |
| 1676 | |
| 1677 int x = 0; | |
| 1678 while(items[x].pattern.length() > 0) | |
| 1679 { | |
| 1680 status = U_ZERO_ERROR; | |
| 1681 logln("Date to parse: \""+items[x].text+"\""); | |
| 1682 logln("Starting Index: %d", items[x].initialParsePos); | |
| 1683 | |
| 1684 SimpleDateFormat dateFmt(items[x].pattern, status); | |
| 1685 if(U_FAILURE(status)) { | |
| 1686 errcheckln(status, "Failed dateFmt: %s", u_errorName(status)); | |
| 1687 ++x; | |
| 1688 continue; | |
| 1689 } | |
| 1690 status = U_ZERO_ERROR; | |
| 1691 | |
| 1692 dateFmt.setLenient(false); | |
| 1693 dateFmt.setTimeZone(*TimeZone::getGMT()); | |
| 1694 | |
| 1695 ParsePosition position(items[x].initialParsePos); | |
| 1696 logln("set position is now: %d", position.getIndex()); | |
| 1697 UDate d = dateFmt.parse(items[x].text, position); | |
| 1698 if (position.getErrorIndex() != -1 || position.getIndex() == items[x].in
itialParsePos) { | |
| 1699 logln("Parse Failed. ErrorIndex is %d - Index is %d", position.getEr
rorIndex(), position.getIndex()); | |
| 1700 } else { | |
| 1701 errln("Parse Succeeded...should have failed. Index is %d - ErrorInde
x is %d", position.getIndex(), position.getErrorIndex()); | |
| 1702 } | |
| 1703 logln("Parsed date returns %d\n", d); | |
| 1704 | |
| 1705 ++x; | |
| 1706 } | |
| 1707 } | |
| 1708 | |
| 1709 void DateFormatRegressionTest::TestT10906(void) { | |
| 1710 | |
| 1711 UErrorCode status = U_ZERO_ERROR; | |
| 1712 UnicodeString pattern = "MM-dd-yyyy"; | |
| 1713 UnicodeString text = "06-10-2014"; | |
| 1714 SimpleDateFormat format(pattern, status); | |
| 1715 int32_t errorIdx = 0; | |
| 1716 ParsePosition pp(-1); | |
| 1717 format.parse(text, pp); | |
| 1718 errorIdx = pp.getErrorIndex(); | |
| 1719 if (errorIdx == -1) { | |
| 1720 errln("failed to report invalid (negative) starting parse position"); | |
| 1721 } | |
| 1722 } | |
| 1723 | |
| 1724 #endif /* #if !UCONFIG_NO_FORMATTING */ | |
| 1725 | |
| 1726 //eof | |
| OLD | NEW |