17935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert/*
27935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert *******************************************************************************
37935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Copyright (C) 2012, International Business Machines Corporation and         *
47935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * others. All Rights Reserved.                                                *
57935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert *******************************************************************************
67935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */
77935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertpackage com.ibm.icu.dev.test.calendar;
87935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.Date;
97935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.util.Calendar;
117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.util.ULocale;
127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertpublic class PersianTest extends CalendarTest {
147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public static void main(String args[]) throws Exception {
167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        new PersianTest().run(args);
177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Test basic mapping to and from Gregorian.
217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestMapping() {
237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        final int[] DATA = {
247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // (Note: months are 1-based)
257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            2011, 1, 11, 1389, 10, 21,
267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            1986, 2, 25, 1364, 12, 6,
277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            1934, 3, 14, 1312, 12, 23,
287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            2090, 3, 19, 1468, 12, 29,
307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            2007, 2, 22, 1385, 12, 3,
317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            1969, 12, 31, 1348, 10, 10,
327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            1945, 11, 12, 1324, 8, 21,
337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            1925, 3, 31, 1304, 1, 11,
347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            1996, 3, 19, 1374, 12, 29,
367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            1996, 3, 20, 1375, 1, 1,
377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            1997, 3, 20, 1375, 12, 30,
387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            1997, 3, 21, 1376, 1, 1,
397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            2008, 3, 19, 1386, 12, 29,
417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            2008, 3, 20, 1387, 1, 1,
427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            2004, 3, 19, 1382, 12, 29,
437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            2004, 3, 20, 1383, 1, 1,
447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            2006, 3, 20, 1384, 12, 29,
467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            2006, 3, 21, 1385, 1, 1,
477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            2005, 4, 20, 1384, 1, 31,
497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            2005, 4, 21, 1384, 2, 1,
507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            2005, 5, 21, 1384, 2, 31,
517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            2005, 5, 22, 1384, 3, 1,
527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            2005, 6, 21, 1384, 3, 31,
537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            2005, 6, 22, 1384, 4, 1,
547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            2005, 7, 22, 1384, 4, 31,
557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            2005, 7, 23, 1384, 5, 1,
567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            2005, 8, 22, 1384, 5, 31,
577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            2005, 8, 23, 1384, 6, 1,
587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            2005, 9, 22, 1384, 6, 31,
597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            2005, 9, 23, 1384, 7, 1,
607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            2005, 10, 22, 1384, 7, 30,
617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            2005, 10, 23, 1384, 8, 1,
627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            2005, 11, 21, 1384, 8, 30,
637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            2005, 11, 22, 1384, 9, 1,
647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            2005, 12, 21, 1384, 9, 30,
657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            2005, 12, 22, 1384, 10, 1,
667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            2006, 1, 20, 1384, 10, 30,
677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            2006, 1, 21, 1384, 11, 1,
687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            2006, 2, 19, 1384, 11, 30,
697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            2006, 2, 20, 1384, 12, 1,
707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            2006, 3, 20, 1384, 12, 29,
717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            2006, 3, 21, 1385, 1, 1,
727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // The 2820-year cycle arithmetical algorithm would fail this one.
747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            2025, 3, 21, 1404, 1, 1,
757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        };
767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Calendar cal = Calendar.getInstance(new ULocale("fa_IR@calendar=persian"));
787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        StringBuilder buf = new StringBuilder();
797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("Gregorian -> Persian");
817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Calendar grego = Calendar.getInstance();
837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        grego.clear();
847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0; i < DATA.length;) {
857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            grego.set(DATA[i++], DATA[i++] - 1, DATA[i++]);
867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            Date date = grego.getTime();
877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            cal.setTime(date);
887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            int y = cal.get(Calendar.YEAR);
897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            int m = cal.get(Calendar.MONTH) + 1; // 0-based -> 1-based
907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            int d = cal.get(Calendar.DAY_OF_MONTH);
917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            int yE = DATA[i++]; // Expected y, m, d
927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            int mE = DATA[i++]; // 1-based
937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            int dE = DATA[i++];
947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            buf.setLength(0);
957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            buf.append(date + " -> ");
967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            buf.append(y + "/" + m + "/" + d);
977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (y == yE && m == mE && d == dE) {
987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                logln("OK: " + buf.toString());
997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } else {
1007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Fail: " + buf.toString() + ", expected " + yE + "/" + mE + "/" + dE);
1017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
1027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
1037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("Persian -> Gregorian");
1057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0; i < DATA.length;) {
1067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            grego.set(DATA[i++], DATA[i++] - 1, DATA[i++]);
1077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            Date dexp = grego.getTime();
1087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            int cyear = DATA[i++];
1097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            int cmonth = DATA[i++];
1107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            int cdayofmonth = DATA[i++];
1117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            cal.clear();
1127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            cal.set(Calendar.YEAR, cyear);
1137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            cal.set(Calendar.MONTH, cmonth - 1);
1147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            cal.set(Calendar.DAY_OF_MONTH, cdayofmonth);
1157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            Date date = cal.getTime();
1167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            buf.setLength(0);
1177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            buf.append(cyear + "/" + cmonth + "/" + cdayofmonth);
1187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            buf.append(" -> " + date);
1197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (date.equals(dexp)) {
1207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                logln("OK: " + buf.toString());
1217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } else {
1227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Fail: " + buf.toString() + ", expected " + dexp);
1237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
1247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
1257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
1267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert}
127