2 *******************************************************************************
3 * Copyright (C) 2005-2011, International Business Machines Corporation and *
4 * others. All Rights Reserved. *
5 *******************************************************************************
7 package com.ibm.icu.dev.test.calendar;
10 import java.util.Locale;
12 import com.ibm.icu.impl.LocaleUtility;
13 import com.ibm.icu.text.DateFormat;
14 import com.ibm.icu.text.SimpleDateFormat;
15 import com.ibm.icu.util.Calendar;
16 import com.ibm.icu.util.GregorianCalendar;
17 import com.ibm.icu.util.IndianCalendar;
18 import com.ibm.icu.util.TimeZone;
19 import com.ibm.icu.util.ULocale;
22 * Tests for the <code>IndianCalendar</code> class.
24 public class IndianTest extends CalendarTest
26 public static void main(String args[]) throws Exception {
27 new IndianTest().run(args);
29 // Months in indian calendar are 0-based. Here taking 1-based names:
30 public static final int CHAITRA = IndianCalendar.CHAITRA + 1;
31 public static final int VAISAKHA = IndianCalendar.VAISAKHA + 1;
32 public static final int JYAISTHA = IndianCalendar.JYAISTHA + 1;
33 public static final int ASADHA = IndianCalendar.ASADHA + 1;
34 public static final int SRAVANA = IndianCalendar.SRAVANA + 1 ;
35 public static final int BHADRA = IndianCalendar.BHADRA + 1 ;
36 public static final int ASVINA = IndianCalendar.ASVINA + 1 ;
37 public static final int KARTIKA = IndianCalendar.KARTIKA + 1 ;
38 public static final int AGRAHAYANA = IndianCalendar.AGRAHAYANA + 1 ;
39 public static final int PAUSA = IndianCalendar.PAUSA + 1 ;
40 public static final int MAGHA = IndianCalendar.MAGHA + 1 ;
41 public static final int PHALGUNA = IndianCalendar.PHALGUNA + 1 ;
43 /** Constants to save typing. */
44 /* Test dates generated from:
45 * http://www.fourmilab.ch/documents/calendar/
47 /** A huge list of test cases to make sure that computeTime and computeFields
48 * work properly for a wide range of data in the Indian civil calendar.
50 public void TestCases()
52 final TestCase[] tests = {
54 // The months in this table are 1-based rather than 0-based,
55 // because it's easier to edit that way.
57 // Julian Day Era Year Month Day WkDay Hour Min Sec
58 new TestCase(1770641.5, 0, 57, ASVINA, 10, SUN, 0, 0, 0),
59 new TestCase(1892731.5, 0, 391, PAUSA, 18, WED, 0, 0, 0),
60 new TestCase(1931579.5, 0, 498, VAISAKHA, 30, MON, 0, 0, 0),
61 new TestCase(1974851.5, 0, 616, KARTIKA, 19, SAT, 0, 0, 0),
62 new TestCase(2091164.5, 0, 935, VAISAKHA, 5, SUN, 0, 0, 0),
63 new TestCase(2121509.5, 0, 1018, JYAISTHA, 3, SUN, 0, 0, 0),
64 new TestCase(2155779.5, 0, 1112, CHAITRA, 2, FRI, 0, 0, 0),
65 new TestCase(2174029.5, 0, 1161, PHALGUNA, 20, SAT, 0, 0, 0),
66 new TestCase(2191584.5, 0, 1210, CHAITRA, 13, FRI, 0, 0, 0),
67 new TestCase(2195261.5, 0, 1220, VAISAKHA, 7, SUN, 0, 0, 0),
68 new TestCase(2229274.5, 0, 1313, JYAISTHA, 22, SUN, 0, 0, 0),
69 new TestCase(2245580.5, 0, 1357, MAGHA, 14, WED, 0, 0, 0),
70 new TestCase(2266100.5, 0, 1414, CHAITRA, 20, SAT, 0, 0, 0),
71 new TestCase(2288542.5, 0, 1475, BHADRA, 28, SAT, 0, 0, 0),
72 new TestCase(2290901.5, 0, 1481, PHALGUNA, 15, SAT, 0, 0, 0),
73 new TestCase(2323140.5, 0, 1570, JYAISTHA, 20, WED, 0, 0, 0),
74 new TestCase(2334551.5, 0, 1601, BHADRA, 16, THU, 0, 0, 0),
75 new TestCase(2334581.5, 0, 1601, ASVINA, 15, SAT, 0, 0, 0),
76 new TestCase(2334610.5, 0, 1601, KARTIKA, 14, SUN, 0, 0, 0),
77 new TestCase(2334639.5, 0, 1601, AGRAHAYANA, 13, MON, 0, 0, 0),
78 new TestCase(2334668.5, 0, 1601, PAUSA, 12, TUE, 0, 0, 0),
79 new TestCase(2334698.5, 0, 1601, MAGHA, 12, THU, 0, 0, 0),
80 new TestCase(2334728.5, 0, 1601, PHALGUNA, 12, SAT, 0, 0, 0),
81 new TestCase(2334757.5, 0, 1602, CHAITRA, 11, SUN, 0, 0, 0),
82 new TestCase(2334787.5, 0, 1602, VAISAKHA, 10, TUE, 0, 0, 0),
83 new TestCase(2334816.5, 0, 1602, JYAISTHA, 8, WED, 0, 0, 0),
84 new TestCase(2334846.5, 0, 1602, ASADHA, 7, FRI, 0, 0, 0),
85 new TestCase(2334848.5, 0, 1602, ASADHA, 9, SUN, 0, 0, 0),
86 new TestCase(2348020.5, 0, 1638, SRAVANA, 2, FRI, 0, 0, 0),
87 new TestCase(2334934.5, 0, 1602, ASVINA, 2, TUE, 0, 0, 0),
88 new TestCase(2366978.5, 0, 1690, JYAISTHA, 29, SUN, 0, 0, 0),
89 new TestCase(2385648.5, 0, 1741, SRAVANA, 11, MON, 0, 0, 0),
90 new TestCase(2392825.5, 0, 1761, CHAITRA, 6, WED, 0, 0, 0),
91 new TestCase(2416223.5, 0, 1825, CHAITRA, 29, SUN, 0, 0, 0),
92 new TestCase(2425848.5, 0, 1851, BHADRA, 3, SUN, 0, 0, 0),
93 new TestCase(2430266.5, 0, 1863, ASVINA, 7, MON, 0, 0, 0),
94 new TestCase(2430833.5, 0, 1865, CHAITRA, 29, MON, 0, 0, 0),
95 new TestCase(2431004.5, 0, 1865, ASVINA, 15, THU, 0, 0, 0),
96 new TestCase(2448698.5, 0, 1913, PHALGUNA, 27, TUE, 0, 0, 0),
97 new TestCase(2450138.5, 0, 1917, PHALGUNA, 6, SUN, 0, 0, 0),
98 new TestCase(2465737.5, 0, 1960, KARTIKA, 19, WED, 0, 0, 0),
99 new TestCase(2486076.5, 0, 2016, ASADHA, 27, SUN, 0, 0, 0),
102 IndianCalendar testCalendar = new IndianCalendar();
103 testCalendar.setLenient(true);
104 doTestCases(tests, testCalendar);
107 public void TestBasic() {
108 IndianCalendar cal = new IndianCalendar();
110 cal.set(1000, 0, 30);
111 logln("1000/0/30-> " +
112 cal.get(YEAR) + "/" +
113 cal.get(MONTH) + "/" +
118 cal.get(YEAR) + "/" +
119 cal.get(MONTH) + "/" +
123 public void TestCoverage() {
126 // new IndianCalendar(TimeZone)
127 IndianCalendar cal = new IndianCalendar(TimeZone.getDefault());
129 errln("could not create IndianCalendar with TimeZone");
134 // new IndianCalendar(ULocale)
135 IndianCalendar cal = new IndianCalendar(ULocale.getDefault());
137 errln("could not create IndianCalendar with ULocale");
142 // new IndianCalendar(Locale)
143 IndianCalendar cal = new IndianCalendar(Locale.getDefault());
145 errln("could not create IndianCalendar with Locale");
150 // new IndianCalendar(TimeZone, Locale)
151 IndianCalendar cal = new IndianCalendar(TimeZone.getDefault(),Locale.getDefault());
153 errln("could not create IndianCalendar with TimeZone, Locale");
158 // new IndianCalendar(TimeZone, ULocale)
159 IndianCalendar cal = new IndianCalendar(TimeZone.getDefault(),ULocale.getDefault());
161 errln("could not create IndianCalendar with TimeZone, ULocale");
166 // new IndianCalendar(Date)
167 IndianCalendar cal = new IndianCalendar(new Date());
169 errln("could not create IndianCalendar with Date");
173 // new IndianCalendar(int year, int month, int date)
174 IndianCalendar cal = new IndianCalendar(1917, IndianCalendar.CHAITRA, 1);
176 errln("could not create IndianCalendar with year,month,date");
180 // new IndianCalendar(int year, int month, int date, int hour, int minute, int second)
181 IndianCalendar cal = new IndianCalendar(1917, IndianCalendar.CHAITRA, 1, 1, 1, 1);
183 errln("could not create IndianCalendar with year,month,date,hour,minute,second");
189 String[] calendarLocales = {
190 "bn_IN", "gu_IN", "hi_IN", "kn_IN", "ml_IN", "or_IN", "pa_IN", "ta_IN", "te_IN"
193 String[] formatLocales = {
194 "en", "fr", "bn", "gu", "hi", "kn", "ml", "or", "pa", "ta", "te"
197 for (int i = 0; i < calendarLocales.length; ++i) {
198 String calLocName = calendarLocales[i];
199 Locale calLocale = LocaleUtility.getLocaleFromName(calLocName);
200 IndianCalendar cal = new IndianCalendar(calLocale);
201 cal.set(-1039, 9, 21);
203 for (int j = 0; j < formatLocales.length; j++ ) {
204 String locName = formatLocales[j];
205 Locale formatLocale = LocaleUtility.getLocaleFromName(locName);
206 DateFormat format = DateFormat.getDateTimeInstance(cal, DateFormat.FULL, DateFormat.FULL, formatLocale);
207 logln(calLocName + "/" + locName + " --> " + format.format(cal));
213 public void TestYear() {
214 // Gregorian Calendar
215 Calendar gCal= new GregorianCalendar();
216 Date gToday=gCal.getTime();
217 gCal.add(GregorianCalendar.MONTH,2);
218 Date gFuture=gCal.getTime();
219 DateFormat gDF = DateFormat.getDateInstance(gCal,DateFormat.FULL);
220 logln("gregorian calendar: " + gDF.format(gToday) +
221 " + 2 months = " + gDF.format(gFuture));
224 IndianCalendar iCal= new IndianCalendar();
225 Date iToday=iCal.getTime();
226 iCal.add(IndianCalendar.MONTH,2);
227 Date iFuture=iCal.getTime();
228 DateFormat iDF = DateFormat.getDateInstance(iCal,DateFormat.FULL);
229 logln("Indian calendar: " + iDF.format(iToday) +
230 " + 2 months = " + iDF.format(iFuture));
235 * Test limits of the Indian calendar
237 public void TestLimits() {
238 Calendar cal = Calendar.getInstance();
239 cal.set(2007, Calendar.JANUARY, 1);
240 IndianCalendar indian = new IndianCalendar();
241 doLimitsTest(indian, null, cal.getTime());
242 doTheoreticalLimitsTest(indian, true);
246 * Problem reported by Bruno Haible <bruno.haible@de.ibm.com>
247 * -- see ticket 8419 -- http://bugs.icu-project.org/trac/ticket/8419
248 * Problem with months out of range 0-11
250 public void TestYearEdge() {
251 // Display dates in ISO 8601 format.
252 DateFormat fmt = new SimpleDateFormat("YYYY-MM-dd", ULocale.US);
254 // Instantiate an Indian calendar.
255 ULocale locale = ULocale.US.setKeywordValue("calendar", "indian");
256 Calendar cal = Calendar.getInstance(locale);
258 // Try add() repeatedly.
259 cal.setTimeInMillis(1295568000000L);
260 if (!fmt.format(cal.getTime()).equals("2011-01-20")){
261 errln("Incorrect calendar value for year edge test");
263 cal.add(Calendar.MONTH, 1);
264 if (!fmt.format(cal.getTime()).equals("2011-02-19")){
265 errln("Incorrect calendar value for year edge test");
267 cal.add(Calendar.MONTH, 1);
268 if (!fmt.format(cal.getTime()).equals("2011-03-21")){
269 errln("Incorrect calendar value for year edge test");
271 cal.add(Calendar.MONTH, 1);
272 if (!fmt.format(cal.getTime()).equals("2011-04-20")){
273 errln("Incorrect calendar value for year edge test");