import junit.framework.TestCase;

/*
 * This is file DatesTest.java in project CIT591Dates, created on Sep 14, 2007
 */

public class DatesTest extends TestCase {
    Dates d;
    
    public DatesTest(String name) {
        super(name);
    }

    protected void setUp() throws Exception {
        super.setUp();
        d = new Dates();
    }
    
    public final void testFindDayOfWeekForJanuaryFebruaryMarch() {
        assertEquals("Monday", d.findDayOfWeek(2007, 1, 1));
        assertEquals("Thursday", d.findDayOfWeek(2007, 2, 1));
        assertEquals("Thursday", d.findDayOfWeek(2007, 3, 1));
        
        assertEquals("Saturday", d.findDayOfWeek(2000, 1, 1));
        assertEquals("Tuesday", d.findDayOfWeek(2000, 2, 1));
        assertEquals("Wednesday", d.findDayOfWeek(2000, 3, 1));

        assertEquals("Wednesday", d.findDayOfWeek(2003, 1, 1));
        assertEquals("Saturday", d.findDayOfWeek(2003, 2, 1));
        assertEquals("Saturday", d.findDayOfWeek(2003, 3, 1));
        
        assertEquals("Thursday", d.findDayOfWeek(2004, 1, 1));
        assertEquals("Sunday", d.findDayOfWeek(2004, 2, 1));
        assertEquals("Monday", d.findDayOfWeek(2004, 3, 1));
        
        assertEquals("Monday", d.findDayOfWeek(1900, 1, 1));
        assertEquals("Thursday", d.findDayOfWeek(1900, 2, 1));
        assertEquals("Thursday", d.findDayOfWeek(1900, 3, 1));
    }
    
    public void testDayOfWeekForEveryMonthInNonLeapYear() {
        assertEquals("Monday", d.findDayOfWeek(2007, 1, 1));
        assertEquals("Thursday", d.findDayOfWeek(2007, 2, 1));
        assertEquals("Thursday", d.findDayOfWeek(2007, 3, 1));
        assertEquals("Sunday", d.findDayOfWeek(2007, 4, 1));
        assertEquals("Tuesday", d.findDayOfWeek(2007, 5, 1));
        assertEquals("Friday", d.findDayOfWeek(2007, 6, 1));
        assertEquals("Sunday", d.findDayOfWeek(2007, 7, 1));
        assertEquals("Wednesday", d.findDayOfWeek(2007, 8, 1));
        assertEquals("Saturday", d.findDayOfWeek(2007, 9, 1));
        assertEquals("Monday", d.findDayOfWeek(2007, 10, 1));
        assertEquals("Thursday", d.findDayOfWeek(2007, 11, 1));
        assertEquals("Saturday", d.findDayOfWeek(2007, 12, 1));
    }
    
    public void testDayOfWeekForEveryMonthInLeapYear() {
        assertEquals("Tuesday", d.findDayOfWeek(2008, 1, 1));
        assertEquals("Friday", d.findDayOfWeek(2008, 2, 1));
        assertEquals("Saturday", d.findDayOfWeek(2008, 3, 1));
        assertEquals("Tuesday", d.findDayOfWeek(2008, 4, 1));
        assertEquals("Thursday", d.findDayOfWeek(2008, 5, 1));
        assertEquals("Sunday", d.findDayOfWeek(2008, 6, 1));
        assertEquals("Tuesday", d.findDayOfWeek(2008, 7, 1));
        assertEquals("Friday", d.findDayOfWeek(2008, 8, 1));
        assertEquals("Monday", d.findDayOfWeek(2008, 9, 1));
        assertEquals("Wednesday", d.findDayOfWeek(2008, 10, 1));
        assertEquals("Saturday", d.findDayOfWeek(2008, 11, 1));
        assertEquals("Monday", d.findDayOfWeek(2008, 12, 1));
    }

    public void testFindDayOfWeekForEveryWeekday() {
        assertEquals("Sunday", d.findDayOfWeek(2007, 9, 9));
        assertEquals("Monday", d.findDayOfWeek(2007, 9, 10));
        assertEquals("Tuesday", d.findDayOfWeek(2007, 9, 11));
        assertEquals("Wednesday", d.findDayOfWeek(2007, 9, 12));
        assertEquals("Thursday", d.findDayOfWeek(2007, 9, 13));
        assertEquals("Friday", d.findDayOfWeek(2007, 9, 14));
        assertEquals("Saturday", d.findDayOfWeek(2007, 9, 15));
    }

    public void testFindDaysApartWithinNonLeapYear() {
        assertEquals(0, d.findDaysApart(2007, 9, 18, 2007, 9, 18));
        assertEquals(1, d.findDaysApart(2007, 9, 18, 2007, 9, 19));
        assertEquals(364, d.findDaysApart(2007, 1, 1, 2007, 12, 31));
    }
    
    public void testFindDaysApartAcrossYearBoundaries() {
        assertEquals(365, d.findDaysApart(1900, 1, 1, 1901, 1, 1));
        assertEquals(365, d.findDaysApart(1999, 1, 1, 2000, 1, 1));
        assertEquals(366, d.findDaysApart(2000, 1, 1, 2001, 1, 1));
        assertEquals(366, d.findDaysApart(2004, 1, 1, 2005, 1, 1));
    }
    
    public void testFindDaysApartFebruaryToMarch() {
        assertEquals(28, d.findDaysApart(1900, 2, 1, 1900, 3, 1));
        assertEquals(28, d.findDaysApart(1999, 2, 1, 1999, 3, 1));
        assertEquals(29, d.findDaysApart(2000, 2, 1, 2000, 3, 1));
        assertEquals(29, d.findDaysApart(2004, 2, 1, 2004, 3, 1));
        
        assertEquals(1, d.findDaysApart(2007, 12, 31, 2008, 1, 1));
        assertEquals(3653, d.findDaysApart(2000, 1, 1, 2010, 1, 1));
    }

    /**
     *  Since the assignment did not clearly specify what to do in
     * the case of the first date being later than the second date,
     * we should accept both positive and negative numbers.
     */
    public void testFindDaysApartForDatesOutOfOrder() {
        assertEquals(1, Math.abs(d.findDaysApart(2007, 9, 19, 2007, 9, 18)));
        assertEquals(3653, Math.abs(d.findDaysApart(2010, 1, 1, 2000, 1, 1)));
    }

        // Used in my testing, but students are not required to have this method
//    public void testIsLeapYear() {
//        assertFalse(d.isLeapYear(1900));
//        assertFalse(d.isLeapYear(1901));
//        assertTrue(d.isLeapYear(2000));
//        assertFalse(d.isLeapYear(2001));
//        assertFalse(d.isLeapYear(2002));
//        assertFalse(d.isLeapYear(2003));
//        assertTrue(d.isLeapYear(2004));
//    }
}
