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