| OLD | NEW |
| (Empty) |
| 1 /*********************************************************************** | |
| 2 * COPYRIGHT: | |
| 3 * Copyright (c) 1997-2014, International Business Machines Corporation | |
| 4 * and others. All Rights Reserved. | |
| 5 ***********************************************************************/ | |
| 6 | |
| 7 /* Test Internationalized Calendars for C++ */ | |
| 8 | |
| 9 #include "unicode/utypes.h" | |
| 10 #include "string.h" | |
| 11 #include "unicode/locid.h" | |
| 12 #include "japancal.h" | |
| 13 | |
| 14 #if !UCONFIG_NO_FORMATTING | |
| 15 | |
| 16 #include <stdio.h> | |
| 17 #include "caltest.h" | |
| 18 | |
| 19 #define CHECK(status, msg) \ | |
| 20 if (U_FAILURE(status)) { \ | |
| 21 dataerrln((UnicodeString(u_errorName(status)) + UnicodeString(" : " ) )+ m
sg); \ | |
| 22 return; \ | |
| 23 } | |
| 24 | |
| 25 | |
| 26 static UnicodeString escape( const UnicodeString&src) | |
| 27 { | |
| 28 UnicodeString dst; | |
| 29 dst.remove(); | |
| 30 for (int32_t i = 0; i < src.length(); ++i) { | |
| 31 UChar c = src[i]; | |
| 32 if(c < 0x0080) | |
| 33 dst += c; | |
| 34 else { | |
| 35 dst += UnicodeString("["); | |
| 36 char buf [8]; | |
| 37 sprintf(buf, "%#x", c); | |
| 38 dst += UnicodeString(buf); | |
| 39 dst += UnicodeString("]"); | |
| 40 } | |
| 41 } | |
| 42 | |
| 43 return dst; | |
| 44 } | |
| 45 | |
| 46 | |
| 47 #include "incaltst.h" | |
| 48 #include "unicode/gregocal.h" | |
| 49 #include "unicode/smpdtfmt.h" | |
| 50 #include "unicode/simpletz.h" | |
| 51 | |
| 52 // ***************************************************************************** | |
| 53 // class IntlCalendarTest | |
| 54 // ***************************************************************************** | |
| 55 //--- move to CalendarTest? | |
| 56 | |
| 57 // Turn this on to dump the calendar fields | |
| 58 #define U_DEBUG_DUMPCALS | |
| 59 | |
| 60 | |
| 61 #define CASE(id,test) case id: name = #test; if (exec) { logln(#test "---"); log
ln((UnicodeString)""); test(); } break | |
| 62 | |
| 63 | |
| 64 void IntlCalendarTest::runIndexedTest( int32_t index, UBool exec, const char* &n
ame, char* /*par*/ ) | |
| 65 { | |
| 66 if (exec) logln("TestSuite IntlCalendarTest"); | |
| 67 switch (index) { | |
| 68 CASE(0,TestTypes); | |
| 69 CASE(1,TestGregorian); | |
| 70 CASE(2,TestBuddhist); | |
| 71 CASE(3,TestJapanese); | |
| 72 CASE(4,TestBuddhistFormat); | |
| 73 CASE(5,TestJapaneseFormat); | |
| 74 CASE(6,TestJapanese3860); | |
| 75 CASE(7,TestPersian); | |
| 76 CASE(8,TestPersianFormat); | |
| 77 CASE(9,TestTaiwan); | |
| 78 default: name = ""; break; | |
| 79 } | |
| 80 } | |
| 81 | |
| 82 #undef CASE | |
| 83 | |
| 84 // -----------------------------------------------------------------------------
---- | |
| 85 | |
| 86 | |
| 87 /** | |
| 88 * Test various API methods for API completeness. | |
| 89 */ | |
| 90 void | |
| 91 IntlCalendarTest::TestTypes() | |
| 92 { | |
| 93 Calendar *c = NULL; | |
| 94 UErrorCode status = U_ZERO_ERROR; | |
| 95 int j; | |
| 96 const char *locs [40] = { "en_US_VALLEYGIRL", | |
| 97 "en_US_VALLEYGIRL@collation=phonebook;calendar=japan
ese", | |
| 98 "en_US_VALLEYGIRL@collation=phonebook;calendar=grego
rian", | |
| 99 "ja_JP@calendar=japanese", | |
| 100 "th_TH@calendar=buddhist", | |
| 101 "ja_JP_TRADITIONAL", | |
| 102 "th_TH_TRADITIONAL", | |
| 103 "th_TH_TRADITIONAL@calendar=gregorian", | |
| 104 "en_US", | |
| 105 "th_TH", // Default calendar for th_TH is buddhis
t | |
| 106 "th", // th's default region is TH and buddhis
t is used as default for TH | |
| 107 "en_TH", // Default calendar for any locales with
region TH is buddhist | |
| 108 "en-TH-u-ca-gregory", | |
| 109 NULL }; | |
| 110 const char *types[40] = { "gregorian", | |
| 111 "japanese", | |
| 112 "gregorian", | |
| 113 "japanese", | |
| 114 "buddhist", | |
| 115 "japanese", | |
| 116 "buddhist", | |
| 117 "gregorian", | |
| 118 "gregorian", | |
| 119 "buddhist", | |
| 120 "buddhist", | |
| 121 "buddhist", | |
| 122 "gregorian", | |
| 123 NULL }; | |
| 124 | |
| 125 for(j=0;locs[j];j++) { | |
| 126 logln(UnicodeString("Creating calendar of locale ") + locs[j]); | |
| 127 status = U_ZERO_ERROR; | |
| 128 c = Calendar::createInstance(locs[j], status); | |
| 129 CHECK(status, "creating '" + UnicodeString(locs[j]) + "' calendar"); | |
| 130 if(U_SUCCESS(status)) { | |
| 131 logln(UnicodeString(" type is ") + c->getType()); | |
| 132 if(strcmp(c->getType(), types[j])) { | |
| 133 dataerrln(UnicodeString(locs[j]) + UnicodeString("Calendar type ") + c->
getType() + " instead of " + types[j]); | |
| 134 } | |
| 135 } | |
| 136 delete c; | |
| 137 } | |
| 138 } | |
| 139 | |
| 140 | |
| 141 | |
| 142 /** | |
| 143 * Run a test of a quasi-Gregorian calendar. This is a calendar | |
| 144 * that behaves like a Gregorian but has different year/era mappings. | |
| 145 * The int[] data array should have the format: | |
| 146 * | |
| 147 * { era, year, gregorianYear, month, dayOfMonth, ... ... , -1 } | |
| 148 */ | |
| 149 void IntlCalendarTest::quasiGregorianTest(Calendar& cal, const Locale& gcl, cons
t int32_t *data) { | |
| 150 UErrorCode status = U_ZERO_ERROR; | |
| 151 // As of JDK 1.4.1_01, using the Sun JDK GregorianCalendar as | |
| 152 // a reference throws us off by one hour. This is most likely | |
| 153 // due to the JDK 1.4 incorporation of historical time zones. | |
| 154 //java.util.Calendar grego = java.util.Calendar.getInstance(); | |
| 155 Calendar *grego = Calendar::createInstance(gcl, status); | |
| 156 if (U_FAILURE(status)) { | |
| 157 dataerrln("Error calling Calendar::createInstance"); | |
| 158 return; | |
| 159 } | |
| 160 | |
| 161 int32_t tz1 = cal.get(UCAL_ZONE_OFFSET,status); | |
| 162 int32_t tz2 = grego -> get (UCAL_ZONE_OFFSET, status); | |
| 163 if(tz1 != tz2) { | |
| 164 errln((UnicodeString)"cal's tz " + tz1 + " != grego's tz " + tz2); | |
| 165 } | |
| 166 | |
| 167 for (int32_t i=0; data[i]!=-1; ) { | |
| 168 int32_t era = data[i++]; | |
| 169 int32_t year = data[i++]; | |
| 170 int32_t gregorianYear = data[i++]; | |
| 171 int32_t month = data[i++]; | |
| 172 int32_t dayOfMonth = data[i++]; | |
| 173 | |
| 174 grego->clear(); | |
| 175 grego->set(gregorianYear, month, dayOfMonth); | |
| 176 UDate D = grego->getTime(status); | |
| 177 | |
| 178 cal.clear(); | |
| 179 cal.set(UCAL_ERA, era); | |
| 180 cal.set(year, month, dayOfMonth); | |
| 181 UDate d = cal.getTime(status); | |
| 182 #ifdef U_DEBUG_DUMPCALS | |
| 183 logln((UnicodeString)"cal : " + CalendarTest::calToStr(cal)); | |
| 184 logln((UnicodeString)"grego: " + CalendarTest::calToStr(*grego)); | |
| 185 #endif | |
| 186 if (d == D) { | |
| 187 logln(UnicodeString("OK: ") + era + ":" + year + "/" + (month+1) + "/" + d
ayOfMonth + | |
| 188 " => " + d + " (" + UnicodeString(cal.getType()) + ")"); | |
| 189 } else { | |
| 190 errln(UnicodeString("Fail: (fields to millis)") + era + ":" + year + "/" +
(month+1) + "/" + dayOfMonth + | |
| 191 " => " + d + ", expected " + D + " (" + UnicodeString(cal.getType())
+ "Off by: " + (d-D)); | |
| 192 } | |
| 193 | |
| 194 // Now, set the gregorian millis on the other calendar | |
| 195 cal.clear(); | |
| 196 cal.setTime(D, status); | |
| 197 int e = cal.get(UCAL_ERA, status); | |
| 198 int y = cal.get(UCAL_YEAR, status); | |
| 199 #ifdef U_DEBUG_DUMPCALS | |
| 200 logln((UnicodeString)"cal : " + CalendarTest::calToStr(cal)); | |
| 201 logln((UnicodeString)"grego: " + CalendarTest::calToStr(*grego)); | |
| 202 #endif | |
| 203 if (y == year && e == era) { | |
| 204 logln((UnicodeString)"OK: " + D + " => " + cal.get(UCAL_ERA, status) + ":"
+ | |
| 205 cal.get(UCAL_YEAR, status) + "/" + | |
| 206 (cal.get(UCAL_MONTH, status)+1) + "/" + cal.get(UCAL_DATE, status) +
" (" + UnicodeString(cal.getType()) + ")"); | |
| 207 } else { | |
| 208 errln((UnicodeString)"Fail: (millis to fields)" + D + " => " + cal.get(UCA
L_ERA, status) + ":" + | |
| 209 cal.get(UCAL_YEAR, status) + "/" + | |
| 210 (cal.get(UCAL_MONTH, status)+1) + "/" + cal.get(UCAL_DATE, status) + | |
| 211 ", expected " + era + ":" + year + "/" + (month+1) + "/" + | |
| 212 dayOfMonth + " (" + UnicodeString(cal.getType())); | |
| 213 } | |
| 214 } | |
| 215 delete grego; | |
| 216 CHECK(status, "err during quasiGregorianTest()"); | |
| 217 } | |
| 218 | |
| 219 // Verify that Gregorian works like Gregorian | |
| 220 void IntlCalendarTest::TestGregorian() { | |
| 221 UDate timeA = Calendar::getNow(); | |
| 222 int32_t data[] = { | |
| 223 GregorianCalendar::AD, 1868, 1868, UCAL_SEPTEMBER, 8, | |
| 224 GregorianCalendar::AD, 1868, 1868, UCAL_SEPTEMBER, 9, | |
| 225 GregorianCalendar::AD, 1869, 1869, UCAL_JUNE, 4, | |
| 226 GregorianCalendar::AD, 1912, 1912, UCAL_JULY, 29, | |
| 227 GregorianCalendar::AD, 1912, 1912, UCAL_JULY, 30, | |
| 228 GregorianCalendar::AD, 1912, 1912, UCAL_AUGUST, 1, | |
| 229 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 | |
| 230 }; | |
| 231 | |
| 232 Calendar *cal; | |
| 233 UErrorCode status = U_ZERO_ERROR; | |
| 234 cal = Calendar::createInstance(/*"de_DE", */ status); | |
| 235 CHECK(status, UnicodeString("Creating de_CH calendar")); | |
| 236 // Sanity check the calendar | |
| 237 UDate timeB = Calendar::getNow(); | |
| 238 UDate timeCal = cal->getTime(status); | |
| 239 | |
| 240 if(!(timeA <= timeCal) || !(timeCal <= timeB)) { | |
| 241 errln((UnicodeString)"Error: Calendar time " + timeCal + | |
| 242 " is not within sampled times [" + timeA + " to " + timeB + "]!"); | |
| 243 } | |
| 244 // end sanity check | |
| 245 | |
| 246 // Note, the following is a good way to test the sanity of the constructed c
alendars, | |
| 247 // using Collation as a delay-loop: | |
| 248 // | |
| 249 // $ intltest format/IntlCalendarTest collate/G7CollationTest format/IntlC
alendarTest | |
| 250 | |
| 251 quasiGregorianTest(*cal,Locale("fr_FR"),data); | |
| 252 delete cal; | |
| 253 } | |
| 254 | |
| 255 /** | |
| 256 * Verify that BuddhistCalendar shifts years to Buddhist Era but otherwise | |
| 257 * behaves like GregorianCalendar. | |
| 258 */ | |
| 259 void IntlCalendarTest::TestBuddhist() { | |
| 260 // BE 2542 == 1999 CE | |
| 261 UDate timeA = Calendar::getNow(); | |
| 262 | |
| 263 int32_t data[] = { | |
| 264 0, // B. era [928479600000] | |
| 265 2542, // B. year | |
| 266 1999, // G. year | |
| 267 UCAL_JUNE, // month | |
| 268 4, // day | |
| 269 | |
| 270 0, // B. era [-79204842000000] | |
| 271 3, // B. year | |
| 272 -540, // G. year | |
| 273 UCAL_FEBRUARY, // month | |
| 274 12, // day | |
| 275 | |
| 276 0, // test month calculation: 4795 BE = 4252 AD is a leap yea
r, but 4795 AD is not. | |
| 277 4795, // BE [72018057600000] | |
| 278 4252, // AD | |
| 279 UCAL_FEBRUARY, | |
| 280 29, | |
| 281 | |
| 282 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1 | |
| 283 }; | |
| 284 Calendar *cal; | |
| 285 UErrorCode status = U_ZERO_ERROR; | |
| 286 cal = Calendar::createInstance("th_TH@calendar=buddhist", status); | |
| 287 CHECK(status, UnicodeString("Creating th_TH@calendar=buddhist calendar")); | |
| 288 | |
| 289 // Sanity check the calendar | |
| 290 UDate timeB = Calendar::getNow(); | |
| 291 UDate timeCal = cal->getTime(status); | |
| 292 | |
| 293 if(!(timeA <= timeCal) || !(timeCal <= timeB)) { | |
| 294 errln((UnicodeString)"Error: Calendar time " + timeCal + | |
| 295 " is not within sampled times [" + timeA + " to " + timeB + "]!"); | |
| 296 } | |
| 297 // end sanity check | |
| 298 | |
| 299 | |
| 300 quasiGregorianTest(*cal,Locale("th_TH@calendar=gregorian"),data); | |
| 301 delete cal; | |
| 302 } | |
| 303 | |
| 304 | |
| 305 /** | |
| 306 * Verify that TaiWanCalendar shifts years to Minguo Era but otherwise | |
| 307 * behaves like GregorianCalendar. | |
| 308 */ | |
| 309 void IntlCalendarTest::TestTaiwan() { | |
| 310 // MG 1 == 1912 AD | |
| 311 UDate timeA = Calendar::getNow(); | |
| 312 | |
| 313 // TODO port these to the data items | |
| 314 int32_t data[] = { | |
| 315 1, // B. era [928479600000] | |
| 316 1, // B. year | |
| 317 1912, // G. year | |
| 318 UCAL_JUNE, // month | |
| 319 4, // day | |
| 320 | |
| 321 1, // B. era [-79204842000000] | |
| 322 3, // B. year | |
| 323 1914, // G. year | |
| 324 UCAL_FEBRUARY, // month | |
| 325 12, // day | |
| 326 | |
| 327 1, // B. era [-79204842000000] | |
| 328 96, // B. year | |
| 329 2007, // G. year | |
| 330 UCAL_FEBRUARY, // month | |
| 331 12, // day | |
| 332 | |
| 333 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1 | |
| 334 }; | |
| 335 Calendar *cal; | |
| 336 UErrorCode status = U_ZERO_ERROR; | |
| 337 cal = Calendar::createInstance("en_US@calendar=roc", status); | |
| 338 CHECK(status, UnicodeString("Creating en_US@calendar=roc calendar")); | |
| 339 | |
| 340 // Sanity check the calendar | |
| 341 UDate timeB = Calendar::getNow(); | |
| 342 UDate timeCal = cal->getTime(status); | |
| 343 | |
| 344 if(!(timeA <= timeCal) || !(timeCal <= timeB)) { | |
| 345 errln((UnicodeString)"Error: Calendar time " + timeCal + | |
| 346 " is not within sampled times [" + timeA + " to " + timeB + "]!"); | |
| 347 } | |
| 348 // end sanity check | |
| 349 | |
| 350 | |
| 351 quasiGregorianTest(*cal,Locale("en_US"),data); | |
| 352 delete cal; | |
| 353 } | |
| 354 | |
| 355 | |
| 356 | |
| 357 /** | |
| 358 * Verify that JapaneseCalendar shifts years to Japanese Eras but otherwise | |
| 359 * behaves like GregorianCalendar. | |
| 360 */ | |
| 361 void IntlCalendarTest::TestJapanese() { | |
| 362 UDate timeA = Calendar::getNow(); | |
| 363 | |
| 364 /* Sorry.. japancal.h is private! */ | |
| 365 #define JapaneseCalendar_MEIJI 232 | |
| 366 #define JapaneseCalendar_TAISHO 233 | |
| 367 #define JapaneseCalendar_SHOWA 234 | |
| 368 #define JapaneseCalendar_HEISEI 235 | |
| 369 | |
| 370 // BE 2542 == 1999 CE | |
| 371 int32_t data[] = { | |
| 372 // Jera Jyr Gyear m d | |
| 373 JapaneseCalendar_MEIJI, 1, 1868, UCAL_SEPTEMBER, 8, | |
| 374 JapaneseCalendar_MEIJI, 1, 1868, UCAL_SEPTEMBER, 9, | |
| 375 JapaneseCalendar_MEIJI, 2, 1869, UCAL_JUNE, 4, | |
| 376 JapaneseCalendar_MEIJI, 45, 1912, UCAL_JULY, 29, | |
| 377 JapaneseCalendar_TAISHO, 1, 1912, UCAL_JULY, 30, | |
| 378 JapaneseCalendar_TAISHO, 1, 1912, UCAL_AUGUST, 1, | |
| 379 | |
| 380 // new tests (not in java) | |
| 381 JapaneseCalendar_SHOWA, 64, 1989, UCAL_JANUARY, 7, // Test curre
nt era transition (different code path than others) | |
| 382 JapaneseCalendar_HEISEI, 1, 1989, UCAL_JANUARY, 8, | |
| 383 JapaneseCalendar_HEISEI, 1, 1989, UCAL_JANUARY, 9, | |
| 384 JapaneseCalendar_HEISEI, 1, 1989, UCAL_DECEMBER, 20, | |
| 385 JapaneseCalendar_HEISEI, 15, 2003, UCAL_MAY, 22, | |
| 386 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1 | |
| 387 }; | |
| 388 | |
| 389 Calendar *cal; | |
| 390 UErrorCode status = U_ZERO_ERROR; | |
| 391 cal = Calendar::createInstance("ja_JP@calendar=japanese", status); | |
| 392 CHECK(status, UnicodeString("Creating ja_JP@calendar=japanese calendar")); | |
| 393 // Sanity check the calendar | |
| 394 UDate timeB = Calendar::getNow(); | |
| 395 UDate timeCal = cal->getTime(status); | |
| 396 | |
| 397 if(!(timeA <= timeCal) || !(timeCal <= timeB)) { | |
| 398 errln((UnicodeString)"Error: Calendar time " + timeCal + | |
| 399 " is not within sampled times [" + timeA + " to " + timeB + "]!"); | |
| 400 } | |
| 401 // end sanity check | |
| 402 quasiGregorianTest(*cal,Locale("ja_JP"),data); | |
| 403 delete cal; | |
| 404 } | |
| 405 | |
| 406 | |
| 407 | |
| 408 void IntlCalendarTest::TestBuddhistFormat() { | |
| 409 UErrorCode status = U_ZERO_ERROR; | |
| 410 | |
| 411 // Test simple parse/format with adopt | |
| 412 | |
| 413 // First, a contrived english test.. | |
| 414 UDate aDate = 999932400000.0; | |
| 415 SimpleDateFormat *fmt = new SimpleDateFormat(UnicodeString("MMMM d, yyyy G")
, Locale("en_US@calendar=buddhist"), status); | |
| 416 CHECK(status, "creating date format instance"); | |
| 417 SimpleDateFormat *fmt2 = new SimpleDateFormat(UnicodeString("MMMM d, yyyy G"
), Locale("en_US@calendar=gregorian"), status); | |
| 418 CHECK(status, "creating gregorian date format instance"); | |
| 419 if(!fmt) { | |
| 420 errln("Coudln't create en_US instance"); | |
| 421 } else { | |
| 422 UnicodeString str; | |
| 423 fmt2->format(aDate, str); | |
| 424 logln(UnicodeString() + "Test Date: " + str); | |
| 425 str.remove(); | |
| 426 fmt->format(aDate, str); | |
| 427 logln(UnicodeString() + "as Buddhist Calendar: " + escape(str)); | |
| 428 UnicodeString expected("September 8, 2544 BE"); | |
| 429 if(str != expected) { | |
| 430 errln("Expected " + escape(expected) + " but got " + escape(str)); | |
| 431 } | |
| 432 UDate otherDate = fmt->parse(expected, status); | |
| 433 if(otherDate != aDate) { | |
| 434 UnicodeString str3; | |
| 435 fmt->format(otherDate, str3); | |
| 436 errln("Parse incorrect of " + escape(expected) + " - wanted " + aDat
e + " but got " + otherDate + ", " + escape(str3)); | |
| 437 } else { | |
| 438 logln("Parsed OK: " + expected); | |
| 439 } | |
| 440 delete fmt; | |
| 441 } | |
| 442 delete fmt2; | |
| 443 | |
| 444 CHECK(status, "Error occured testing Buddhist Calendar in English "); | |
| 445 | |
| 446 status = U_ZERO_ERROR; | |
| 447 // Now, try in Thai | |
| 448 { | |
| 449 UnicodeString expect = CharsToUnicodeString("\\u0E27\\u0E31\\u0E19\\u0E4
0\\u0E2A\\u0E32\\u0E23\\u0E4C\\u0E17\\u0E35\\u0E48" | |
| 450 " 8 \\u0E01\\u0E31\\u0e19\\u0e22\\u0e32\\u0e22\\u0e19 \\u0e1e.\\u0e2
8. 2544"); | |
| 451 UDate expectDate = 999932400000.0; | |
| 452 Locale loc("th_TH_TRADITIONAL"); // legacy | |
| 453 | |
| 454 simpleTest(loc, expect, expectDate, status); | |
| 455 } | |
| 456 status = U_ZERO_ERROR; | |
| 457 { | |
| 458 UnicodeString expect = CharsToUnicodeString("\\u0E27\\u0E31\\u0E19\\u0E4
0\\u0E2A\\u0E32\\u0E23\\u0E4C\\u0E17\\u0E35\\u0E48" | |
| 459 " 8 \\u0E01\\u0E31\\u0e19\\u0e22\\u0e32\\u0e22\\u0e19 \\u0e1e.\\u0e2
8. 2544"); | |
| 460 UDate expectDate = 999932400000.0; | |
| 461 Locale loc("th_TH@calendar=buddhist"); | |
| 462 | |
| 463 simpleTest(loc, expect, expectDate, status); | |
| 464 } | |
| 465 status = U_ZERO_ERROR; | |
| 466 { | |
| 467 UnicodeString expect = CharsToUnicodeString("\\u0E27\\u0E31\\u0E19\\u0E4
0\\u0E2A\\u0E32\\u0E23\\u0E4C\\u0E17\\u0E35\\u0E48" | |
| 468 " 8 \\u0E01\\u0E31\\u0e19\\u0e22\\u0e32\\u0e22\\u0e19 \\u0e04.\\u0e2
8. 2001"); | |
| 469 UDate expectDate = 999932400000.0; | |
| 470 Locale loc("th_TH@calendar=gregorian"); | |
| 471 | |
| 472 simpleTest(loc, expect, expectDate, status); | |
| 473 } | |
| 474 status = U_ZERO_ERROR; | |
| 475 { | |
| 476 UnicodeString expect = CharsToUnicodeString("\\u0E27\\u0E31\\u0E19\\u0E4
0\\u0E2A\\u0E32\\u0E23\\u0E4C\\u0E17\\u0E35\\u0E48" | |
| 477 " 8 \\u0E01\\u0E31\\u0e19\\u0e22\\u0e32\\u0e22\\u0e19 \\u0e04.\\u0e2
8. 2001"); | |
| 478 UDate expectDate = 999932400000.0; | |
| 479 Locale loc("th_TH_TRADITIONAL@calendar=gregorian"); | |
| 480 | |
| 481 simpleTest(loc, expect, expectDate, status); | |
| 482 } | |
| 483 } | |
| 484 | |
| 485 // TaiwanFormat has been moved to testdata/format.txt | |
| 486 | |
| 487 | |
| 488 void IntlCalendarTest::TestJapaneseFormat() { | |
| 489 Calendar *cal; | |
| 490 UErrorCode status = U_ZERO_ERROR; | |
| 491 cal = Calendar::createInstance("ja_JP_TRADITIONAL", status); | |
| 492 CHECK(status, UnicodeString("Creating ja_JP_TRADITIONAL calendar")); | |
| 493 | |
| 494 Calendar *cal2 = cal->clone(); | |
| 495 delete cal; | |
| 496 cal = NULL; | |
| 497 | |
| 498 // Test simple parse/format with adopt | |
| 499 | |
| 500 UDate aDate = 999932400000.0; | |
| 501 SimpleDateFormat *fmt = new SimpleDateFormat(UnicodeString("MMMM d, yy G"),
Locale("en_US@calendar=japanese"), status); | |
| 502 SimpleDateFormat *fmt2 = new SimpleDateFormat(UnicodeString("MMMM d, yyyy G"
), Locale("en_US@calendar=gregorian"), status); | |
| 503 CHECK(status, "creating date format instance"); | |
| 504 if(!fmt) { | |
| 505 errln("Coudln't create en_US instance"); | |
| 506 } else { | |
| 507 UnicodeString str; | |
| 508 fmt2->format(aDate, str); | |
| 509 logln(UnicodeString() + "Test Date: " + str); | |
| 510 str.remove(); | |
| 511 fmt->format(aDate, str); | |
| 512 logln(UnicodeString() + "as Japanese Calendar: " + str); | |
| 513 UnicodeString expected("September 8, 13 Heisei"); | |
| 514 if(str != expected) { | |
| 515 errln("Expected " + expected + " but got " + str); | |
| 516 } | |
| 517 UDate otherDate = fmt->parse(expected, status); | |
| 518 if(otherDate != aDate) { | |
| 519 UnicodeString str3; | |
| 520 ParsePosition pp; | |
| 521 fmt->parse(expected, *cal2, pp); | |
| 522 fmt->format(otherDate, str3); | |
| 523 errln("Parse incorrect of " + expected + " - wanted " + aDate + " bu
t got " + " = " + otherDate + ", " + str3 + " = " + CalendarTest::calToStr(*c
al2) ); | |
| 524 | |
| 525 } else { | |
| 526 logln("Parsed OK: " + expected); | |
| 527 } | |
| 528 delete fmt; | |
| 529 } | |
| 530 | |
| 531 // Test parse with incomplete information | |
| 532 fmt = new SimpleDateFormat(UnicodeString("G y"), Locale("en_US@calendar=japa
nese"), status); | |
| 533 aDate = -3197117222000.0; | |
| 534 CHECK(status, "creating date format instance"); | |
| 535 if(!fmt) { | |
| 536 errln("Coudln't create en_US instance"); | |
| 537 } else { | |
| 538 UnicodeString str; | |
| 539 fmt2->format(aDate, str); | |
| 540 logln(UnicodeString() + "Test Date: " + str); | |
| 541 str.remove(); | |
| 542 fmt->format(aDate, str); | |
| 543 logln(UnicodeString() + "as Japanese Calendar: " + str); | |
| 544 UnicodeString expected("Meiji 1"); | |
| 545 if(str != expected) { | |
| 546 errln("Expected " + expected + " but got " + str); | |
| 547 } | |
| 548 UDate otherDate = fmt->parse(expected, status); | |
| 549 if(otherDate != aDate) { | |
| 550 UnicodeString str3; | |
| 551 ParsePosition pp; | |
| 552 fmt->parse(expected, *cal2, pp); | |
| 553 fmt->format(otherDate, str3); | |
| 554 errln("Parse incorrect of " + expected + " - wanted " + aDate + " bu
t got " + " = " + | |
| 555 otherDate + ", " + str3 + " = " + CalendarTest::calToStr(*cal2)
); | |
| 556 } else { | |
| 557 logln("Parsed OK: " + expected); | |
| 558 } | |
| 559 delete fmt; | |
| 560 } | |
| 561 | |
| 562 delete cal2; | |
| 563 delete fmt2; | |
| 564 CHECK(status, "Error occured"); | |
| 565 | |
| 566 // Now, try in Japanese | |
| 567 { | |
| 568 UnicodeString expect = CharsToUnicodeString("\\u5e73\\u621013\\u5e749\\u
67088\\u65e5\\u571f\\u66dc\\u65e5"); | |
| 569 UDate expectDate = 999932400000.0; // Testing a recent date | |
| 570 Locale loc("ja_JP@calendar=japanese"); | |
| 571 | |
| 572 status = U_ZERO_ERROR; | |
| 573 simpleTest(loc, expect, expectDate, status); | |
| 574 } | |
| 575 { | |
| 576 UnicodeString expect = CharsToUnicodeString("\\u5e73\\u621013\\u5e749\\u
67088\\u65e5\\u571f\\u66dc\\u65e5"); | |
| 577 UDate expectDate = 999932400000.0; // Testing a recent date | |
| 578 Locale loc("ja_JP_TRADITIONAL"); // legacy | |
| 579 | |
| 580 status = U_ZERO_ERROR; | |
| 581 simpleTest(loc, expect, expectDate, status); | |
| 582 } | |
| 583 { | |
| 584 UnicodeString expect = CharsToUnicodeString("\\u5b89\\u6c385\\u5e747\\u6
7084\\u65e5\\u6728\\u66dc\\u65e5"); | |
| 585 UDate expectDate = -6106032422000.0; // 1776-07-04T00:00:00Z-075
258 | |
| 586 Locale loc("ja_JP@calendar=japanese"); | |
| 587 | |
| 588 status = U_ZERO_ERROR; | |
| 589 simpleTest(loc, expect, expectDate, status); | |
| 590 | |
| 591 } | |
| 592 { // Jitterbug 1869 - this is an ambiguous era. (Showa 64 = Jan 6 1989, bu
t Showa could be 2 other eras) ) | |
| 593 UnicodeString expect = CharsToUnicodeString("\\u662d\\u548c64\\u5e741\\u
67086\\u65e5\\u91d1\\u66dc\\u65e5"); | |
| 594 UDate expectDate = 600076800000.0; | |
| 595 Locale loc("ja_JP@calendar=japanese"); | |
| 596 | |
| 597 status = U_ZERO_ERROR; | |
| 598 simpleTest(loc, expect, expectDate, status); | |
| 599 | |
| 600 } | |
| 601 { // This Feb 29th falls on a leap year by gregorian year, but not by Japa
nese year. | |
| 602 UnicodeString expect = CharsToUnicodeString("\\u5EB7\\u6B632\\u5e742\\u6
70829\\u65e5\\u65e5\\u66dc\\u65e5"); | |
| 603 UDate expectDate = -16214400422000.0; // 1456-03-09T00:00Z-075
258 | |
| 604 Locale loc("ja_JP@calendar=japanese"); | |
| 605 | |
| 606 status = U_ZERO_ERROR; | |
| 607 simpleTest(loc, expect, expectDate, status); | |
| 608 | |
| 609 } | |
| 610 } | |
| 611 | |
| 612 void IntlCalendarTest::TestJapanese3860() | |
| 613 { | |
| 614 Calendar *cal; | |
| 615 UErrorCode status = U_ZERO_ERROR; | |
| 616 cal = Calendar::createInstance("ja_JP@calendar=japanese", status); | |
| 617 CHECK(status, UnicodeString("Creating ja_JP@calendar=japanese calendar")); | |
| 618 Calendar *cal2 = cal->clone(); | |
| 619 SimpleDateFormat *fmt2 = new SimpleDateFormat(UnicodeString("HH:mm:ss.S MMMM
d, yyyy G"), Locale("en_US@calendar=gregorian"), status); | |
| 620 UnicodeString str; | |
| 621 | |
| 622 | |
| 623 { | |
| 624 // Test simple parse/format with adopt | |
| 625 UDate aDate = 0; | |
| 626 | |
| 627 // Test parse with missing era (should default to current era, heisei) | |
| 628 // Test parse with incomplete information | |
| 629 logln("Testing parse w/ missing era..."); | |
| 630 SimpleDateFormat *fmt = new SimpleDateFormat(UnicodeString("y.M.d"), Loc
ale("ja_JP@calendar=japanese"), status); | |
| 631 CHECK(status, "creating date format instance"); | |
| 632 if(!fmt) { | |
| 633 errln("Coudln't create en_US instance"); | |
| 634 } else { | |
| 635 UErrorCode s2 = U_ZERO_ERROR; | |
| 636 cal2->clear(); | |
| 637 UnicodeString samplestr("1.1.9"); | |
| 638 logln(UnicodeString() + "Test Year: " + samplestr); | |
| 639 aDate = fmt->parse(samplestr, s2); | |
| 640 ParsePosition pp=0; | |
| 641 fmt->parse(samplestr, *cal2, pp); | |
| 642 CHECK(s2, "parsing the 1.1.9 string"); | |
| 643 logln("*cal2 after 119 parse:"); | |
| 644 str.remove(); | |
| 645 fmt2->format(aDate, str); | |
| 646 logln(UnicodeString() + "as Gregorian Calendar: " + str); | |
| 647 | |
| 648 cal2->setTime(aDate, s2); | |
| 649 int32_t gotYear = cal2->get(UCAL_YEAR, s2); | |
| 650 int32_t gotEra = cal2->get(UCAL_ERA, s2); | |
| 651 int32_t expectYear = 1; | |
| 652 int32_t expectEra = JapaneseCalendar::getCurrentEra(); | |
| 653 if((gotYear!=1) || (gotEra != expectEra)) { | |
| 654 errln(UnicodeString("parse "+samplestr+" of 'y.m.d' as Japanese
Calendar, expected year ") + expectYear + | |
| 655 UnicodeString(" and era ") + expectEra +", but got year " +
gotYear + " and era " + gotEra + " (Gregorian:" + str +")"); | |
| 656 } else { | |
| 657 logln(UnicodeString() + " year: " + gotYear + ", era: " + gotEra
); | |
| 658 } | |
| 659 delete fmt; | |
| 660 } | |
| 661 } | |
| 662 | |
| 663 { | |
| 664 // Test simple parse/format with adopt | |
| 665 UDate aDate = 0; | |
| 666 | |
| 667 // Test parse with missing era (should default to current era, heisei) | |
| 668 // Test parse with incomplete information | |
| 669 logln("Testing parse w/ just year..."); | |
| 670 SimpleDateFormat *fmt = new SimpleDateFormat(UnicodeString("y"), Locale(
"ja_JP@calendar=japanese"), status); | |
| 671 CHECK(status, "creating date format instance"); | |
| 672 if(!fmt) { | |
| 673 errln("Coudln't create en_US instance"); | |
| 674 } else { | |
| 675 UErrorCode s2 = U_ZERO_ERROR; | |
| 676 cal2->clear(); | |
| 677 UnicodeString samplestr("1"); | |
| 678 logln(UnicodeString() + "Test Year: " + samplestr); | |
| 679 aDate = fmt->parse(samplestr, s2); | |
| 680 ParsePosition pp=0; | |
| 681 fmt->parse(samplestr, *cal2, pp); | |
| 682 CHECK(s2, "parsing the 1 string"); | |
| 683 logln("*cal2 after 1 parse:"); | |
| 684 str.remove(); | |
| 685 fmt2->format(aDate, str); | |
| 686 logln(UnicodeString() + "as Gregorian Calendar: " + str); | |
| 687 | |
| 688 cal2->setTime(aDate, s2); | |
| 689 int32_t gotYear = cal2->get(UCAL_YEAR, s2); | |
| 690 int32_t gotEra = cal2->get(UCAL_ERA, s2); | |
| 691 int32_t expectYear = 1; | |
| 692 int32_t expectEra = 235; //JapaneseCalendar::kCurrentEra; | |
| 693 if((gotYear!=1) || (gotEra != expectEra)) { | |
| 694 errln(UnicodeString("parse "+samplestr+" of 'y' as Japanese Cale
ndar, expected year ") + expectYear + | |
| 695 UnicodeString(" and era ") + expectEra +", but got year " +
gotYear + " and era " + gotEra + " (Gregorian:" + str +")"); | |
| 696 } else { | |
| 697 logln(UnicodeString() + " year: " + gotYear + ", era: " + gotEra
); | |
| 698 } | |
| 699 delete fmt; | |
| 700 } | |
| 701 } | |
| 702 | |
| 703 delete cal2; | |
| 704 delete cal; | |
| 705 delete fmt2; | |
| 706 } | |
| 707 | |
| 708 | |
| 709 | |
| 710 | |
| 711 /** | |
| 712 * Verify the Persian Calendar. | |
| 713 */ | |
| 714 void IntlCalendarTest::TestPersian() { | |
| 715 UDate timeA = Calendar::getNow(); | |
| 716 | |
| 717 Calendar *cal; | |
| 718 UErrorCode status = U_ZERO_ERROR; | |
| 719 cal = Calendar::createInstance("fa_IR@calendar=persian", status); | |
| 720 CHECK(status, UnicodeString("Creating fa_IR@calendar=persian calendar")); | |
| 721 // Sanity check the calendar | |
| 722 UDate timeB = Calendar::getNow(); | |
| 723 UDate timeCal = cal->getTime(status); | |
| 724 | |
| 725 if(!(timeA <= timeCal) || !(timeCal <= timeB)) { | |
| 726 errln((UnicodeString)"Error: Calendar time " + timeCal + | |
| 727 " is not within sampled times [" + timeA + " to " + timeB + "]!"); | |
| 728 } | |
| 729 // end sanity check | |
| 730 | |
| 731 // Test various dates to be sure of validity | |
| 732 int32_t data[] = { | |
| 733 1925, 4, 24, 1304, 2, 4, | |
| 734 2011, 1, 11, 1389, 10, 21, | |
| 735 1986, 2, 25, 1364, 12, 6, | |
| 736 1934, 3, 14, 1312, 12, 23, | |
| 737 | |
| 738 2090, 3, 19, 1468, 12, 29, | |
| 739 2007, 2, 22, 1385, 12, 3, | |
| 740 1969, 12, 31, 1348, 10, 10, | |
| 741 1945, 11, 12, 1324, 8, 21, | |
| 742 1925, 3, 31, 1304, 1, 11, | |
| 743 | |
| 744 1996, 3, 19, 1374, 12, 29, | |
| 745 1996, 3, 20, 1375, 1, 1, | |
| 746 1997, 3, 20, 1375, 12, 30, | |
| 747 1997, 3, 21, 1376, 1, 1, | |
| 748 | |
| 749 2008, 3, 19, 1386, 12, 29, | |
| 750 2008, 3, 20, 1387, 1, 1, | |
| 751 2004, 3, 19, 1382, 12, 29, | |
| 752 2004, 3, 20, 1383, 1, 1, | |
| 753 | |
| 754 2006, 3, 20, 1384, 12, 29, | |
| 755 2006, 3, 21, 1385, 1, 1, | |
| 756 | |
| 757 2005, 4, 20, 1384, 1, 31, | |
| 758 2005, 4, 21, 1384, 2, 1, | |
| 759 2005, 5, 21, 1384, 2, 31, | |
| 760 2005, 5, 22, 1384, 3, 1, | |
| 761 2005, 6, 21, 1384, 3, 31, | |
| 762 2005, 6, 22, 1384, 4, 1, | |
| 763 2005, 7, 22, 1384, 4, 31, | |
| 764 2005, 7, 23, 1384, 5, 1, | |
| 765 2005, 8, 22, 1384, 5, 31, | |
| 766 2005, 8, 23, 1384, 6, 1, | |
| 767 2005, 9, 22, 1384, 6, 31, | |
| 768 2005, 9, 23, 1384, 7, 1, | |
| 769 2005, 10, 22, 1384, 7, 30, | |
| 770 2005, 10, 23, 1384, 8, 1, | |
| 771 2005, 11, 21, 1384, 8, 30, | |
| 772 2005, 11, 22, 1384, 9, 1, | |
| 773 2005, 12, 21, 1384, 9, 30, | |
| 774 2005, 12, 22, 1384, 10, 1, | |
| 775 2006, 1, 20, 1384, 10, 30, | |
| 776 2006, 1, 21, 1384, 11, 1, | |
| 777 2006, 2, 19, 1384, 11, 30, | |
| 778 2006, 2, 20, 1384, 12, 1, | |
| 779 2006, 3, 20, 1384, 12, 29, | |
| 780 2006, 3, 21, 1385, 1, 1, | |
| 781 | |
| 782 // The 2820-year cycle arithmetical algorithm would fail this one. | |
| 783 2025, 3, 21, 1404, 1, 1, | |
| 784 | |
| 785 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1 | |
| 786 }; | |
| 787 | |
| 788 Calendar *grego = Calendar::createInstance("fa_IR@calendar=gregorian", statu
s); | |
| 789 for (int32_t i=0; data[i]!=-1; ) { | |
| 790 int32_t gregYear = data[i++]; | |
| 791 int32_t gregMonth = data[i++]-1; | |
| 792 int32_t gregDay = data[i++]; | |
| 793 int32_t persYear = data[i++]; | |
| 794 int32_t persMonth = data[i++]-1; | |
| 795 int32_t persDay = data[i++]; | |
| 796 | |
| 797 // Test conversion from Persian dates | |
| 798 grego->clear(); | |
| 799 grego->set(gregYear, gregMonth, gregDay); | |
| 800 | |
| 801 cal->clear(); | |
| 802 cal->set(persYear, persMonth, persDay); | |
| 803 | |
| 804 UDate persTime = cal->getTime(status); | |
| 805 UDate gregTime = grego->getTime(status); | |
| 806 | |
| 807 if (persTime != gregTime) { | |
| 808 errln(UnicodeString("Expected ") + gregTime + " but got " + persTime); | |
| 809 } | |
| 810 | |
| 811 // Test conversion to Persian dates | |
| 812 cal->clear(); | |
| 813 cal->setTime(gregTime, status); | |
| 814 | |
| 815 int32_t computedYear = cal->get(UCAL_YEAR, status); | |
| 816 int32_t computedMonth = cal->get(UCAL_MONTH, status); | |
| 817 int32_t computedDay = cal->get(UCAL_DATE, status); | |
| 818 | |
| 819 if ((persYear != computedYear) || | |
| 820 (persMonth != computedMonth) || | |
| 821 (persDay != computedDay)) { | |
| 822 errln(UnicodeString("Expected ") + persYear + "/" + (persMonth+1) + "/
" + persDay + | |
| 823 " but got " + computedYear + "/" + (computedMonth+1) + "/" + co
mputedDay); | |
| 824 } | |
| 825 | |
| 826 } | |
| 827 | |
| 828 delete cal; | |
| 829 delete grego; | |
| 830 } | |
| 831 | |
| 832 void IntlCalendarTest::TestPersianFormat() { | |
| 833 UErrorCode status = U_ZERO_ERROR; | |
| 834 SimpleDateFormat *fmt = new SimpleDateFormat(UnicodeString("MMMM d, yyyy G")
, Locale(" en_US@calendar=persian"), status); | |
| 835 CHECK(status, "creating date format instance"); | |
| 836 SimpleDateFormat *fmt2 = new SimpleDateFormat(UnicodeString("MMMM d, yyyy G"
), Locale("en_US@calendar=gregorian"), status); | |
| 837 CHECK(status, "creating gregorian date format instance"); | |
| 838 UnicodeString gregorianDate("January 18, 2007 AD"); | |
| 839 UDate aDate = fmt2->parse(gregorianDate, status); | |
| 840 if(!fmt) { | |
| 841 errln("Coudln't create en_US instance"); | |
| 842 } else { | |
| 843 UnicodeString str; | |
| 844 fmt->format(aDate, str); | |
| 845 logln(UnicodeString() + "as Persian Calendar: " + escape(str)); | |
| 846 UnicodeString expected("Dey 28, 1385 AP"); | |
| 847 if(str != expected) { | |
| 848 errln("Expected " + escape(expected) + " but got " + escape(str)); | |
| 849 } | |
| 850 UDate otherDate = fmt->parse(expected, status); | |
| 851 if(otherDate != aDate) { | |
| 852 UnicodeString str3; | |
| 853 fmt->format(otherDate, str3); | |
| 854 errln("Parse incorrect of " + escape(expected) + " - wanted " + aDat
e + " but got " + otherDate + ", " + escape(str3)); | |
| 855 } else { | |
| 856 logln("Parsed OK: " + expected); | |
| 857 } | |
| 858 // Two digit year parsing problem #4732 | |
| 859 fmt->applyPattern("yy-MM-dd"); | |
| 860 str.remove(); | |
| 861 fmt->format(aDate, str); | |
| 862 expected.setTo("85-10-28"); | |
| 863 if(str != expected) { | |
| 864 errln("Expected " + escape(expected) + " but got " + escape(str)); | |
| 865 } | |
| 866 otherDate = fmt->parse(expected, status); | |
| 867 if (otherDate != aDate) { | |
| 868 errln("Parse incorrect of " + escape(expected) + " - wanted " + aDat
e + " but got " + otherDate); | |
| 869 } else { | |
| 870 logln("Parsed OK: " + expected); | |
| 871 } | |
| 872 delete fmt; | |
| 873 } | |
| 874 delete fmt2; | |
| 875 | |
| 876 CHECK(status, "Error occured testing Persian Calendar in English "); | |
| 877 } | |
| 878 | |
| 879 | |
| 880 void IntlCalendarTest::simpleTest(const Locale& loc, const UnicodeString& expect
, UDate expectDate, UErrorCode& status) | |
| 881 { | |
| 882 UnicodeString tmp; | |
| 883 UDate d; | |
| 884 DateFormat *fmt0 = DateFormat::createDateTimeInstance(DateFormat::kFull, Dat
eFormat::kFull); | |
| 885 | |
| 886 logln("Try format/parse of " + (UnicodeString)loc.getName()); | |
| 887 DateFormat *fmt2 = DateFormat::createDateInstance(DateFormat::kFull, loc); | |
| 888 if(fmt2) { | |
| 889 fmt2->format(expectDate, tmp); | |
| 890 logln(escape(tmp) + " ( in locale " + loc.getName() + ")"); | |
| 891 if(tmp != expect) { | |
| 892 errln(UnicodeString("Failed to format " ) + loc.getName() + " expect
ed " + escape(expect) + " got " + escape(tmp) ); | |
| 893 } | |
| 894 | |
| 895 d = fmt2->parse(expect,status); | |
| 896 CHECK(status, "Error occured parsing " + UnicodeString(loc.getName())); | |
| 897 if(d != expectDate) { | |
| 898 fmt2->format(d,tmp); | |
| 899 errln(UnicodeString("Failed to parse " ) + escape(expect) + ", " + l
oc.getName() + " expect " + (double)expectDate + " got " + (double)d + " " + es
cape(tmp)); | |
| 900 logln( "wanted " + escape(fmt0->format(expectDate,tmp.remove())) + "
but got " + escape(fmt0->format(d,tmp.remove()))); | |
| 901 } | |
| 902 delete fmt2; | |
| 903 } else { | |
| 904 errln((UnicodeString)"Can't create " + loc.getName() + " date instance")
; | |
| 905 } | |
| 906 delete fmt0; | |
| 907 } | |
| 908 | |
| 909 #undef CHECK | |
| 910 | |
| 911 #endif /* #if !UCONFIG_NO_FORMATTING */ | |
| 912 | |
| 913 //eof | |
| OLD | NEW |