]> gitweb.fperrin.net Git - Dictionary.git/blob - jars/icu4j-4_2_1-src/src/com/ibm/icu/dev/test/calendar/JapaneseTest.java
icu4jsrc
[Dictionary.git] / jars / icu4j-4_2_1-src / src / com / ibm / icu / dev / test / calendar / JapaneseTest.java
1 /*\r
2  *******************************************************************************\r
3  * Copyright (C) 2002-2008, International Business Machines Corporation and    *\r
4  * others. All Rights Reserved.                                                *\r
5  *******************************************************************************\r
6  */\r
7 package com.ibm.icu.dev.test.calendar;\r
8 \r
9 import java.text.ParseException;\r
10 import java.text.ParsePosition;\r
11 import java.util.Date;\r
12 import java.util.Locale;\r
13 \r
14 import com.ibm.icu.impl.LocaleUtility;\r
15 import com.ibm.icu.text.DateFormat;\r
16 import com.ibm.icu.text.SimpleDateFormat;\r
17 import com.ibm.icu.util.Calendar;\r
18 import com.ibm.icu.util.JapaneseCalendar;\r
19 import com.ibm.icu.util.TimeZone;\r
20 import com.ibm.icu.util.ULocale;\r
21 \r
22 /**\r
23  * Tests for the <code>JapaneseCalendar</code> class.\r
24  */\r
25 public class JapaneseTest extends CalendarTest {\r
26     public static void main(String args[]) throws Exception {\r
27         new JapaneseTest().run(args);\r
28     }\r
29 \r
30     public void TestCoverage() {\r
31     {\r
32         // new JapaneseCalendar(TimeZone)\r
33         JapaneseCalendar cal = new JapaneseCalendar(TimeZone.getDefault());\r
34         if(cal == null){\r
35             errln("could not create JapaneseCalendar with TimeZone");\r
36         }\r
37     }\r
38 \r
39     {\r
40         // new JapaneseCalendar(ULocale)\r
41         JapaneseCalendar cal = new JapaneseCalendar(ULocale.getDefault());\r
42         if(cal == null){\r
43             errln("could not create JapaneseCalendar with ULocale");\r
44         }\r
45     }\r
46 \r
47     {\r
48         // new JapaneseCalendar(TimeZone, ULocale)\r
49         JapaneseCalendar cal = new JapaneseCalendar(TimeZone.getDefault(), ULocale.getDefault());\r
50         if(cal == null){\r
51             errln("could not create JapaneseCalendar with TimeZone ULocale");\r
52         }\r
53     }\r
54 \r
55     {\r
56         // new JapaneseCalendar(Locale)\r
57         JapaneseCalendar cal = new JapaneseCalendar(Locale.getDefault());\r
58         if(cal == null){\r
59             errln("could not create JapaneseCalendar with Locale");\r
60         }\r
61     }\r
62 \r
63     {\r
64         // new JapaneseCalendar(TimeZone, Locale)\r
65         JapaneseCalendar cal = new JapaneseCalendar(TimeZone.getDefault(), Locale.getDefault());\r
66         if(cal == null){\r
67             errln("could not create JapaneseCalendar with TimeZone Locale");\r
68         }\r
69     }\r
70 \r
71     {\r
72         // new JapaneseCalendar(Date)\r
73         JapaneseCalendar cal = new JapaneseCalendar(new Date());\r
74         if(cal == null){\r
75             errln("could not create JapaneseCalendar with Date");\r
76         }\r
77     }\r
78 \r
79     {\r
80         // new JapaneseCalendar(int year, int month, int date)\r
81         JapaneseCalendar cal = new JapaneseCalendar(1868, Calendar.JANUARY, 1);\r
82         if(cal == null){\r
83             errln("could not create JapaneseCalendar with year,month,date");\r
84         }\r
85     }\r
86 \r
87     {\r
88         // new JapaneseCalendar(int era, int year, int month, int date)\r
89         JapaneseCalendar cal = new JapaneseCalendar(JapaneseCalendar.MEIJI, 43, Calendar.JANUARY, 1);\r
90         if(cal == null){\r
91             errln("could not create JapaneseCalendar with era,year,month,date");\r
92         }\r
93     }\r
94 \r
95     {\r
96         // new JapaneseCalendar(int year, int month, int date, int hour, int minute, int second)\r
97         JapaneseCalendar cal = new JapaneseCalendar(1868, Calendar.JANUARY, 1, 1, 1, 1);\r
98         if(cal == null){\r
99             errln("could not create JapaneseCalendar with year,month,date,hour,min,second");\r
100         }\r
101     }\r
102 \r
103     {\r
104         // limits\r
105         JapaneseCalendar cal = new JapaneseCalendar();\r
106         DateFormat fmt = cal.getDateTimeFormat(DateFormat.FULL, DateFormat.FULL, Locale.ENGLISH);\r
107 \r
108         cal.set(Calendar.ERA, JapaneseCalendar.MEIJI);\r
109         logln("date: " + cal.getTime());\r
110         logln("min era: " + cal.getMinimum(Calendar.ERA));\r
111         logln("min year: " + cal.getMinimum(Calendar.YEAR));\r
112         cal.set(Calendar.YEAR, cal.getActualMaximum(Calendar.YEAR));\r
113         logln("date: " + fmt.format(cal.getTime()));\r
114         cal.add(Calendar.YEAR, 1);\r
115         logln("date: " + fmt.format(cal.getTime()));\r
116     }\r
117 \r
118     {\r
119         // data\r
120         JapaneseCalendar cal = new JapaneseCalendar(1868, Calendar.JANUARY, 1);\r
121         Date time = cal.getTime();\r
122 \r
123         String[] calendarLocales = {\r
124         "en", "ja_JP"\r
125         };\r
126 \r
127         String[] formatLocales = {\r
128         "en", "ja"\r
129         };\r
130         for (int i = 0; i < calendarLocales.length; ++i) {\r
131             String calLocName = calendarLocales[i];\r
132             Locale calLocale = LocaleUtility.getLocaleFromName(calLocName);\r
133             cal = new JapaneseCalendar(calLocale);\r
134 \r
135             for (int j = 0; j < formatLocales.length; ++j) {\r
136                 String locName = formatLocales[j];\r
137                 Locale formatLocale = LocaleUtility.getLocaleFromName(locName);\r
138                 DateFormat format = DateFormat.getDateTimeInstance(cal, DateFormat.FULL, DateFormat.FULL, formatLocale);\r
139                 logln(calLocName + "/" + locName + " --> " + format.format(time));\r
140             }\r
141         }\r
142     }\r
143     }\r
144     \r
145     public void Test3860()\r
146     {\r
147         ULocale loc = new ULocale("ja_JP@calendar=japanese");\r
148         Calendar cal = new JapaneseCalendar(loc);\r
149         DateFormat enjformat = cal.getDateTimeFormat(0,0,new ULocale("en_JP@calendar=japanese"));\r
150         DateFormat format = cal.getDateTimeFormat(0,0,loc);\r
151         ((SimpleDateFormat)format).applyPattern("y.M.d");  // Note: just 'y' doesn't work here.\r
152         ParsePosition pos = new ParsePosition(0);\r
153         Date aDate = format.parse("1.1.9", pos); // after the start of heisei accession.  Jan 1, 1H wouldn't work  because it is actually showa 64\r
154         String inEn = enjformat.format(aDate);\r
155 \r
156         cal.clear();\r
157         cal.setTime(aDate);\r
158         int gotYear = cal.get(Calendar.YEAR);\r
159         int gotEra = cal.get(Calendar.ERA);\r
160         \r
161         int expectYear = 1;\r
162         int expectEra = JapaneseCalendar.CURRENT_ERA;\r
163         \r
164         if((gotYear != expectYear) || (gotEra != expectEra)) {\r
165             errln("Expected year " + expectYear + ", era " + expectEra +", but got year " + gotYear + " and era " + gotEra + ", == " + inEn);\r
166         } else {\r
167             logln("Got year " + gotYear + " and era " + gotEra + ", == " + inEn);\r
168         }\r
169 \r
170         // Test parse with missing era (should default to current era, heisei)\r
171         // Test parse with incomplete information\r
172         logln("Testing parse w/ just year...");\r
173         Calendar cal2 = new JapaneseCalendar(loc);\r
174         SimpleDateFormat fmt = new SimpleDateFormat("y", loc);\r
175         SimpleDateFormat fmt2 = new SimpleDateFormat("HH:mm:ss.S MMMM d, yyyy G", new ULocale("en_US@calendar=gregorian"));\r
176         cal2.clear();\r
177         String samplestr = "1";\r
178         logln("Test Year: " + samplestr);\r
179         try {\r
180             aDate = fmt.parse(samplestr);\r
181         } catch (ParseException pe) {\r
182             errln("Error parsing " + samplestr);\r
183         }\r
184         ParsePosition pp = new ParsePosition(0);\r
185         fmt.parse(samplestr, cal2, pp);\r
186         logln("cal2 after 1 parse:");\r
187         String str = fmt2.format(aDate);\r
188         logln("as Gregorian Calendar: " + str);\r
189 \r
190         cal2.setTime(aDate);\r
191         gotYear = cal2.get(Calendar.YEAR);\r
192         gotEra = cal2.get(Calendar.ERA);\r
193         expectYear = 1;\r
194         expectEra = JapaneseCalendar.CURRENT_ERA;\r
195         if((gotYear != 1) || (gotEra != expectEra)) {\r
196             errln("parse "+ samplestr + " of 'y' as Japanese Calendar, expected year " + expectYear + \r
197                 " and era " + expectEra + ", but got year " + gotYear + " and era " + gotEra + " (Gregorian:" + str +")");\r
198         } else {            \r
199             logln(" year: " + gotYear + ", era: " + gotEra);\r
200         }\r
201     }\r
202 \r
203     public void Test5345parse() {\r
204         // Test parse with incomplete information\r
205         DateFormat fmt2= DateFormat.getDateInstance(); //DateFormat.LONG, Locale.US);\r
206         JapaneseCalendar c = new JapaneseCalendar(TimeZone.getDefault(), new ULocale("en_US"));\r
207         SimpleDateFormat fmt = (SimpleDateFormat)c.getDateTimeFormat(1,1,new ULocale("en_US@calendar=japanese"));\r
208         fmt.applyPattern("G y");\r
209         logln("fmt's locale = " + fmt.getLocale(ULocale.ACTUAL_LOCALE));\r
210         //SimpleDateFormat fmt = new SimpleDateFormat("G y", new Locale("en_US@calendar=japanese"));\r
211         long aDateLong = -3197120400000L \r
212             + 3600000L; // compensate for DST\r
213         Date aDate = new Date(aDateLong); //08 Sept 1868\r
214         logln("aDate: " + aDate.toString() +", from " + aDateLong);\r
215         String str;\r
216         str = fmt2.format(aDate);\r
217         logln("Test Date: " + str);\r
218         str = fmt.format(aDate);\r
219         logln("as Japanese Calendar: " + str);\r
220         String expected = "Meiji 1";\r
221         if(!str.equals(expected)) {\r
222             errln("FAIL: Expected " + expected + " but got " + str);\r
223         }\r
224         Date otherDate;\r
225         try {\r
226             otherDate = fmt.parse(expected);\r
227             if(!otherDate.equals(aDate)) { \r
228                 String str3;\r
229     //            ParsePosition pp;\r
230                 Date dd = fmt.parse(expected);\r
231                 str3 = fmt.format(otherDate);\r
232                 long oLong = otherDate.getTime();\r
233                 long aLong = otherDate.getTime();\r
234                 \r
235                 errln("FAIL: Parse incorrect of " + expected + ":  wanted " + aDate + " ("+aLong+"), but got " +  " " +\r
236                     otherDate + " ("+oLong+") = " + str3 + " not " + dd.toString() );\r
237 \r
238 \r
239             } else {\r
240                 logln("Parsed OK: " + expected);\r
241             }\r
242         } catch(java.text.ParseException pe) {\r
243             errln("FAIL: ParseException: " + pe.toString());\r
244             pe.printStackTrace();\r
245         }\r
246     }\r
247 \r
248 \r
249     private void checkExpected(Calendar c, int expected[] ) {\r
250         final String[] FIELD_NAME = {\r
251             "ERA", "YEAR", "MONTH", "WEEK_OF_YEAR", "WEEK_OF_MONTH",\r
252             "DAY_OF_MONTH", "DAY_OF_YEAR", "DAY_OF_WEEK",\r
253             "DAY_OF_WEEK_IN_MONTH", "AM_PM", "HOUR", "HOUR_OF_DAY",\r
254             "MINUTE", "SECOND", "MILLISECOND", "ZONE_OFFSET",\r
255             "DST_OFFSET", "YEAR_WOY", "DOW_LOCAL", "EXTENDED_YEAR",\r
256             "JULIAN_DAY", "MILLISECONDS_IN_DAY",\r
257         };\r
258 \r
259         for(int i= 0;i<expected.length;i += 2) {\r
260             int fieldNum = expected[i+0];\r
261             int expectedVal = expected[i+1];\r
262             int actualVal = c.get(fieldNum);\r
263             \r
264             if(expectedVal == actualVal) {\r
265                 logln(FIELD_NAME[fieldNum]+": "+ actualVal);\r
266             } else {\r
267                 errln("FAIL: "+FIELD_NAME[fieldNum]+": expected "+ expectedVal + " got " +  actualVal);\r
268             }\r
269         }\r
270     }\r
271 \r
272     public void Test5345calendar() {\r
273         logln("** testIncompleteCalendar()");\r
274         // Test calendar with incomplete information\r
275         JapaneseCalendar c = new JapaneseCalendar(TimeZone.getDefault());\r
276         logln("test clear");\r
277         c.clear();\r
278  \r
279         // Showa 45 = Gregorian 1970\r
280         int expected0[] = {   Calendar.ERA, 234,\r
281                               Calendar.YEAR, 45 };\r
282         checkExpected(c, expected0);\r
283 \r
284         logln("test setting era");\r
285         c.clear();\r
286         c.set(Calendar.ERA, JapaneseCalendar.MEIJI);\r
287         \r
288         \r
289         int expectedA[] = {   Calendar.ERA, JapaneseCalendar.MEIJI };\r
290         checkExpected(c, expectedA);\r
291 \r
292 \r
293         logln("test setting era and year and month and date");\r
294         c.clear();\r
295         c.set(Calendar.ERA, JapaneseCalendar.MEIJI);\r
296         c.set(Calendar.YEAR, 1);\r
297         c.set(Calendar.MONTH, Calendar.JANUARY);\r
298         c.set(Calendar.DATE, 1);\r
299 \r
300 \r
301         int expectedC[] = {   Calendar.ERA, JapaneseCalendar.MEIJI -1};\r
302         checkExpected(c, expectedC);\r
303 \r
304 \r
305         logln("test setting  year and month and date THEN era");\r
306         c.clear();\r
307         c.set(Calendar.YEAR, 1);\r
308         c.set(Calendar.MONTH, Calendar.JANUARY);\r
309         c.set(Calendar.DATE, 1);\r
310         c.set(Calendar.ERA, JapaneseCalendar.MEIJI);\r
311         \r
312         \r
313         checkExpected(c, expectedC);\r
314         \r
315         \r
316         logln("test setting era and year");\r
317         c.clear();\r
318         c.set(Calendar.YEAR, 1);\r
319         c.set(Calendar.ERA, JapaneseCalendar.MEIJI);\r
320 \r
321 \r
322         int expectedB[] = { Calendar.ERA, JapaneseCalendar.MEIJI,\r
323                             Calendar.YEAR, 1 };\r
324         checkExpected(c, expectedB);\r
325 \r
326     }\r
327 \r
328     \r
329     public void TestJapaneseYear3282() {\r
330         Calendar c = Calendar.getInstance(ULocale.ENGLISH);\r
331         c.set(2003,Calendar.SEPTEMBER,25);\r
332         JapaneseCalendar jcal = new JapaneseCalendar();\r
333         //jcal.setTime(new Date(1187906308151L));  alternate value\r
334         jcal.setTime(c.getTime());\r
335         logln("Now is: " + jcal.getTime());\r
336         c.setTime(jcal.getTime());\r
337         int nowYear = c.get(Calendar.YEAR);\r
338         logln("Now year: "+nowYear);\r
339         SimpleDateFormat jdf = (SimpleDateFormat) SimpleDateFormat.getDateInstance(jcal,\r
340                 SimpleDateFormat.DEFAULT, Locale.getDefault());\r
341         jdf.applyPattern("G yy/MM/dd");\r
342         String text = jdf.format(jcal.getTime());\r
343         logln("Now is: " + text + " (in Japan)");\r
344         try {\r
345             Date date = jdf.parse(text);\r
346             logln("But is this not the date?: " + date);\r
347             c.setTime(date);\r
348             int thenYear = c.get(Calendar.YEAR);\r
349             logln("Then year: "+thenYear);\r
350             if(thenYear != nowYear) {\r
351                 errln("Nowyear "+nowYear +" is not thenyear "+thenYear);\r
352             } else {\r
353                 logln("Nowyear "+nowYear +" == thenyear "+thenYear);\r
354             }\r
355         } catch (java.text.ParseException ex) {\r
356             ex.printStackTrace();\r
357         }\r
358     }\r
359 \r
360     /**\r
361      * Test limits of the Japanese calendar\r
362      */\r
363     public void TestLimits() {\r
364         Calendar cal = Calendar.getInstance();\r
365         cal.set(1988, Calendar.DECEMBER, 1);\r
366         JapaneseCalendar jcal = new JapaneseCalendar();\r
367         doLimitsTest(jcal, null, cal.getTime());\r
368         doTheoreticalLimitsTest(jcal, true);\r
369     }\r
370 }\r
371 \r