X-Git-Url: https://git.saurik.com/apple/icu.git/blobdiff_plain/4162bf987dca731f631c28df29ad400b78d50ea9..7393aa2fd2c40c89f12c2db881842a563afdb429:/icuSources/test/intltest/incaltst.cpp diff --git a/icuSources/test/intltest/incaltst.cpp b/icuSources/test/intltest/incaltst.cpp index 114a3c95..a2ec07fa 100644 --- a/icuSources/test/intltest/incaltst.cpp +++ b/icuSources/test/intltest/incaltst.cpp @@ -1,6 +1,6 @@ /*********************************************************************** * COPYRIGHT: - * Copyright (c) 1997-2005, International Business Machines Corporation + * Copyright (c) 1997-2008, International Business Machines Corporation * and others. All Rights Reserved. ***********************************************************************/ @@ -75,6 +75,9 @@ void IntlCalendarTest::runIndexedTest( int32_t index, UBool exec, const char* &n CASE(4,TestBuddhistFormat); CASE(5,TestJapaneseFormat); CASE(6,TestJapanese3860); + CASE(7,TestPersian); + CASE(8,TestPersianFormat); + CASE(9,TestTaiwan); default: name = ""; break; } } @@ -287,10 +290,63 @@ void IntlCalendarTest::TestBuddhist() { // end sanity check - quasiGregorianTest(*cal,Locale("th_TH"),data); + quasiGregorianTest(*cal,Locale("th_TH@calendar=gregorian"),data); delete cal; } + +/** + * Verify that TaiWanCalendar shifts years to Minguo Era but otherwise + * behaves like GregorianCalendar. + */ +void IntlCalendarTest::TestTaiwan() { + // MG 1 == 1912 AD + UDate timeA = Calendar::getNow(); + + // TODO port these to the data items + int32_t data[] = { + 1, // B. era [928479600000] + 1, // B. year + 1912, // G. year + UCAL_JUNE, // month + 4, // day + + 1, // B. era [-79204842000000] + 3, // B. year + 1914, // G. year + UCAL_FEBRUARY, // month + 12, // day + + 1, // B. era [-79204842000000] + 96, // B. year + 2007, // G. year + UCAL_FEBRUARY, // month + 12, // day + + -1,-1,-1,-1,-1,-1,-1,-1,-1,-1 + }; + Calendar *cal; + UErrorCode status = U_ZERO_ERROR; + cal = Calendar::createInstance("en_US@calendar=roc", status); + CHECK(status, UnicodeString("Creating en_US@calendar=roc calendar")); + + // Sanity check the calendar + UDate timeB = Calendar::getNow(); + UDate timeCal = cal->getTime(status); + + if(!(timeA <= timeCal) || !(timeCal <= timeB)) { + errln((UnicodeString)"Error: Calendar time " + timeCal + + " is not within sampled times [" + timeA + " to " + timeB + "]!"); + } + // end sanity check + + + quasiGregorianTest(*cal,Locale("en_US"),data); + delete cal; +} + + + /** * Verify that JapaneseCalendar shifts years to Japanese Eras but otherwise * behaves like GregorianCalendar. @@ -340,6 +396,8 @@ void IntlCalendarTest::TestJapanese() { delete cal; } + + void IntlCalendarTest::TestBuddhistFormat() { UErrorCode status = U_ZERO_ERROR; @@ -417,6 +475,8 @@ void IntlCalendarTest::TestBuddhistFormat() { } } +// TaiwanFormat has been moved to testdata/format.txt + void IntlCalendarTest::TestJapaneseFormat() { Calendar *cal; @@ -599,7 +659,7 @@ void IntlCalendarTest::TestJapanese3860() int32_t gotYear = cal2->get(UCAL_YEAR, s2); int32_t gotEra = cal2->get(UCAL_ERA, s2); int32_t expectYear = 1; - int32_t expectEra = JapaneseCalendar::kCurrentEra; + int32_t expectEra = JapaneseCalendar::getCurrentEra(); if((gotYear!=1) || (gotEra != expectEra)) { errln(UnicodeString("parse "+samplestr+" of 'y.m.d' as Japanese Calendar, expected year ") + expectYear + UnicodeString(" and era ") + expectEra +", but got year " + gotYear + " and era " + gotEra + " (Gregorian:" + str +")"); @@ -657,6 +717,80 @@ void IntlCalendarTest::TestJapanese3860() delete fmt2; } + + + +/** + * Verify the Persian Calendar. + */ +void IntlCalendarTest::TestPersian() { + UDate timeA = Calendar::getNow(); + + Calendar *cal; + UErrorCode status = U_ZERO_ERROR; + cal = Calendar::createInstance("fa_IR@calendar=persian", status); + CHECK(status, UnicodeString("Creating fa_IR@calendar=persian calendar")); + // Sanity check the calendar + UDate timeB = Calendar::getNow(); + UDate timeCal = cal->getTime(status); + + if(!(timeA <= timeCal) || !(timeCal <= timeB)) { + errln((UnicodeString)"Error: Calendar time " + timeCal + + " is not within sampled times [" + timeA + " to " + timeB + "]!"); + } + // end sanity check +// quasiGregorianTest(*cal,Locale("ja_JP"),data); + delete cal; +} + +void IntlCalendarTest::TestPersianFormat() { + UErrorCode status = U_ZERO_ERROR; + SimpleDateFormat *fmt = new SimpleDateFormat(UnicodeString("MMMM d, yyyy G"), Locale(" en_US@calendar=persian"), status); + CHECK(status, "creating date format instance"); + SimpleDateFormat *fmt2 = new SimpleDateFormat(UnicodeString("MMMM d, yyyy G"), Locale("en_US@calendar=gregorian"), status); + CHECK(status, "creating gregorian date format instance"); + UnicodeString gregorianDate("January 18, 2007 AD"); + UDate aDate = fmt2->parse(gregorianDate, status); + if(!fmt) { + errln("Coudln't create en_US instance"); + } else { + UnicodeString str; + fmt->format(aDate, str); + logln(UnicodeString() + "as Persian Calendar: " + escape(str)); + UnicodeString expected("Dey 28, 1385 AP"); + if(str != expected) { + errln("Expected " + escape(expected) + " but got " + escape(str)); + } + UDate otherDate = fmt->parse(expected, status); + if(otherDate != aDate) { + UnicodeString str3; + fmt->format(otherDate, str3); + errln("Parse incorrect of " + escape(expected) + " - wanted " + aDate + " but got " + otherDate + ", " + escape(str3)); + } else { + logln("Parsed OK: " + expected); + } + // Two digit year parsing problem #4732 + fmt->applyPattern("yy-MM-dd"); + str.remove(); + fmt->format(aDate, str); + expected.setTo("85-10-28"); + if(str != expected) { + errln("Expected " + escape(expected) + " but got " + escape(str)); + } + otherDate = fmt->parse(expected, status); + if (otherDate != aDate) { + errln("Parse incorrect of " + escape(expected) + " - wanted " + aDate + " but got " + otherDate); + } else { + logln("Parsed OK: " + expected); + } + delete fmt; + } + delete fmt2; + + CHECK(status, "Error occured testing Persian Calendar in English "); +} + + void IntlCalendarTest::simpleTest(const Locale& loc, const UnicodeString& expect, UDate expectDate, UErrorCode& status) { UnicodeString tmp;