// © 2016 and later: Unicode, Inc. and others.
// License & terms of use: http://www.unicode.org/copyright.html#License
/*
 *******************************************************************************
 * Copyright (C) 2006-2011, International Business Machines Corporation and    *
 * others. All Rights Reserved.                                                *
 *******************************************************************************
 */

package com.ibm.icu.tests;

import java.util.Date;
import java.util.Locale;

import com.ibm.icu.util.Calendar;
import com.ibm.icu.util.TimeZone;
import com.ibm.icu.util.ULocale;

public class TimeZoneTest extends ICUTestCase {

    /*
     * Test method for 'com.ibm.icu.util.TimeZone.hashCode()'
     */
    public void testHashCode() {
        TimeZone tz1 = TimeZone.getTimeZone("PST");
        TimeZone tz2 = TimeZone.getTimeZone("PST");
        TimeZone tzn = TimeZone.getTimeZone("CST");
        testEHCS(tz1, tz2, tzn);
    }

    /*
     * Test method for 'com.ibm.icu.util.TimeZone.TimeZone(TimeZone)'
     */
    public void testTimeZone() {
        // implicitly tested everywhere
    }

    /*
     * Test method for 'com.ibm.icu.util.TimeZone.getOffset(int, int, int, int, int, int)'
     */
    public void testGetOffset() {
        TimeZone tz = TimeZone.getTimeZone("PST");
        int offset = tz.getOffset(1, 2004, 0, 01, 1, 0);
        assertEquals(-28800000, offset);
    }

    /*
     * Test method for 'com.ibm.icu.util.TimeZone.setRawOffset(int)'
     */
    public void testSetRawOffset() {
        TimeZone tz = TimeZone.getTimeZone("PST");
        int value = tz.getRawOffset();
        int value1 = value + 100000;
        tz.setRawOffset(value1);
        int result = tz.getRawOffset();
        assertNotEqual(value, result);
        assertEquals(value1, result);
    }

    /*
     * Test method for 'com.ibm.icu.util.TimeZone.getRawOffset()'
     */
    public void testGetRawOffset() {
        TimeZone tz = TimeZone.getTimeZone("PST");
        int offset = tz.getRawOffset();
        assertEquals(-28800000, offset);
    }

    /*
     * Test method for 'com.ibm.icu.util.TimeZone.getID()'
     */
    public void testGetID() {
        TimeZone tz = TimeZone.getTimeZone("PST");
        assertEquals("PST", tz.getID());
    }

    /*
     * Test method for 'com.ibm.icu.util.TimeZone.setID(String)'
     */
    public void testSetID() {
        TimeZone tz = TimeZone.getTimeZone("PST");
        String value1 = tz.getID();
        String value2 = value1 + "!";
        tz.setID(value2);
        String result = tz.getID();
        assertNotEqual(value1, result);
        assertEquals(value2, result);
    }

    /*
     * Test method for 'com.ibm.icu.util.TimeZone.getDisplayName()'
     */
    public void testGetDisplayName() {
        TimeZone tz = TimeZone.getTimeZone("PST");
        assertEquals("Pacific Standard Time", tz.getDisplayName());
    }

    /*
     * Test method for 'com.ibm.icu.util.TimeZone.getDisplayName(Locale)'
     */
    public void testGetDisplayNameLocale() {
        TimeZone tz = TimeZone.getTimeZone("PST");
        assertEquals("Pacific Standard Time", tz.getDisplayName(Locale.US));
    }

    /*
     * Test method for 'com.ibm.icu.util.TimeZone.getDisplayName(ULocale)'
     */
    public void testGetDisplayNameULocale() {
        TimeZone tz = TimeZone.getTimeZone("PST");
        assertEquals("Pacific Standard Time", tz.getDisplayName(ULocale.US));
    }

    /*
     * Test method for 'com.ibm.icu.util.TimeZone.getDisplayName(boolean, int)'
     */
    public void testGetDisplayNameBooleanInt() {
        TimeZone tz = TimeZone.getTimeZone("PST");
        assertEquals("PDT", tz.getDisplayName(true, TimeZone.SHORT));
        assertEquals("Pacific Daylight Time", tz.getDisplayName(true, TimeZone.LONG));
    }

