/*
 *******************************************************************************
 * 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.text.DateFormat;
import com.ibm.icu.util.Calendar;
import com.ibm.icu.util.TimeZone;
import com.ibm.icu.util.ULocale;

public class CalendarTest extends ICUTestCase {

    /*
     * Test method for 'com.ibm.icu.util.Calendar.hashCode()'
     */
    public void testHashCode() {
        Calendar cal1 = Calendar.getInstance();
        Calendar cal2 = Calendar.getInstance();
        Calendar cal3 = Calendar.getInstance();

        long t = System.currentTimeMillis();
        cal1.setTimeInMillis(t);
        cal2.setTimeInMillis(t);
        cal3.setTimeInMillis(t);

        cal3.setMinimalDaysInFirstWeek(cal3.getMinimalDaysInFirstWeek()+1);
        testEHCS(cal1, cal2, cal3);
    }

    /*
     * Test method for 'com.ibm.icu.util.Calendar.Calendar(Calendar)'
     */
    public void testCalendar() {
        // tested implicitly everywhere
    }

    /*
     * Test method for 'com.ibm.icu.util.Calendar.getInstance()'
     */
    public void testGetInstance() {
        // tested by testEHCS
    }

    /*
     * Test method for 'com.ibm.icu.util.Calendar.getInstance(TimeZone)'
     */
    public void testGetInstanceTimeZone() {
        TimeZone tz = TimeZone.getTimeZone("America/Los_Angeles");
        Calendar cal = Calendar.getInstance(tz);
        assertNotNull(cal);
        assertNotNull(cal.getTime());
        assertEquals(tz, cal.getTimeZone());
    }

    /*
     * Test method for 'com.ibm.icu.util.Calendar.getInstance(Locale)'
     */
    public void testGetInstanceLocale() {
        Calendar cal = Calendar.getInstance(Locale.US);
        assertNotNull(cal);
        assertNotNull(cal.getTime());
    }

    /*
     * Test method for 'com.ibm.icu.util.Calendar.getInstance(ULocale)'
     */
    public void testGetInstanceULocale() {
        Calendar cal = Calendar.getInstance(ULocale.US);
        assertNotNull(cal);
        assertNotNull(cal.getTime());
    }

    /*
     * Test method for 'com.ibm.icu.util.Calendar.getInstance(TimeZone, Locale)'
     */
    public void testGetInstanceTimeZoneLocale() {
        TimeZone tz = TimeZone.getTimeZone("America/New_York");
        Calendar cal = Calendar.getInstance(tz, Locale.US);
        assertNotNull(cal);
        assertNotNull(cal.getTime());
    }

    /*
     * Test method for 'com.ibm.icu.util.Calendar.getInstance(TimeZone, ULocale)'
     */
    public void testGetInstanceTimeZoneULocale() {
        TimeZone tz = TimeZone.getTimeZone("America/New_York");
        Calendar cal = Calendar.getInstance(tz, ULocale.US);
        assertNotNull(cal);
        assertNotNull(cal.getTime());
    }

    /*
     * Test method for 'com.ibm.icu.util.Calendar.getAvailableLocales()'
     */
    public void testGetAvailableLocales() {
        assertNotNull(Calendar.getAvailableLocales());
    }

    /*
     * Test method for 'com.ibm.icu.util.Calendar.getAvailableULocales()'
     */
    public void testGetAvailableULocales() {
        assertNotNull(Calendar.getAvailableULocales());
    }

    /*
     * Test method for 'com.ibm.icu.util.Calendar.getTime()'
     */
    public void testGetTime() {
        Calendar cal = Calendar.getInstance();
        assertNotNull(cal.getTime());
    }

    /*
     * Test method for 'com.ibm.icu.util.Calendar.setTime(Date)'
     */
    public void testSetTime() {
        Calendar cal = Calendar.getInstance();
        cal.clear();
        cal.set(2006, 0, 20, 9, 30, 0);
        Date date = cal.getTime();
        cal = Calendar.getInstance();
        cal.setTime(date);
        assertEquals(date, cal.getTime());
    }

    /*
     * Test method for 'com.ibm.icu.util.Calendar.getTimeInMillis()'
     */
    public void testGetTimeInMillis() {
        Calendar cal = Calendar.getInstance();
        assertTrue(0 != cal.getTimeInMillis());
    }

    /*
     * Test method for 'com.ibm.icu.util.Calendar.setTimeInMillis(long)'
     */
    public void testSetTimeInMillis() {
        Calendar cal = Calendar.getInstance();
        cal.clear();
        cal.set(2006, 0, 20, 9, 30, 0);
        long millis = cal.getTimeInMillis();
        Date date = cal.getTime();
        
        cal = Calendar.getInstance();
        cal.setTimeInMillis(millis);
        
        assertEquals(date, cal.getTime());
    }

    /*
     * Test method for 'com.ibm.icu.util.Calendar.get(int)'
     */
    public void testGet() {
        Calendar cal = Calendar.getInstance();
        cal.clear();
        cal.set(2006, 0, 20, 9, 30, 0);
        assertEquals(0, cal.get(Calendar.MONTH));
        assertEquals(20, cal.get(Calendar.DAY_OF_MONTH));
        assertEquals(30, cal.get(Calendar.MINUTE));
    }

    /*
     * Test method for 'com.ibm.icu.util.Calendar.set(int, int)'
     */
    public void testSetIntInt() {
        Calendar cal = Calendar.getInstance();
        cal.set(Calendar.YEAR, 1977);
        assertEquals(1977, cal.get(Calendar.YEAR));
    }

    /*
     * Test method for 'com.ibm.icu.util.Calendar.set(int, int, int)'
     */
    public void testSetIntIntInt() {
        Calendar cal = Calendar.getInstance();
        cal.set(1997, 9, 15);
        assertEquals(15, cal.get(Calendar.DATE));
    }

    /*
     * Test method for 'com.ibm.icu.util.Calendar.set(int, int, int, int, int)'
     */
    public void testSetIntIntIntIntInt() {
        Calendar cal = Calendar.getInstance();
        cal.set(1997, 9, 15, 14, 25);
        assertEquals(25, cal.get(Calendar.MINUTE));
    }

    /*
     * Test method for 'com.ibm.icu.util.Calendar.set(int, int, int, int, int, int)'
     */
    public void testSetIntIntIntIntIntInt() {
        Calendar cal = Calendar.getInstance();
        cal.set(1997, 9, 15, 14, 25, 51);
        assertEquals(51, cal.get(Calendar.SECOND));
    }

    /*
     * Test method for 'com.ibm.icu.util.Calendar.clear()'
     */
    public void testClear() {
        Calendar cal = Calendar.getInstance();
        cal.set(1997, 9, 15, 14, 25, 51);
        cal.clear();
        assertEquals(0, cal.get(Calendar.MONTH));
    }

    /*
     * Test method for 'com.ibm.icu.util.Calendar.clear(int)'
     */
    public void testClearInt() {
        Calendar cal = Calendar.getInstance();
        cal.set(1997, 9, 15, 14, 25, 51);
        assertTrue(cal.isSet(Calendar.DAY_OF_MONTH));
        cal.clear(Calendar.DAY_OF_MONTH);
        assertFalse(cal.isSet(Calendar.DAY_OF_MONTH));
    }

    /*
     * Test method for 'com.ibm.icu.util.Calendar.isSet(int)'
     */
    public void testIsSet() {
        // see testClearInt
    }

    /*
     * Test method for 'com.ibm.icu.util.Calendar.equals(Object)'
     */
    public void testEqualsObject() {
        // tested by testHashCode
    }

    /*
     * Test method for 'com.ibm.icu.util.Calendar.isEquivalentTo(Calendar)'
     */
    public void testIsEquivalentTo() {
        Calendar cal = Calendar.getInstance();
        Calendar cal2 = Calendar.getInstance();
        cal2.set(1994, 6, 21, 8, 7);
        assertTrue(cal.isEquivalentTo(cal2));
        cal.setTimeZone(TimeZone.getTimeZone("CST"));
        cal2.setTimeZone(TimeZone.getTimeZone("PDT"));
        assertFalse(cal.isEquivalentTo(cal2));
    }

    /*
     * Test method for 'com.ibm.icu.util.Calendar.before(Object)'
     */
    public void testBefore() {
        Calendar cal = Calendar.getInstance();
        cal.set(Calendar.YEAR, 1990);
        assertTrue(cal.before(new Date()));
        assertTrue(cal.before(Calendar.getInstance()));
    }

    /*
     * Test method for 'com.ibm.icu.util.Calendar.after(Object)'
     */
    public void testAfter() {
        Calendar cal = Calendar.getInstance();
        cal.set(Calendar.YEAR, 3058);
        assertTrue(cal.after(new Date()));
        assertTrue(cal.after(Calendar.getInstance()));
    }

    /*
     * Test method for 'com.ibm.icu.util.Calendar.getActualMaximum(int)'
     */
    public void testGetActualMaximum() {
        Calendar cal = Calendar.getInstance(Locale.US);
        assertEquals(11, cal.getActualMaximum(Calendar.MONTH));
    }

    /*
     * Test method for 'com.ibm.icu.util.Calendar.getActualMinimum(int)'
     */
    public void testGetActualMinimum() {
        Calendar cal = Calendar.getInstance(Locale.US);
        assertEquals(0, cal.getActualMinimum(Calendar.MONTH));
    }

    /*
     * Test method for 'com.ibm.icu.util.Calendar.roll(int, boolean)'
     */
    public void testRollIntBoolean() {
        Calendar cal = Calendar.getInstance(Locale.US);
        cal.set(1997, 1, 27);
        cal.roll(Calendar.DATE, true);
        assertEquals(28, cal.get(Calendar.DATE));
    }

    /*
     * Test method for 'com.ibm.icu.util.Calendar.roll(int, int)'
     */
    public void testRollIntInt() {
        Calendar cal = Calendar.getInstance(Locale.US);
        cal.set(1997, 1, 27);
        cal.roll(Calendar.DATE, 3);
        assertEquals(2, cal.get(Calendar.DATE));
    }

    /*
     * Test method for 'com.ibm.icu.util.Calendar.add(int, int)'
     */
    public void testAdd() {
        Calendar cal = Calendar.getInstance(Locale.US);
        cal.set(1997, 1, 27);
        cal.add(Calendar.DATE, 3);
        assertEquals(2, cal.get(Calendar.DATE));
        assertEquals(2, cal.get(Calendar.MONTH));
    }

    /*
     * Test method for 'com.ibm.icu.util.Calendar.getDisplayName(Locale)'
     */
    public void testGetDisplayNameLocale() {
        Calendar cal = Calendar.getInstance();
        assertEquals("Gregorian Calendar", cal.getDisplayName(Locale.US));
    }

    /*
     * Test method for 'com.ibm.icu.util.Calendar.getDisplayName(ULocale)'
     */
    public void testGetDisplayNameULocale() {
        Calendar cal = Calendar.getInstance();
        assertEquals("Gregorian Calendar", cal.getDisplayName(ULocale.US));
    }

    /*
     * Test method for 'com.ibm.icu.util.Calendar.compareTo(Calendar)'
     */
    public void testCompareToCalendar() {
        Calendar cal = Calendar.getInstance();
        cal.set(Calendar.YEAR, 1990);
        assertTrue(0 > cal.compareTo(Calendar.getInstance()));
    }

    /*
     * Test method for 'com.ibm.icu.util.Calendar.compareTo(Object)'
     */
    public void testCompareToObject() {
        Calendar cal = Calendar.getInstance();
        cal.set(Calendar.YEAR, 1990);
        assertTrue(0 > cal.compareTo(Calendar.getInstance()));
    }

    /*
     * Test method for 'com.ibm.icu.util.Calendar.getDateTimeFormat(int, int, Locale)'
     */
    public void testGetDateTimeFormatIntIntLocale() {
        Calendar cal = Calendar.getInstance();
        cal.set(1990, 8, 16, 20, 3);
        DateFormat df = cal.getDateTimeFormat(DateFormat.LONG, DateFormat.SHORT, Locale.US);
        assertEquals("September 16, 1990 8:03 PM", df.format(cal));
    }

    /*
     * Test method for 'com.ibm.icu.util.Calendar.getDateTimeFormat(int, int, ULocale)'
     */
    public void testGetDateTimeFormatIntIntULocale() {
        Calendar cal = Calendar.getInstance();
        cal.set(1990, 8, 16, 20, 3);
        DateFormat df = cal.getDateTimeFormat(DateFormat.LONG, DateFormat.SHORT, ULocale.US);
        assertEquals("September 16, 1990 8:03 PM", df.format(cal));
    }

    /*
     * Test method for 'com.ibm.icu.util.Calendar.fieldDifference(Date, int)'
     */
    public void testFieldDifference() {
        Calendar cal = Calendar.getInstance();
        cal.set(Calendar.DAY_OF_MONTH, 0);
        Date date = cal.getTime();
        cal.add(Calendar.DAY_OF_MONTH, 5);
        assertEquals(-5, cal.fieldDifference(date, Calendar.DAY_OF_MONTH));
    }

    /*
     * Test method for 'com.ibm.icu.util.Calendar.getTimeZone()'
     */
    public void testGetTimeZone() {
        Calendar cal = Calendar.getInstance();
        assertNotNull(cal.getTimeZone());
    }
    
    /*
     * Test method for 'com.ibm.icu.util.Calendar.setTimeZone(TimeZone)'
     */
    public void testSetTimeZone() {
        Calendar cal = Calendar.getInstance();
        TimeZone value1 = cal.getTimeZone();
        String tzn = "PDT".equals(value1.getID()) ? "CST" : "PDT";
        TimeZone value2 = TimeZone.getTimeZone(tzn);
        cal.setTimeZone(value2);
        TimeZone result = cal.getTimeZone();
        assertNotEqual(value1, result);
        assertEquals(value2, result);
    }

    /*
     * Test method for 'com.ibm.icu.util.Calendar.setLenient(boolean)'
     */
    public void testSetLenient() {
        Calendar cal = Calendar.getInstance();
        boolean lenient = cal.isLenient();
        cal.setLenient(!lenient);
        assertFalse(lenient == cal.isLenient());
        
        // not testing if it has the expected effect
    }

    /*
     * Test method for 'com.ibm.icu.util.Calendar.isLenient()'
     */
    public void testIsLenient() {
        // tested by testSetLenient
    }

    /*
     * Test method for 'com.ibm.icu.util.Calendar.setFirstDayOfWeek(int)'
     */
    public void testSetFirstDayOfWeek() {
        Calendar cal = Calendar.getInstance();
        int firstDay = cal.getFirstDayOfWeek();
        cal.setFirstDayOfWeek(firstDay+1);
        assertEquals(firstDay+1, cal.getFirstDayOfWeek());

        // don't test functionality
    }

    /*
     * Test method for 'com.ibm.icu.util.Calendar.getFirstDayOfWeek()'
     */
    public void testGetFirstDayOfWeek() {
        // tested by testSetFirstDayOfWeek
    }

    /*
     * Test method for 'com.ibm.icu.util.Calendar.setMinimalDaysInFirstWeek(int)'
     */
    public void testSetMinimalDaysInFirstWeek() {
        Calendar cal = Calendar.getInstance();
        int firstDay = cal.getMinimalDaysInFirstWeek();
        cal.setMinimalDaysInFirstWeek(firstDay+1);
        assertEquals(firstDay+1, cal.getMinimalDaysInFirstWeek());

        // don't test functionality
    }

    /*
     * Test method for 'com.ibm.icu.util.Calendar.getMinimalDaysInFirstWeek()'
     */
    public void testGetMinimalDaysInFirstWeek() {
        // tested by testSetMinimalDaysInFirstWeek
    }

    /*
     * Test method for 'com.ibm.icu.util.Calendar.getMinimum(int)'
     */
    public void testGetMinimum() {
        Calendar cal = Calendar.getInstance();
        assertEquals(1, cal.getMinimum(Calendar.DAY_OF_WEEK));
    }

    /*
     * Test method for 'com.ibm.icu.util.Calendar.getMaximum(int)'
     */
    public void testGetMaximum() {
        Calendar cal = Calendar.getInstance();
        assertEquals(7, cal.getMaximum(Calendar.DAY_OF_WEEK));
    }

    /*
     * Test method for 'com.ibm.icu.util.Calendar.getGreatestMinimum(int)'
     */
    public void testGetGreatestMinimum() {
        Calendar cal = Calendar.getInstance();
        assertEquals(1, cal.getGreatestMinimum(Calendar.DATE));
    }

    /*
     * Test method for 'com.ibm.icu.util.Calendar.getLeastMaximum(int)'
     */
    public void testGetLeastMaximum() {
        Calendar cal = Calendar.getInstance();
        assertEquals(28, cal.getLeastMaximum(Calendar.DATE));
    }

    /*
     * Test method for 'com.ibm.icu.util.Calendar.getDayOfWeekType(int)'
     */
    public void testGetDayOfWeekType() {
        Calendar cal = Calendar.getInstance(Locale.US);
        assertEquals(Calendar.WEEKDAY, cal.getDayOfWeekType(Calendar.FRIDAY));
        assertEquals(Calendar.WEEKEND, cal.getDayOfWeekType(Calendar.SATURDAY));
    }

    /*
     * Test method for 'com.ibm.icu.util.Calendar.getWeekendTransition(int)'
     */
    public void testGetWeekendTransition() {
        Calendar cal = Calendar.getInstance(Locale.US);
        try {
            cal.getWeekendTransition(Calendar.WEEKEND_ONSET);
            fail("expected IllegalArgumentException from getWeekendTransition");
        }
        catch (UnsupportedOperationException e) {
            // ok
        }
    }

    /*
     * Test method for 'com.ibm.icu.util.Calendar.isWeekend(Date)'
     */
    public void testIsWeekendDate() {
        Calendar cal = Calendar.getInstance(Locale.US);
        cal.set(Calendar.DAY_OF_WEEK, Calendar.SATURDAY);
        assertTrue(cal.isWeekend(cal.getTime()));
        cal.set(Calendar.DAY_OF_WEEK, Calendar.WEDNESDAY);
        assertFalse(cal.isWeekend(cal.getTime()));
    }

    /*
     * Test method for 'com.ibm.icu.util.Calendar.isWeekend()'
     */
    public void testIsWeekend() {
        Calendar cal = Calendar.getInstance(Locale.US);
        cal.set(Calendar.DAY_OF_WEEK, Calendar.SATURDAY);
        assertTrue(cal.isWeekend());
        cal.set(Calendar.DAY_OF_WEEK, Calendar.WEDNESDAY);
        assertFalse(cal.isWeekend());
    }

    /*
     * Test method for 'com.ibm.icu.util.Calendar.clone()'
     */
    public void testClone() {
        // tested by testHashCode
    }

    /*
     * Test method for 'com.ibm.icu.util.Calendar.toString()'
     */
    public void testToString() {
        Calendar cal = Calendar.getInstance();
        assertNotNull(cal.toString());
    }

    /*
     * Test method for 'com.ibm.icu.util.Calendar.getType()'
     */
    public void testGetType() {
        Calendar cal = Calendar.getInstance(Locale.US);
        assertEquals("gregorian", cal.getType());
    }
}
