/* ******************************************************************************* * Copyright (C) 2005-2010, International Business Machines Corporation and * * others. All Rights Reserved. * ******************************************************************************* */ package com.ibm.icu.dev.test.calendar; import java.util.Date; import java.util.Locale; import com.ibm.icu.impl.LocaleUtility; import com.ibm.icu.text.DateFormat; import com.ibm.icu.text.SimpleDateFormat; import com.ibm.icu.util.Calendar; import com.ibm.icu.util.EthiopicCalendar; import com.ibm.icu.util.GregorianCalendar; import com.ibm.icu.util.TimeZone; import com.ibm.icu.util.ULocale; /** * Tests for the EthiopicCalendar class. */ public class EthiopicTest extends CalendarTest { public static void main(String args[]) throws Exception { new EthiopicTest().run(args); } /** Constants to save typing. */ public static final int MESKEREM = EthiopicCalendar.MESKEREM; public static final int TEKEMT = EthiopicCalendar.TEKEMT; public static final int HEDAR = EthiopicCalendar.HEDAR; public static final int TAHSAS = EthiopicCalendar.TAHSAS; public static final int TER = EthiopicCalendar.TER; public static final int YEKATIT = EthiopicCalendar.YEKATIT; public static final int MEGABIT = EthiopicCalendar.MEGABIT; public static final int MIAZIA = EthiopicCalendar.MIAZIA; public static final int GENBOT = EthiopicCalendar.GENBOT; public static final int SENE = EthiopicCalendar.SENE; public static final int HAMLE = EthiopicCalendar.HAMLE; public static final int NEHASSE = EthiopicCalendar.NEHASSE; public static final int PAGUMEN = EthiopicCalendar.PAGUMEN; /* DY[20050507] I don't know what this is for yet: public void TestRoll() { int[][] tests = new int[][] { // input roll by output // year month day field amount year month day { 0001, QIDAH, 2, MONTH, 1, 0001, HIJJAH, 2 }, // non-leap years { 0001, QIDAH, 2, MONTH, 2, 0001, MUHARRAM, 2 }, { 0001, QIDAH, 2, MONTH, -1, 0001, SHAWWAL, 2 }, { 0001, MUHARRAM, 2, MONTH, 12, 0001, MUHARRAM, 2 }, { 0001, MUHARRAM, 2, MONTH, 13, 0001, SAFAR, 2 }, { 0001, HIJJAH, 1, DATE, 30, 0001, HIJJAH, 2 }, // 29-day month { 0002, HIJJAH, 1, DATE, 31, 0002, HIJJAH, 2 }, // 30-day month // Try some rolls that require other fields to be adjusted { 0001, MUHARRAM, 30, MONTH, 1, 0001, SAFAR, 29 }, { 0002, HIJJAH, 30, YEAR, -1, 0001, HIJJAH, 29 }, }; EthiopicCalendar cal = newCivil(); doRollAdd(ROLL, cal, tests); } */ /* Test dates from: * "The Amharic Letters of Emperor Theodore of Ethiopia to Queen Victoria and * Her Special Envoy", David Appleyard, Girma Selasse Asfaw, Oxford University Press, * June 1 1979, ISBN: 0856726605, Longwood Pr Ltd * * Ethiopic Gregorian JD * 20/02/1855 29/10/1862 2401443 * 29/10/1857 05/07/1865 2402423 * 22/05/1858 29/01/1866 2402631 * 10/08/1858 17/04/1866 2402709 * 28/04/1859 05/01/1867 2402972 * 05/05/1860 13/01/1868 2403345 * * -------------------------------------------------- * * From the Calendrica applet: http://emr.cs.iit.edu/home/reingold/calendar-book/Calendrica.html * * Ethiopic Gregorian JD * 07/05/-8 01/01/0000 1721060 * 08/05/-7 01/01/0001 1721426 * 06/13/-1 27/08/0007 1723855 * * 01/01/0000 28/08/0007 1723856 * 01/01/0001 27/08/0008 1724221 * 01/01/0002 27/08/0009 1724586 * 01/01/0003 27/08/0010 1724951 * 01/01/0004 28/08/0011 1724537 * 05/13/0000 26/08/0008 1724220 * 05/13/0001 26/08/0009 1724585 * 05/13/0002 26/08/0010 1724950 * 05/13/0003 26/08/0011 1725315 * 06/13/0003 27/08/0011 1725316 first ethiopian leap year * 05/13/0004 26/08/0012 1725561 * * 06/02/1575 13/10/1582 2299159 * 07/02/1575 14/10/1582 2299160 Julian 04/10/1582 * 08/02/1575 15/10/1582 2299161 * 09/02/1575 16/10/1582 2299162 * * 23/04/1892 01/01/1900 2415021 * 23/04/1997 01/01/2005 2453372 * 05/13/2000 10/09/2008 2454720 */ /** A huge list of test cases to make sure that computeTime and computeFields * work properly for a wide range of data in the civil calendar. */ public void TestCases() { final TestCase[] tests = { // // The months in this table are 1-based rather than 0-based, // because it's easier to edit that way. // Ethiopic // Julian Day Era Year Month Day WkDay Hour Min Sec // // Dates from "Emporer Theodore..." new TestCase(2401442.5, 1, 1855, 2, 20, WED, 0, 0, 0), // Gregorian: 29/10/1862 new TestCase(2402422.5, 1, 1857, 10, 29, WED, 0, 0, 0), // Gregorian: 05/07/1865 new TestCase(2402630.5, 1, 1858, 5, 22, MON, 0, 0, 0), // Gregorian: 29/01/1866 new TestCase(2402708.5, 1, 1858, 8, 10, TUE, 0, 0, 0), // Gregorian: 17/04/1866 new TestCase(2402971.5, 1, 1859, 4, 28, SAT, 0, 0, 0), // Gregorian: 05/01/1867 new TestCase(2403344.5, 1, 1860, 5, 5, MON, 0, 0, 0), // Gregorian: 13/01/1868 // Miscellaneous: /* Skip these tests until JD bug fixed in the Gregorian calendar: * http://www.jtcsv.com/cgibin/icu-bugs/incoming?id=4406;page=2;user=guest */ new TestCase(1721059.5, 0, 5492, 5, 7, SAT, 0, 0, 0), // Gregorian: 01/01/0000 new TestCase(1721425.5, 0, 5493, 5, 8, MON, 0, 0, 0), // Gregorian: 01/01/0001 new TestCase(1723854.5, 0, 5499, 13, 6, MON, 0, 0, 0), // Gregorian: 27/08/0007 new TestCase(1723855.5, 0, 5500, 1, 1, TUE, 0, 0, 0), // Gregorian: 28/08/0007 new TestCase(1724220.5, 1, 1, 1, 1, WED, 0, 0, 0), // Gregorian: 27/08/0008 new TestCase(1724585.5, 1, 2, 1, 1, THU, 0, 0, 0), // Gregorian: 27/08/0009 new TestCase(1724950.5, 1, 3, 1, 1, FRI, 0, 0, 0), // Gregorian: 27/08/0010 // new TestCase(1724536.5, 1, 4, 1, 1, SUN, 0, 0, 0), // Gregorian: 28/08/0011 new TestCase(1725316.5, 1, 4, 1, 1, SUN, 0, 0, 0), // Gregorian: 28/08/0011 - dlf new TestCase(1724219.5, 0, 5500, 13, 5, TUE, 0, 0, 0), // Gregorian: 26/08/0008 new TestCase(1724584.5, 1, 1, 13, 5, WED, 0, 0, 0), // Gregorian: 26/08/0009 new TestCase(1724949.5, 1, 2, 13, 5, THU, 0, 0, 0), // Gregorian: 26/08/0010 new TestCase(1725314.5, 1, 3, 13, 5, FRI, 0, 0, 0), // Gregorian: 26/08/0011 new TestCase(1725315.5, 1, 3, 13, 6, SAT, 0, 0, 0), // Gregorian: 27/08/0011 - first ethiopic leap year // new TestCase(1725560.5, 1, 4, 13, 5, SUN, 0, 0, 0), // Gregorian: 26/08/0012 - dlf new TestCase(1725680.5, 1, 4, 13, 5, SUN, 0, 0, 0), // Gregorian: 26/08/0012 new TestCase(2299158.5, 1, 1575, 2, 6, WED, 0, 0, 0), // Gregorian: 13/10/1582 new TestCase(2299159.5, 1, 1575, 2, 7, THU, 0, 0, 0), // Gregorian: 14/10/1582 Julian 04/10/1582 new TestCase(2299160.5, 1, 1575, 2, 8, FRI, 0, 0, 0), // Gregorian: 15/10/1582 new TestCase(2299161.5, 1, 1575, 2, 9, SAT, 0, 0, 0), // Gregorian: 16/10/1582 new TestCase(2415020.5, 1, 1892, 4, 23, MON, 0, 0, 0), // Gregorian: 01/01/1900 new TestCase(2453371.5, 1, 1997, 4, 23, SAT, 0, 0, 0), // Gregorian: 01/01/2005 new TestCase(2454719.5, 1, 2000, 13, 5, WED, 0, 0, 0), // Gregorian: 10/09/2008 }; final TestCase[] testsAmeteAlem = { // // The months in this table are 1-based rather than 0-based, // because it's easier to edit that way. // Ethiopic // Julian Day Era Year Month Day WkDay Hour Min Sec // // Dates from "Emporer Theodore..." new TestCase(2401442.5, 0, 7355, 2, 20, WED, 0, 0, 0), // Gregorian: 29/10/1862 new TestCase(2402422.5, 0, 7357, 10, 29, WED, 0, 0, 0), // Gregorian: 05/07/1865 new TestCase(2402630.5, 0, 7358, 5, 22, MON, 0, 0, 0), // Gregorian: 29/01/1866 new TestCase(2402708.5, 0, 7358, 8, 10, TUE, 0, 0, 0), // Gregorian: 17/04/1866 new TestCase(2402971.5, 0, 7359, 4, 28, SAT, 0, 0, 0), // Gregorian: 05/01/1867 new TestCase(2403344.5, 0, 7360, 5, 5, MON, 0, 0, 0), // Gregorian: 13/01/1868 // Miscellaneous: /* Skip these tests until JD bug fixed in the Gregorian calendar: * http://www.jtcsv.com/cgibin/icu-bugs/incoming?id=4406;page=2;user=guest */ new TestCase(1721059.5, 0, 5492, 5, 7, SAT, 0, 0, 0), // Gregorian: 01/01/0000 new TestCase(1721425.5, 0, 5493, 5, 8, MON, 0, 0, 0), // Gregorian: 01/01/0001 new TestCase(1723854.5, 0, 5499, 13, 6, MON, 0, 0, 0), // Gregorian: 27/08/0007 new TestCase(1723855.5, 0, 5500, 1, 1, TUE, 0, 0, 0), // Gregorian: 28/08/0007 new TestCase(1724220.5, 0, 5501, 1, 1, WED, 0, 0, 0), // Gregorian: 27/08/0008 new TestCase(1724585.5, 0, 5502, 1, 1, THU, 0, 0, 0), // Gregorian: 27/08/0009 new TestCase(1724950.5, 0, 5503, 1, 1, FRI, 0, 0, 0), // Gregorian: 27/08/0010 // new TestCase(1724536.5, 0, 5504, 1, 1, SUN, 0, 0, 0), // Gregorian: 28/08/0011 new TestCase(1725316.5, 0, 5504, 1, 1, SUN, 0, 0, 0), // Gregorian: 28/08/0011 - dlf new TestCase(1724219.5, 0, 5500, 13, 5, TUE, 0, 0, 0), // Gregorian: 26/08/0008 new TestCase(1724584.5, 0, 5501, 13, 5, WED, 0, 0, 0), // Gregorian: 26/08/0009 new TestCase(1724949.5, 0, 5502, 13, 5, THU, 0, 0, 0), // Gregorian: 26/08/0010 new TestCase(1725314.5, 0, 5503, 13, 5, FRI, 0, 0, 0), // Gregorian: 26/08/0011 new TestCase(1725315.5, 0, 5503, 13, 6, SAT, 0, 0, 0), // Gregorian: 27/08/0011 - first ethiopic leap year // new TestCase(1725560.5, 0, 5504, 13, 5, SUN, 0, 0, 0), // Gregorian: 26/08/0012 - dlf new TestCase(1725680.5, 0, 5504, 13, 5, SUN, 0, 0, 0), // Gregorian: 26/08/0012 new TestCase(2299158.5, 0, 7075, 2, 6, WED, 0, 0, 0), // Gregorian: 13/10/1582 new TestCase(2299159.5, 0, 7075, 2, 7, THU, 0, 0, 0), // Gregorian: 14/10/1582 Julian 04/10/1582 new TestCase(2299160.5, 0, 7075, 2, 8, FRI, 0, 0, 0), // Gregorian: 15/10/1582 new TestCase(2299161.5, 0, 7075, 2, 9, SAT, 0, 0, 0), // Gregorian: 16/10/1582 new TestCase(2415020.5, 0, 7392, 4, 23, MON, 0, 0, 0), // Gregorian: 01/01/1900 new TestCase(2453371.5, 0, 7497, 4, 23, SAT, 0, 0, 0), // Gregorian: 01/01/2005 new TestCase(2454719.5, 0, 7500, 13, 5, WED, 0, 0, 0), // Gregorian: 10/09/2008 }; EthiopicCalendar testCalendar = new EthiopicCalendar(); testCalendar.setLenient(true); doTestCases(tests, testCalendar); // Testing Amete Alem mode EthiopicCalendar testCalendarAmeteAlem = new EthiopicCalendar(); testCalendarAmeteAlem.setAmeteAlemEra(true); testCalendarAmeteAlem.setLenient(true); doTestCases(testsAmeteAlem, testCalendarAmeteAlem); } // basic check to see that we print out eras ok // eventually should modify to use locale strings and formatter appropriate to coptic calendar public void TestEraStart() { SimpleDateFormat fmt = new SimpleDateFormat("EEE MMM dd, yyyy GG"); fmt.setCalendar(new EthiopicCalendar()); EthiopicCalendar cal = new EthiopicCalendar(1, 0, 1); assertEquals("Ethiopic Date", "Wed Jan 01, 0001 AD", fmt.format(cal)); cal.set(Calendar.ERA, 0); cal.set(Calendar.YEAR, 5500); assertEquals("Ethiopic Date", "Tue Jan 01, 5500 BC", fmt.format(cal)); // The gregorian calendar gets off by two days when // the date gets low, unless the gregorian changeover is set to // very early. The funny thing is, it's ok for dates in the year // 283, but not in the year 7, and it claims to be ok until the year 4. // should track down when the dates start to differ... GregorianCalendar gc = new GregorianCalendar(); gc.setGregorianChange(new Date(Long.MIN_VALUE)); // act like proleptic Gregorian gc.setTime(cal.getTime()); fmt.setCalendar(new GregorianCalendar()); assertEquals("Gregorian Date", "Tue Aug 28, 0007 AD", fmt.format(gc)); } public void TestBasic() { EthiopicCalendar cal = new EthiopicCalendar(); cal.clear(); cal.set(1000, 0, 30); logln("1000/0/30-> " + cal.get(YEAR) + "/" + cal.get(MONTH) + "/" + cal.get(DATE)); cal.clear(); cal.set(1, 0, 30); logln("1/0/30 -> " + cal.get(YEAR) + "/" + cal.get(MONTH) + "/" + cal.get(DATE)); } public void TestJD(){ int jd = EthiopicCalendar.EthiopicToJD(1567,8,9); EthiopicCalendar cal = new EthiopicCalendar(); cal.clear(); cal.set(Calendar.JULIAN_DAY, jd); if (cal.get(Calendar.EXTENDED_YEAR) == 1567 && cal.get(Calendar.MONTH) == 8 && cal.get(Calendar.DAY_OF_MONTH) == 9){ logln("EthiopicCalendar.getDateFromJD tested"); } else { errln("EthiopicCalendar.getDateFromJD failed"); } } /** * Test limits of the Coptic calendar */ public void TestLimits() { Calendar cal = Calendar.getInstance(); cal.set(2007, Calendar.JANUARY, 1); EthiopicCalendar ethiopic = new EthiopicCalendar(); doLimitsTest(ethiopic, null, cal.getTime()); doTheoreticalLimitsTest(ethiopic, true); } public void TestCoverage() { { // new EthiopicCalendar(TimeZone) EthiopicCalendar cal = new EthiopicCalendar(TimeZone.getDefault()); if(cal == null){ errln("could not create EthiopicCalendar with TimeZone"); } } { // new EthiopicCalendar(ULocale) EthiopicCalendar cal = new EthiopicCalendar(ULocale.getDefault()); if(cal == null){ errln("could not create EthiopicCalendar with ULocale"); } } { // new EthiopicCalendar(Locale) EthiopicCalendar cal = new EthiopicCalendar(Locale.getDefault()); if(cal == null){ errln("could not create EthiopicCalendar with Locale"); } } { // new EthiopicCalendar(TimeZone, Locale) EthiopicCalendar cal = new EthiopicCalendar(TimeZone.getDefault(), Locale.getDefault()); if(cal == null){ errln("could not create EthiopicCalendar with TimeZone,Locale"); } } { // new EthiopicCalendar(TimeZone, ULocale) EthiopicCalendar cal = new EthiopicCalendar(TimeZone.getDefault(), ULocale.getDefault()); if(cal == null){ errln("could not create EthiopicCalendar with TimeZone,ULocale"); } } { // new EthiopicCalendar(Date) EthiopicCalendar cal = new EthiopicCalendar(new Date()); if(cal == null){ errln("could not create EthiopicCalendar with Date"); } } { // new EthiopicCalendar(int year, int month, int date) EthiopicCalendar cal = new EthiopicCalendar(1997, EthiopicCalendar.MESKEREM, 1); if(cal == null){ errln("could not create EthiopicCalendar with year,month,date"); } } { // new EthiopicCalendar(int year, int month, int date, int hour, int minute, int second) EthiopicCalendar cal = new EthiopicCalendar(1997, EthiopicCalendar.MESKEREM, 1, 1, 1, 1); if(cal == null){ errln("could not create EthiopicCalendar with year,month,date,hour,minute,second"); } } { // setCivil/isCivil // operations on non-civil calendar EthiopicCalendar cal = newAmeteAlemEraCalendar(); cal.setAmeteAlemEra(false); if (cal.isAmeteAlemEra()) { errln("EthiopicCalendar calendar is old system"); } Date now = new Date(); cal.setTime(now); Date then = cal.getTime(); if (!now.equals(then)) { errln("get/set time failed with non-civil EthiopicCalendar calendar"); } logln(then.toString()); cal.add(Calendar.MONTH, 1); cal.add(Calendar.DAY_OF_MONTH, 1); cal.add(Calendar.YEAR, 1); logln(cal.getTime().toString()); } { // data EthiopicCalendar cal = new EthiopicCalendar(1997, EthiopicCalendar.MESKEREM, 1); Date time = cal.getTime(); String[] calendarLocales = { "am_ET", "gez_ET", "ti_ET" }; String[] formatLocales = { "en", "am", "gez", "ti" }; for (int i = 0; i < calendarLocales.length; ++i) { String calLocName = calendarLocales[i]; Locale calLocale = LocaleUtility.getLocaleFromName(calLocName); cal = new EthiopicCalendar(calLocale); for (int j = 0; j < formatLocales.length; ++j) { String locName = formatLocales[j]; Locale formatLocale = LocaleUtility.getLocaleFromName(locName); DateFormat format = DateFormat.getDateTimeInstance(cal, DateFormat.FULL, DateFormat.FULL, formatLocale); logln(calLocName + "/" + locName + " --> " + format.format(time)); } } } } private static EthiopicCalendar newAmeteAlemEraCalendar() { EthiopicCalendar alemawiCalendar = new EthiopicCalendar(); alemawiCalendar.setAmeteAlemEra(true); return alemawiCalendar; } public void TestAddSet() { class TestAddSetItem { private int startYear; private int startMonth; // 0-based private int startDay; // 1-based private int fieldToChange; private int fieldDelta; private int endYear; private int endMonth; private int endDay; TestAddSetItem(int sYr, int sMo, int sDa, int field, int delta, int eYr, int eMo, int eDa) { startYear = sYr; startMonth = sMo; startDay = sDa; fieldToChange = field; fieldDelta = delta; endYear = eYr; endMonth = eMo; endDay = eDa; } public int getStartYear() { return startYear; } public int getStartMonth() { return startMonth; } public int getStartDay() { return startDay; } public int getField() { return fieldToChange; } public int getDelta() { return fieldDelta; } public int getEndYear() { return endYear; } public int getEndMonth() { return endMonth; } public int getEndDay() { return endDay; } } final TestAddSetItem[] tests = { new TestAddSetItem( 2000, 12, 1, Calendar.MONTH, +1, 2001, 0, 1 ), new TestAddSetItem( 2000, 12, 1, Calendar.MONTH, +9, 2001, 8, 1 ), new TestAddSetItem( 1999, 12, 2, Calendar.MONTH, +1, 2000, 0, 2 ), // 1999 is a leap year new TestAddSetItem( 1999, 12, 2, Calendar.MONTH, +9, 2000, 8, 2 ), new TestAddSetItem( 2001, 0, 1, Calendar.MONTH, -1, 2000, 12, 1 ), new TestAddSetItem( 2001, 0, 1, Calendar.MONTH, -6, 2000, 7, 1 ), new TestAddSetItem( 2000, 12, 1, Calendar.DATE, +8, 2001, 0, 4 ), new TestAddSetItem( 1999, 12, 1, Calendar.DATE, +8, 2000, 0, 3 ), // 1999 is a leap year new TestAddSetItem( 2000, 0, 1, Calendar.DATE, -1, 1999, 12, 6 ), }; EthiopicCalendar testCalendar = new EthiopicCalendar(); for ( int i = 0; i < tests.length; i++ ) { TestAddSetItem item = tests[i]; testCalendar.set( item.getStartYear(), item.getStartMonth(), item.getStartDay(), 9, 0 ); testCalendar.add( item.getField(), item.getDelta() ); int endYear = testCalendar.get(Calendar.YEAR); int endMonth = testCalendar.get(Calendar.MONTH); int endDay = testCalendar.get(Calendar.DATE); if ( endYear != item.getEndYear() || endMonth != item.getEndMonth() || endDay != item.getEndDay() ) { errln("EToJD FAILS: field " + item.getField() + " delta " + item.getDelta() + " expected yr " + item.getEndYear() + " mo " + item.getEndMonth() + " da " + item.getEndDay() + " got yr " + endYear + " mo " + endMonth + " da " + endDay); } } } }