    /*
     * Test method for 'com.ibm.icu.util.TimeZone.getDisplayName(boolean, int, Locale)'
     */
    public void testGetDisplayNameBooleanIntLocale() {
        TimeZone tz = TimeZone.getTimeZone("PST");
        assertEquals("PDT", tz.getDisplayName(true, TimeZone.SHORT, Locale.US));
        assertEquals("Pacific Daylight Time", tz.getDisplayName(true, TimeZone.LONG, Locale.US));
    }

    /*
     * Test method for 'com.ibm.icu.util.TimeZone.getDisplayName(boolean, int, ULocale)'
     */
    public void testGetDisplayNameBooleanIntULocale() {
        TimeZone tz = TimeZone.getTimeZone("PST");
        assertEquals("PDT", tz.getDisplayName(true, TimeZone.SHORT, ULocale.US));
        assertEquals("Pacific Daylight Time", tz.getDisplayName(true, TimeZone.LONG, ULocale.US));
    }

    /*
     * Test method for 'com.ibm.icu.util.TimeZone.getDSTSavings()'
     */
    public void testGetDSTSavings() {
        TimeZone tz = TimeZone.getTimeZone("PST");
        assertEquals(3600000, tz.getDSTSavings());
    }

    /*
     * Test method for 'com.ibm.icu.util.TimeZone.useDaylightTime()'
     */
    public void testUseDaylightTime() {
        TimeZone tz = TimeZone.getTimeZone("PST");
        assertTrue(tz.useDaylightTime());
    }

    /*
     * Test method for 'com.ibm.icu.util.TimeZone.inDaylightTime(Date)'
     */
    public void testInDaylightTime() {
        TimeZone tz = TimeZone.getTimeZone("PST");
        Calendar cal = Calendar.getInstance();
        cal.set(2005, 0, 17);
        Date date = cal.getTime();
        assertFalse(tz.inDaylightTime(date));
        cal.set(2005, 6, 17);
        date = cal.getTime();
        assertTrue(tz.inDaylightTime(date));
    }

    /*
     * Test method for 'com.ibm.icu.util.TimeZone.getTimeZone(String)'
     */
    public void testGetTimeZone() {
        // implicitly tested everywhere
    }

    /*
     * Test method for 'com.ibm.icu.util.TimeZone.getAvailableIDs(int)'
     */
    public void testGetAvailableIDsInt() {
        String[] ids = TimeZone.getAvailableIDs(-28800000);
        assertNotNull(ids);
    }

    /*
     * Test method for 'com.ibm.icu.util.TimeZone.getAvailableIDs()'
     */
    public void testGetAvailableIDs() {
        String[] ids = TimeZone.getAvailableIDs();
        assertNotNull(ids);
    }

    /*
     * Test method for 'com.ibm.icu.util.TimeZone.getDefault()'
     */
    public void testGetDefault() {
        TimeZone tz = TimeZone.getDefault();
        assertNotNull(tz);
    }

    /*
     * Test method for 'com.ibm.icu.util.TimeZone.setDefault(TimeZone)'
     */
    public void testSetDefault() {
        TimeZone tz1 = TimeZone.getDefault();
        String newCode = "PDT".equals(tz1.getID()) ? "CST" : "PDT";
        TimeZone tz2 = TimeZone.getTimeZone(newCode);
        TimeZone.setDefault(tz2);
        TimeZone result = TimeZone.getDefault();
        assertNotEqual(tz1, result);
        assertEquals(tz2, result);
    }

    /*
     * Test method for 'com.ibm.icu.util.TimeZone.hasSameRules(TimeZone)'
     */
    public void testHasSameRules() {
        TimeZone tz1 = TimeZone.getTimeZone("PST");
        TimeZone tz2 = TimeZone.getTimeZone("America/Los_Angeles");
        assertTrue(tz1.hasSameRules(tz2));
    }

    /*
     * Test method for 'com.ibm.icu.util.TimeZone.clone()'
     */
    public void testClone() {
        // tested by testHashCode
    }

    /*
     * Test method for 'com.ibm.icu.util.TimeZone.equals(Object)'
     */
    public void testEqualsObject() {
        // tested by testHashCode
    }
}
