TimeZoneTest.java revision a61d31e2ee0ff49bf4d1fa7150f605bae836728b
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 tests.api.java.util;
19
20import dalvik.annotation.BrokenTest;
21import dalvik.annotation.TestTargetNew;
22import dalvik.annotation.TestTargets;
23import dalvik.annotation.TestLevel;
24import dalvik.annotation.TestTargetClass;
25import dalvik.annotation.KnownFailure;
26import dalvik.annotation.AndroidOnly;
27
28import java.util.Calendar;
29import java.util.Date;
30import java.util.GregorianCalendar;
31import java.util.Locale;
32import java.util.SimpleTimeZone;
33import java.util.TimeZone;
34
35import tests.support.Support_TimeZone;
36
37@TestTargetClass(TimeZone.class)
38public class TimeZoneTest extends junit.framework.TestCase {
39
40    private static final int ONE_HOUR = 3600000;
41
42    /**
43     * @tests java.util.TimeZone#getDefault()
44     */
45    @TestTargetNew(
46        level = TestLevel.COMPLETE,
47        notes = "",
48        method = "getDefault",
49        args = {}
50    )
51    public void test_getDefault() {
52        assertNotSame("returns identical",
53                              TimeZone.getDefault(), TimeZone.getDefault());
54    }
55
56    /**
57     * @tests java.util.TimeZone#getDSTSavings()
58     */
59    @TestTargetNew(
60        level = TestLevel.COMPLETE,
61        notes = "",
62        method = "getDSTSavings",
63        args = {}
64    )
65    @KnownFailure("Might be a difference in data.")
66    public void test_getDSTSavings() {
67        // Test for method int java.util.TimeZone.getDSTSavings()
68
69        // test on subclass SimpleTimeZone
70        TimeZone st1 = TimeZone.getTimeZone("America/New_York");
71        assertEquals("T1A. Incorrect daylight savings returned",
72                             ONE_HOUR, st1.getDSTSavings());
73
74        // a SimpleTimeZone with daylight savings different then 1 hour
75        st1 = TimeZone.getTimeZone("Australia/Lord_Howe");
76        assertEquals("T1B. Incorrect daylight savings returned",
77                             1800000, st1.getDSTSavings());
78
79        // test on subclass Support_TimeZone, an instance with daylight savings
80        TimeZone tz1 = new Support_TimeZone(-5 * ONE_HOUR, true);
81        assertEquals("T2. Incorrect daylight savings returned",
82                             ONE_HOUR, tz1.getDSTSavings());
83
84        // an instance without daylight savings
85        tz1 = new Support_TimeZone(3 * ONE_HOUR, false);
86        assertEquals("T3. Incorrect daylight savings returned, ",
87                             0, tz1.getDSTSavings());
88    }
89
90    /**
91     * @tests java.util.TimeZone#getOffset(long)
92     */
93    @TestTargetNew(
94        level = TestLevel.COMPLETE,
95        notes = "",
96        method = "getOffset",
97        args = {long.class}
98    )
99    public void test_getOffset_long() {
100        // Test for method int java.util.TimeZone.getOffset(long time)
101
102        // test on subclass SimpleTimeZone
103        TimeZone st1 = TimeZone.getTimeZone("EST");
104        long time1 = new GregorianCalendar(1998, Calendar.NOVEMBER, 11)
105                .getTimeInMillis();
106        assertEquals("T1. Incorrect offset returned",
107                             -(5 * ONE_HOUR), st1.getOffset(time1));
108
109        long time2 = new GregorianCalendar(1998, Calendar.JUNE, 11)
110                .getTimeInMillis();
111//      Not working as expected on RI.
112//        st1 = TimeZone.getTimeZone("EST");
113//        assertEquals("T2. Incorrect offset returned",
114//                             -(4 * ONE_HOUR), st1.getOffset(time2));
115
116        // test on subclass Support_TimeZone, an instance with daylight savings
117        TimeZone tz1 = new Support_TimeZone(-5 * ONE_HOUR, true);
118        assertEquals("T3. Incorrect offset returned, ",
119                             -(5 * ONE_HOUR), tz1.getOffset(time1));
120        assertEquals("T4. Incorrect offset returned, ",
121                             -(4 * ONE_HOUR), tz1.getOffset(time2));
122
123        // an instance without daylight savings
124        tz1 = new Support_TimeZone(3 * ONE_HOUR, false);
125        assertEquals("T5. Incorrect offset returned, ",
126                             (3 * ONE_HOUR), tz1.getOffset(time1));
127        assertEquals("T6. Incorrect offset returned, ",
128                             (3 * ONE_HOUR), tz1.getOffset(time2));
129    }
130
131    /**
132     * @tests java.util.TimeZone#getTimeZone(java.lang.String)
133     */
134    @TestTargetNew(
135        level = TestLevel.COMPLETE,
136        notes = "",
137        method = "getTimeZone",
138        args = {java.lang.String.class}
139    )
140    @KnownFailure("Android fails the last test.")
141    public void test_getTimeZoneLjava_lang_String() {
142        assertEquals("Must return GMT when given an invalid TimeZone id SMT-8.",
143                             "GMT", TimeZone.getTimeZone("SMT-8").getID());
144        assertEquals("Must return GMT when given an invalid TimeZone time GMT+28:70.",
145                             "GMT", TimeZone.getTimeZone("GMT+28:70").getID());
146        assertEquals("Must return GMT when given an invalid TimeZone time GMT+28:30.",
147                             "GMT", TimeZone.getTimeZone("GMT+28:30").getID());
148        assertEquals("Must return GMT when given an invalid TimeZone time GMT+8:70.",
149                             "GMT", TimeZone.getTimeZone("GMT+8:70").getID());
150        assertEquals("Must return GMT when given an invalid TimeZone time GMT+3:.",
151                             "GMT", TimeZone.getTimeZone("GMT+3:").getID());
152        assertEquals("Must return GMT when given an invalid TimeZone time GMT+3:0.",
153                             "GMT", TimeZone.getTimeZone("GMT+3:0").getID());
154        assertEquals("Must return GMT when given an invalid TimeZone time GMT+2360.",
155                             "GMT", TimeZone.getTimeZone("GMT+2360").getID());
156        assertEquals("Must return GMT when given an invalid TimeZone time GMT+892.",
157                             "GMT", TimeZone.getTimeZone("GMT+892").getID());
158        assertEquals("Must return GMT when given an invalid TimeZone time GMT+082.",
159                             "GMT", TimeZone.getTimeZone("GMT+082").getID());
160        assertEquals("Must return GMT when given an invalid TimeZone time GMT+28.",
161                             "GMT", TimeZone.getTimeZone("GMT+28").getID());
162        assertEquals("Must return GMT when given an invalid TimeZone time GMT+30.",
163                             "GMT", TimeZone.getTimeZone("GMT+30").getID());
164        assertEquals("Must return GMT when given TimeZone GMT.",
165                             "GMT", TimeZone.getTimeZone("GMT").getID());
166        assertEquals("Must return GMT when given TimeZone GMT+.",
167                             "GMT", TimeZone.getTimeZone("GMT+").getID());
168        assertEquals("Must return GMT when given TimeZone GMT-.",
169                             "GMT", TimeZone.getTimeZone("GMT-").getID());
170        assertEquals("Must return GMT when given an invalid TimeZone time GMT-8.45.",
171                             "GMT", TimeZone.getTimeZone("GMT-8.45").getID());
172        assertEquals("Must return GMT when given an invalid TimeZone time GMT-123:23.",
173                             "GMT", TimeZone.getTimeZone("GMT-123:23").getID());
174        assertEquals("Must return proper GMT formatted string for GMT+8:30 (eg. GMT+08:20).",
175                             "GMT+08:30", TimeZone.getTimeZone("GMT+8:30").getID());
176        assertEquals("Must return proper GMT formatted string for GMT+3 (eg. GMT+08:20).",
177                             "GMT+03:00", TimeZone.getTimeZone("GMT+3").getID());
178        assertEquals("Must return proper GMT formatted string for GMT+3:02 (eg. GMT+08:20).",
179                             "GMT+03:02", TimeZone.getTimeZone("GMT+3:02").getID());
180        assertEquals("Must return proper GMT formatted string for GMT+2359 (eg. GMT+08:20).",
181                             "GMT+23:59", TimeZone.getTimeZone("GMT+2359").getID());
182        assertEquals("Must return proper GMT formatted string for GMT+520 (eg. GMT+08:20).",
183                             "GMT+05:20", TimeZone.getTimeZone("GMT+520").getID());
184        assertEquals("Must return proper GMT formatted string for GMT+052 (eg. GMT+08:20).",
185                             "GMT+00:52", TimeZone.getTimeZone("GMT+052").getID());
186        assertEquals("Must return proper GMT formatted string for GMT-0 (eg. GMT+08:20).",
187                             "GMT-00:00", TimeZone.getTimeZone("GMT-0").getID());
188    }
189
190    /**
191     * @tests java.util.TimeZone#setDefault(java.util.TimeZone)
192     */
193    @TestTargetNew(
194        level = TestLevel.COMPLETE,
195        notes = "",
196        method = "setDefault",
197        args = {java.util.TimeZone.class}
198    )
199    @BrokenTest("Runner sets timezone before test, hence old value != default")
200    public void test_setDefaultLjava_util_TimeZone() {
201        TimeZone oldDefault = TimeZone.getDefault();
202        TimeZone zone = new SimpleTimeZone(45, "TEST");
203        TimeZone.setDefault(zone);
204        assertEquals("timezone not set", zone, TimeZone.getDefault());
205        TimeZone.setDefault(null);
206        assertEquals("default not restored",
207                             oldDefault, TimeZone.getDefault());
208    }
209
210    class Mock_TimeZone extends TimeZone {
211        @Override
212        public int getOffset(int era, int year, int month, int day, int dayOfWeek, int milliseconds) {
213            return 0;
214        }
215
216        @Override
217        public int getRawOffset() {
218            return 0;
219        }
220
221        @Override
222        public boolean inDaylightTime(Date date) {
223            return false;
224        }
225
226        @Override
227        public void setRawOffset(int offsetMillis) {
228
229        }
230
231        @Override
232        public boolean useDaylightTime() {
233            return false;
234        }
235    }
236
237    @TestTargetNew(
238        level = TestLevel.COMPLETE,
239        notes = "",
240        method = "TimeZone",
241        args = {}
242    )
243    public void test_constructor() {
244        assertNotNull(new Mock_TimeZone());
245    }
246
247    @TestTargetNew(
248        level = TestLevel.COMPLETE,
249        notes = "",
250        method = "clone",
251        args = {}
252    )
253    public void test_clone() {
254        TimeZone tz1 = TimeZone.getDefault();
255        TimeZone tz2 = (TimeZone)tz1.clone();
256
257        assertTrue(tz1.equals(tz2));
258    }
259
260    @TestTargetNew(
261        level = TestLevel.COMPLETE,
262        notes = "",
263        method = "getAvailableIDs",
264        args = {}
265    )
266    public void test_getAvailableIDs() {
267        String[] str = TimeZone.getAvailableIDs();
268        assertNotNull(str);
269        assertTrue(str.length != 0);
270        for(int i = 0; i < str.length; i++) {
271            assertNotNull(TimeZone.getTimeZone(str[i]));
272        }
273    }
274
275    @TestTargetNew(
276        level = TestLevel.COMPLETE,
277        notes = "",
278        method = "getAvailableIDs",
279        args = {int.class}
280    )
281    public void test_getAvailableIDsI() {
282        String[] str = TimeZone.getAvailableIDs(0);
283        assertNotNull(str);
284        assertTrue(str.length != 0);
285        for(int i = 0; i < str.length; i++) {
286            assertNotNull(TimeZone.getTimeZone(str[i]));
287        }
288    }
289
290    @TestTargetNew(
291        level = TestLevel.COMPLETE,
292        notes = "",
293        method = "getDisplayName",
294        args = {}
295    )
296    public void test_getDisplayName() {
297        TimeZone tz = TimeZone.getTimeZone("GMT-6");
298        assertEquals("GMT-06:00", tz.getDisplayName());
299        tz = TimeZone.getTimeZone("America/Los_Angeles");
300        assertEquals("Pacific Standard Time", tz.getDisplayName());
301    }
302
303    @TestTargetNew(
304        level = TestLevel.COMPLETE,
305        notes = "",
306        method = "getDisplayName",
307        args = {java.util.Locale.class}
308    )
309    public void test_getDisplayNameLjava_util_Locale() {
310        TimeZone tz = TimeZone.getTimeZone("America/Los_Angeles");
311        assertEquals("Pacific Standard Time", tz.getDisplayName(new Locale("US")));
312        assertEquals("Heure normale du Pacifique", tz.getDisplayName(Locale.FRANCE));
313    }
314
315    @TestTargetNew(
316        level = TestLevel.COMPLETE,
317        notes = "",
318        method = "getDisplayName",
319        args = {boolean.class, int.class}
320    )
321    public void test_getDisplayNameZI() {
322        TimeZone tz = TimeZone.getTimeZone("America/Los_Angeles");
323        assertEquals("PST",                   tz.getDisplayName(false, 0));
324        assertEquals("Pacific Daylight Time", tz.getDisplayName(true, 1));
325        assertEquals("Pacific Standard Time", tz.getDisplayName(false, 1));
326    }
327
328    @TestTargetNew(
329        level = TestLevel.COMPLETE,
330        notes = "",
331        method = "getDisplayName",
332        args = {boolean.class, int.class, java.util.Locale.class}
333    )
334    @AndroidOnly("fail on RI. See comment below")
335    public void test_getDisplayNameZILjava_util_Locale() {
336        TimeZone tz = TimeZone.getTimeZone("America/Los_Angeles");
337        assertEquals("PST",                   tz.getDisplayName(false, 0, Locale.US));
338        assertEquals("Pacific Daylight Time", tz.getDisplayName(true,  1, Locale.US));
339        assertEquals("Pacific Standard Time", tz.getDisplayName(false, 1, Locale.UK));
340        //RI fails on following line. RI always returns short time zone name as "PST"
341        assertEquals("HMG-08:00",             tz.getDisplayName(false, 0, Locale.FRANCE));
342        assertEquals("Heure avanc\u00e9e du Pacifique", tz.getDisplayName(true,  1, Locale.FRANCE));
343        assertEquals("Heure normale du Pacifique", tz.getDisplayName(false, 1, Locale.FRANCE));
344    }
345
346    @TestTargetNew(
347        level = TestLevel.COMPLETE,
348        notes = "",
349        method = "getID",
350        args = {}
351    )
352    public void test_getID() {
353        TimeZone tz = TimeZone.getTimeZone("GMT-6");
354        assertEquals("GMT-06:00", tz.getID());
355        tz = TimeZone.getTimeZone("America/Denver");
356        assertEquals("America/Denver", tz.getID());
357    }
358
359    @TestTargetNew(
360        level = TestLevel.COMPLETE,
361        notes = "",
362        method = "hasSameRules",
363        args = {java.util.TimeZone.class}
364    )
365    @KnownFailure("Arizona doesn't observe DST")
366    public void test_hasSameRulesLjava_util_TimeZone() {
367        TimeZone tz1 = TimeZone.getTimeZone("America/Denver");
368        TimeZone tz2 = TimeZone.getTimeZone("America/Phoenix");
369        assertEquals(tz1.getDisplayName(false, 0), tz2.getDisplayName(false, 0));
370        // Arizona doesn't observe DST. See http://phoenix.about.com/cs/weather/qt/timezone.htm
371        assertFalse(tz1.hasSameRules(tz2));
372        assertFalse(tz1.hasSameRules(null));
373        tz1 = TimeZone.getTimeZone("America/Montreal");
374        tz2 = TimeZone.getTimeZone("America/New_York");
375        assertEquals(tz1.getDisplayName(), tz2.getDisplayName());
376        assertFalse(tz1.getID().equals(tz2.getID()));
377        assertTrue(tz2.hasSameRules(tz1));
378        assertTrue(tz1.hasSameRules(tz1));
379    }
380
381    @TestTargetNew(
382        level = TestLevel.COMPLETE,
383        notes = "",
384        method = "useDaylightTime",
385        args = {}
386    )
387    public void test_useDaylightTime() {
388        // http://code.google.com/p/android/issues/detail?id=877
389
390        TimeZone asiaTaipei = TimeZone.getTimeZone("Asia/Taipei");
391        assertFalse("Taiwan doesn't use DST", asiaTaipei.useDaylightTime());
392    }
393
394    @TestTargetNew(
395        level = TestLevel.COMPLETE,
396        notes = "",
397        method = "setID",
398        args = {java.lang.String.class}
399    )
400    public void test_setIDLjava_lang_String() {
401        TimeZone tz = TimeZone.getTimeZone("GMT-6");
402        assertEquals("GMT-06:00", tz.getID());
403        tz.setID("New ID for GMT-6");
404        assertEquals("New ID for GMT-6", tz.getID());
405    }
406
407    Locale loc = null;
408
409    protected void setUp() {
410        loc = Locale.getDefault();
411        Locale.setDefault(Locale.US);
412    }
413
414    protected void tearDown() {
415        Locale.setDefault(loc);
416    }
417}
418