/*
 *******************************************************************************
 * Copyright (C) 2006, 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();
		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("Calendar", cal.getDisplayName(Locale.US));
	}

	/*
	 * Test method for 'com.ibm.icu.util.Calendar.getDisplayName(ULocale)'
	 */
	public void testGetDisplayNameULocale() {
		Calendar cal = Calendar.getInstance();
		assertEquals("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((Object)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 (IllegalArgumentException 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());
	}
}
