// © 2018 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html #include "unicode/utypes.h" #if !UCONFIG_NO_FORMATTING #include "unicode/calendar.h" #include "unicode/localpointer.h" #include "unicode/unistr.h" #include "unicode/timezone.h" #include "erarules.h" #include "erarulestest.h" void EraRulesTest::runIndexedTest(int32_t index, UBool exec, const char* &name, char* /*par*/) { if (exec) { logln("TestSuite EraRulesTest"); } TESTCASE_AUTO_BEGIN; TESTCASE_AUTO(testAPIs); TESTCASE_AUTO(testJapanese); TESTCASE_AUTO_END; } void EraRulesTest::testAPIs() { const char * calTypes[] = { "gregorian", //"iso8601", "buddhist", "chinese", "coptic", "dangi", "ethiopic", "ethiopic-amete-alem", "hebrew", "indian", "islamic", "islamic-civil", "islamic-rgsa", "islamic-tbla", "islamic-umalqura", "japanese", "persian", "roc", //"unknown", NULL }; for (int32_t i = 0; calTypes[i] != NULL; i++) { UErrorCode status = U_ZERO_ERROR; const char *calId = calTypes[i]; LocalPointer rules1(EraRules::createInstance(calId, FALSE, status)); if (U_FAILURE(status)) { errln(UnicodeString("Era rules for ") + calId + " is not available."); continue; } LocalPointer rules2(EraRules::createInstance(calId, TRUE, status)); if (U_FAILURE(status)) { errln(UnicodeString("Era rules for ") + calId + " (including tentative eras) is not available."); continue; } int32_t numEras1 = rules1->getNumberOfEras(); if (numEras1 <= 0) { errln(UnicodeString("Number of era rules for ") + calId + " is " + numEras1); } int32_t numEras2 = rules2->getNumberOfEras(); if (numEras2 < numEras1) { errln(UnicodeString("Number of era including tentative eras is fewer than one without tentative eras in calendar: ") + calId); } LocalPointer cal(Calendar::createInstance(*TimeZone::getGMT(), "en", status)); if (U_FAILURE(status)) { errln("Failed to create a Calendar instance."); continue; } int32_t currentIdx = rules1->getCurrentEraIndex(); int32_t currentYear = cal->get(UCAL_YEAR, status); int32_t idx = rules1->getEraIndex( currentYear, cal->get(UCAL_MONTH, status) + 1, cal->get(UCAL_DATE, status), status); if (U_FAILURE(status)) { errln("Error while getting index of era."); continue; } if (idx != currentIdx) { errln(UnicodeString("Current era index:") + currentIdx + " is different from era index of now:" + idx + " in calendar:" + calId); } int32_t eraStartYear = rules1->getStartYear(currentIdx, status); if (U_FAILURE(status)) { errln(UnicodeString("Failed to get the start year of era index: ") + currentIdx + " in calendar: " + calId); } if (currentYear < eraStartYear) { errln(UnicodeString("Current era's start year is after the current year in calendar:") + calId); } } } void EraRulesTest::testJapanese() { const int32_t HEISEI = 235; // ICU4C does not define constants for eras UErrorCode status = U_ZERO_ERROR; LocalPointer rules(EraRules::createInstance("japanese", TRUE, status)); if (U_FAILURE(status)) { errln("Failed to get era rules for Japanese calendar."); return; } // Rules should have an era after Heisei int32_t numRules = rules->getNumberOfEras(); if (numRules <= HEISEI) { errln("Era after Heisei is not available."); return; } int postHeiseiStartYear = rules->getStartYear(HEISEI + 1, status); if (U_FAILURE(status)) { errln("Failed to get the start year of era after Heisei."); } if (postHeiseiStartYear != 2019) { errln(UnicodeString("Era after Heisei should start in 2019, but got ") + postHeiseiStartYear); } } #endif /* #if !UCONFIG_NO_FORMATTING */