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.tests.java.util;
19
20import tests.support.Support_TimeZone;
21import java.util.Arrays;
22import java.util.Calendar;
23import java.util.Date;
24import java.util.GregorianCalendar;
25import java.util.List;
26import java.util.Locale;
27import java.util.SimpleTimeZone;
28import java.util.TimeZone;
29
30public class TimeZoneTest extends junit.framework.TestCase {
31
32    private static final int ONE_HOUR = 3600000;
33
34    private TimeZone processDefault;
35
36    /**
37     * java.util.TimeZone#getDefault()
38     */
39    public void test_getDefault() {
40        assertNotSame("returns identical",
41                TimeZone.getDefault(), TimeZone.getDefault());
42    }
43
44    /**
45     * 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("America/New_York");
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     * 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     * 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     * java.util.TimeZone#setDefault(java.util.TimeZone)
160     */
161    public void test_setDefaultLjava_util_TimeZone() {
162        // NOTE: Required to get tests passing under vogar. Vogar sets
163        // a hardcoded timezone before running every test, so we have to
164        // set it back to the "real" default before we run the test.
165        TimeZone.setDefault(null);
166
167        TimeZone oldDefault = TimeZone.getDefault();
168        TimeZone zone = new SimpleTimeZone(45, "TEST");
169        TimeZone.setDefault(zone);
170        assertEquals("timezone not set", zone, TimeZone.getDefault());
171        TimeZone.setDefault(null);
172        assertEquals("default not restored",
173                oldDefault, TimeZone.getDefault());
174    }
175
176    /**
177     * java.util.TimeZone#getDisplayName(java.util.Locale)
178     */
179    public void test_getDisplayNameLjava_util_Locale() {
180        TimeZone timezone = TimeZone.getTimeZone("Asia/Shanghai");
181        assertEquals("\u4e2d\u56fd\u6807\u51c6\u65f6\u95f4", timezone
182                .getDisplayName(Locale.CHINA));
183    }
184
185    /**
186     * java.util.TimeZone#getDisplayName(boolean, int, java.util.Locale)
187     */
188    public void test_getDisplayNameZILjava_util_Locale() {
189        TimeZone timezone = TimeZone.getTimeZone("Asia/Shanghai");
190        /* Time zone data was changed in ICU49.2.  Many common short names were removed. */
191        assertEquals("中国标准时间",
192                timezone.getDisplayName(false, TimeZone.LONG, Locale.CHINA));
193        assertEquals("GMT+08:00",
194                timezone.getDisplayName(false, TimeZone.SHORT, Locale.CHINA));
195        try {
196            timezone.getDisplayName(false, 100, Locale.CHINA);
197            fail("should throw IllegalArgumentException");
198        } catch (IllegalArgumentException e) {
199            // expected
200        }
201    }
202
203    /*
204     * Regression for HARMONY-5860
205     */
206    public void test_GetTimezoneOffset() {
207        // America/Toronto is lazy initialized
208        TimeZone.setDefault(TimeZone.getTimeZone("America/Toronto"));
209        Date date = new Date(07, 2, 24);
210        assertEquals(300, date.getTimezoneOffset());
211        date = new Date(99, 8, 1);
212        assertEquals(240, date.getTimezoneOffset());
213    }
214
215    protected void setUp() {
216        processDefault = TimeZone.getDefault();
217    }
218
219    protected void tearDown() {
220        TimeZone.setDefault(processDefault);
221    }
222
223    public void test_getAvailableIDs_I_16947622() {
224        TimeZone tz = TimeZone.getTimeZone("America/Los_Angeles");
225        int rawOffset = tz.getRawOffset();
226        assertEquals(-8 * 60 * 60 * 1000, rawOffset);
227        List<String> ids = Arrays.asList(TimeZone.getAvailableIDs(rawOffset));
228
229        // Obviously, for all time zones, the time zone whose raw offset we started with
230        // should be one of the available ids for that offset.
231        assertTrue(ids.toString(), ids.contains("America/Los_Angeles"));
232
233        // Any one of these might legitimately change its raw offset, though that's
234        // fairly unlikely, and the chances of more than one changing are very slim.
235        assertTrue(ids.toString(), ids.contains("America/Dawson"));
236        assertTrue(ids.toString(), ids.contains("America/Tijuana"));
237        assertTrue(ids.toString(), ids.contains("America/Vancouver"));
238        assertTrue(ids.toString(), ids.contains("Canada/Pacific"));
239        assertTrue(ids.toString(), ids.contains("Canada/Yukon"));
240        assertTrue(ids.toString(), ids.contains("Pacific/Pitcairn"));
241    }
242
243    public void test_getAvailableIDs_I() {
244        TimeZone tz = TimeZone.getTimeZone("Asia/Shanghai");
245        int rawoffset = tz.getRawOffset();
246        String[] ids = TimeZone.getAvailableIDs(rawoffset);
247        List<String> idList = Arrays.asList(ids);
248        assertTrue(idList.toString(), idList.contains("Asia/Hong_Kong"));
249    }
250
251    /**
252     * @add test {@link java.util.TimeZone#getDisplayName()}
253     */
254    public void test_getDisplayName() {
255        TimeZone defaultZone = TimeZone.getDefault();
256        Locale defaulLocal = Locale.getDefault();
257        String defaultName = defaultZone.getDisplayName();
258        String expectedName = defaultZone.getDisplayName(defaulLocal);
259        assertEquals(
260                "getDispalyName() did not return the default Locale suitable name",
261                expectedName, defaultName);
262    }
263
264    /**
265     * @add test {@link java.util.TimeZone#getDisplayName(boolean, int)}
266     */
267    public void test_getDisplayName_ZI() {
268        TimeZone defaultZone = TimeZone.getDefault();
269        Locale defaultLocale = Locale.getDefault();
270        String actualName = defaultZone.getDisplayName(false, TimeZone.LONG);
271        String expectedName = defaultZone.getDisplayName(false, TimeZone.LONG,
272                defaultLocale);
273        assertEquals(
274                "getDisplayName(daylight,style) did not return the default locale suitable name",
275                expectedName, actualName);
276    }
277
278    /**
279     * @add test {@link java.util.TimeZone#hasSameRules(TimeZone)}
280     */
281    public void test_hasSameRules_Ljava_util_TimeZone() {
282        TimeZone tz = TimeZone.getTimeZone("Asia/Shanghai");
283        int offset = tz.getRawOffset();
284
285        String[] ids = TimeZone.getAvailableIDs(offset);
286        int i = 0;
287        if (ids.length != 0) {
288            while (true) {
289                if (!(ids[i].equalsIgnoreCase(tz.getID()))) {
290                    TimeZone sameZone = TimeZone.getTimeZone(ids[i]);
291                    assertTrue(tz.hasSameRules(sameZone));
292                    break;
293                } else {
294                    i++;
295                }
296            }
297        }
298        assertFalse("should return false when parameter is null", tz
299                .hasSameRules(null));
300    }
301}
302