1/*
2 *  Licensed to the Apache Software Foundation (ASF) under one or more
3 *  contributor license agreements.  See the NOTICE file distributed with
4 *  this work for additional information regarding copyright ownership.
5 *  The ASF licenses this file to You under the Apache License, Version 2.0
6 *  (the "License"); you may not use this file except in compliance with
7 *  the License.  You may obtain a copy of the License at
8 *
9 *     http://www.apache.org/licenses/LICENSE-2.0
10 *
11 *  Unless required by applicable law or agreed to in writing, software
12 *  distributed under the License is distributed on an "AS IS" BASIS,
13 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 *  See the License for the specific language governing permissions and
15 *  limitations under the License.
16 */
17
18package org.apache.harmony.luni.tests.java.util;
19
20import java.util.Arrays;
21import java.util.Calendar;
22import java.util.Date;
23import java.util.Formatter;
24import java.util.GregorianCalendar;
25import java.util.List;
26import java.util.Locale;
27import java.util.SimpleTimeZone;
28import java.util.TimeZone;
29
30import tests.support.Support_TimeZone;
31
32public class TimeZoneTest extends junit.framework.TestCase {
33
34	private static final int ONE_HOUR = 3600000;
35
36	/**
37	 * @tests java.util.TimeZone#getDefault()
38	 */
39	public void test_getDefault() {
40		assertNotSame("returns identical",
41                              TimeZone.getDefault(), TimeZone.getDefault());
42	}
43
44	/**
45	 * @tests java.util.TimeZone#getDSTSavings()
46	 */
47	public void test_getDSTSavings() {
48		// Test for method int java.util.TimeZone.getDSTSavings()
49
50		// test on subclass SimpleTimeZone
51		TimeZone st1 = TimeZone.getTimeZone("EST");
52		assertEquals("T1A. Incorrect daylight savings returned",
53                             ONE_HOUR, st1.getDSTSavings());
54
55		// a SimpleTimeZone with daylight savings different then 1 hour
56		st1 = TimeZone.getTimeZone("Australia/Lord_Howe");
57		assertEquals("T1B. Incorrect daylight savings returned",
58                             1800000, st1.getDSTSavings());
59
60		// test on subclass Support_TimeZone, an instance with daylight savings
61		TimeZone tz1 = new Support_TimeZone(-5 * ONE_HOUR, true);
62		assertEquals("T2. Incorrect daylight savings returned",
63                             ONE_HOUR, tz1.getDSTSavings());
64
65		// an instance without daylight savings
66		tz1 = new Support_TimeZone(3 * ONE_HOUR, false);
67		assertEquals("T3. Incorrect daylight savings returned, ",
68                             0, tz1.getDSTSavings());
69	}
70
71	/**
72	 * @tests java.util.TimeZone#getOffset(long)
73	 */
74	public void test_getOffset_long() {
75		// Test for method int java.util.TimeZone.getOffset(long time)
76
77		// test on subclass SimpleTimeZone
78		TimeZone st1 = TimeZone.getTimeZone("EST");
79		long time1 = new GregorianCalendar(1998, Calendar.NOVEMBER, 11)
80				.getTimeInMillis();
81		assertEquals("T1. Incorrect offset returned",
82                             -(5 * ONE_HOUR), st1.getOffset(time1));
83
84		long time2 = new GregorianCalendar(1998, Calendar.JUNE, 11)
85				.getTimeInMillis();
86		st1 = TimeZone.getTimeZone("EST");
87		assertEquals("T2. Incorrect offset returned",
88                             -(5 * ONE_HOUR), st1.getOffset(time2));
89
90		// test on subclass Support_TimeZone, an instance with daylight savings
91		TimeZone tz1 = new Support_TimeZone(-5 * ONE_HOUR, true);
92		assertEquals("T3. Incorrect offset returned, ",
93                             -(5 * ONE_HOUR), tz1.getOffset(time1));
94		assertEquals("T4. Incorrect offset returned, ",
95                             -(4 * ONE_HOUR), tz1.getOffset(time2));
96
97		// an instance without daylight savings
98		tz1 = new Support_TimeZone(3 * ONE_HOUR, false);
99		assertEquals("T5. Incorrect offset returned, ",
100                             (3 * ONE_HOUR), tz1.getOffset(time1));
101		assertEquals("T6. Incorrect offset returned, ",
102                             (3 * ONE_HOUR), tz1.getOffset(time2));
103	}
104
105	/**
106	 * @tests java.util.TimeZone#getTimeZone(java.lang.String)
107	 */
108	public void test_getTimeZoneLjava_lang_String() {
109		assertEquals("Must return GMT when given an invalid TimeZone id SMT-8.",
110                             "GMT", TimeZone.getTimeZone("SMT-8").getID());
111		assertEquals("Must return GMT when given an invalid TimeZone time GMT+28:70.",
112                             "GMT", TimeZone.getTimeZone("GMT+28:70").getID());
113		assertEquals("Must return GMT when given an invalid TimeZone time GMT+28:30.",
114                             "GMT", TimeZone.getTimeZone("GMT+28:30").getID());
115		assertEquals("Must return GMT when given an invalid TimeZone time GMT+8:70.",
116                             "GMT", TimeZone.getTimeZone("GMT+8:70").getID());
117		assertEquals("Must return GMT when given an invalid TimeZone time GMT+3:.",
118                             "GMT", TimeZone.getTimeZone("GMT+3:").getID());
119		assertEquals("Must return GMT when given an invalid TimeZone time GMT+3:0.",
120                             "GMT", TimeZone.getTimeZone("GMT+3:0").getID());
121		assertEquals("Must return GMT when given an invalid TimeZone time GMT+2360.",
122                             "GMT", TimeZone.getTimeZone("GMT+2360").getID());
123		assertEquals("Must return GMT when given an invalid TimeZone time GMT+892.",
124                             "GMT", TimeZone.getTimeZone("GMT+892").getID());
125		assertEquals("Must return GMT when given an invalid TimeZone time GMT+082.",
126                             "GMT", TimeZone.getTimeZone("GMT+082").getID());
127		assertEquals("Must return GMT when given an invalid TimeZone time GMT+28.",
128                             "GMT", TimeZone.getTimeZone("GMT+28").getID());
129		assertEquals("Must return GMT when given an invalid TimeZone time GMT+30.",
130                             "GMT", TimeZone.getTimeZone("GMT+30").getID());
131		assertEquals("Must return GMT when given TimeZone GMT.",
132                             "GMT", TimeZone.getTimeZone("GMT").getID());
133		assertEquals("Must return GMT when given TimeZone GMT+.",
134                             "GMT", TimeZone.getTimeZone("GMT+").getID());
135		assertEquals("Must return GMT when given TimeZone GMT-.",
136                             "GMT", TimeZone.getTimeZone("GMT-").getID());
137		assertEquals("Must return GMT when given an invalid TimeZone time GMT-8.45.",
138                             "GMT", TimeZone.getTimeZone("GMT-8.45").getID());
139		assertEquals("Must return GMT when given an invalid TimeZone time GMT-123:23.",
140                             "GMT", TimeZone.getTimeZone("GMT-123:23").getID());
141		assertEquals("Must return proper GMT formatted string for GMT+8:30 (eg. GMT+08:20).",
142                             "GMT+08:30", TimeZone.getTimeZone("GMT+8:30").getID());
143		assertEquals("Must return proper GMT formatted string for GMT+3 (eg. GMT+08:20).",
144                             "GMT+03:00", TimeZone.getTimeZone("GMT+3").getID());
145		assertEquals("Must return proper GMT formatted string for GMT+3:02 (eg. GMT+08:20).",
146                             "GMT+03:02", TimeZone.getTimeZone("GMT+3:02").getID());
147		assertEquals("Must return proper GMT formatted string for GMT+2359 (eg. GMT+08:20).",
148                             "GMT+23:59", TimeZone.getTimeZone("GMT+2359").getID());
149		assertEquals("Must return proper GMT formatted string for GMT+520 (eg. GMT+08:20).",
150                             "GMT+05:20", TimeZone.getTimeZone("GMT+520").getID());
151		assertEquals("Must return proper GMT formatted string for GMT+052 (eg. GMT+08:20).",
152                             "GMT+00:52", TimeZone.getTimeZone("GMT+052").getID());
153        // GMT-0 is an available ID in ICU, so replace it with GMT-00
154		assertEquals("Must return proper GMT formatted string for GMT-00 (eg. GMT+08:20).",
155                             "GMT-00:00", TimeZone.getTimeZone("GMT-00").getID());
156	}
157
158	/**
159	 * @tests java.util.TimeZone#setDefault(java.util.TimeZone)
160	 */
161	public void test_setDefaultLjava_util_TimeZone() {
162		TimeZone oldDefault = TimeZone.getDefault();
163		TimeZone zone = new SimpleTimeZone(45, "TEST");
164		TimeZone.setDefault(zone);
165		assertEquals("timezone not set", zone, TimeZone.getDefault());
166		TimeZone.setDefault(null);
167		assertEquals("default not restored",
168                             oldDefault, TimeZone.getDefault());
169	}
170
171    /**
172     * @tests java.util.TimeZone#getDisplayName(java.util.Locale)
173     */
174    public void test_getDisplayNameLjava_util_Locale() {
175        TimeZone timezone = TimeZone.getTimeZone("Asia/Shanghai");
176        assertEquals("\u4e2d\u56fd\u6807\u51c6\u65f6\u95f4", timezone
177                .getDisplayName(Locale.CHINA));
178    }
179
180    /**
181     * @tests java.util.TimeZone#getDisplayName(boolean, int, java.util.Locale)
182     */
183    public void test_getDisplayNameZILjava_util_Locale() {
184        TimeZone timezone = TimeZone.getTimeZone("Asia/Shanghai");
185        /* Time zone data was changed in ICU49.2.  Many common short names were removed. */
186        assertEquals("中国标准时间",
187                timezone.getDisplayName(false, TimeZone.LONG, Locale.CHINA));
188        assertEquals("GMT+0800",
189                timezone.getDisplayName(false, TimeZone.SHORT, Locale.CHINA));
190        try {
191            timezone.getDisplayName(false, 100, Locale.CHINA);
192            fail("should throw IllegalArgumentException");
193        } catch (IllegalArgumentException e) {
194            // expected
195        }
196    }
197
198    /*
199     * Regression for HARMONY-5860
200     */
201    public void test_GetTimezoneOffset() {
202        // America/Toronto is lazy initialized
203        TimeZone.setDefault(TimeZone.getTimeZone("America/Toronto"));
204        Date date = new Date(07, 2, 24);
205        assertEquals(300, date.getTimezoneOffset());
206        date = new Date(99, 8, 1);
207        assertEquals(240, date.getTimezoneOffset());
208    }
209
210	protected void setUp() {
211	}
212
213	protected void tearDown() {
214	}
215
216    /**
217     * @add test {@link java.util.TimeZone#getAvailableIDs(int)}
218     */
219    public void test_getAvailableIDs_I() {
220        TimeZone tz = TimeZone.getTimeZone("Asia/Shanghai");
221        int rawoffset = tz.getRawOffset();
222        String[] ids = TimeZone.getAvailableIDs(rawoffset);
223        List<String> idList = Arrays.asList(ids);
224        assertTrue("Asia/shanghai and Hongkong should have the same rawoffset",
225                idList.contains("Hongkong"));
226    }
227
228    /**
229     * @add test {@link java.util.TimeZone#getDisplayName()}
230     */
231    public void test_getDisplayName() {
232        TimeZone defaultZone = TimeZone.getDefault();
233        Locale defaulLocal = Locale.getDefault();
234        String defaultName = defaultZone.getDisplayName();
235        String expectedName = defaultZone.getDisplayName(defaulLocal);
236        assertEquals(
237                "getDispalyName() did not return the default Locale suitable name",
238                expectedName, defaultName);
239    }
240
241    /**
242     * @add test {@link java.util.TimeZone#getDisplayName(boolean, int)}
243     */
244    public void test_getDisplayName_ZI() {
245        TimeZone defaultZone = TimeZone.getDefault();
246        Locale defaultLocale = Locale.getDefault();
247        String actualName = defaultZone.getDisplayName(false, TimeZone.LONG);
248        String expectedName = defaultZone.getDisplayName(false, TimeZone.LONG,
249                defaultLocale);
250        assertEquals(
251                "getDisplayName(daylight,style) did not return the default locale suitable name",
252                expectedName, actualName);
253    }
254
255    /**
256     * @add test {@link java.util.TimeZone#hasSameRules(TimeZone)}
257     */
258    public void test_hasSameRules_Ljava_util_TimeZone() {
259        TimeZone tz = TimeZone.getTimeZone("Asia/Shanghai");
260        int offset = tz.getRawOffset();
261
262        String[] ids = TimeZone.getAvailableIDs(offset);
263        int i = 0;
264        if (ids.length != 0) {
265            while (true) {
266                if (!(ids[i].equalsIgnoreCase(tz.getID()))) {
267                    TimeZone sameZone = TimeZone.getTimeZone(ids[i]);
268                    assertTrue(tz.hasSameRules(sameZone));
269                    break;
270                } else {
271                    i++;
272                }
273            }
274        }
275        assertFalse("should return false when parameter is null", tz
276                .hasSameRules(null));
277    }
278}
279