/**
 * Test class for Session.
 *
 * @author  Dr. Jody Paul
 * @version CS1 Spring 2006
 */
public class SessionTest extends junit.framework.TestCase {
    
    /** Test constructors. */
    public void testConstruction() {
        Session session1 = new Session();
        Session session2 = new Session(null);
        Session session3 = new Session(null, null, null);
        Session session4 = new Session(new Time(10));
        Session session5 = new Session(new Time(10),
                                       new Room("SI", "124A"),
                                       new Time());
    }

    /** Test getDuration() and setDuration(time t). */
    public void testDurationAttribute() {
        Session session1 = new Session();
        assertEquals(Session.DEFAULT_DURATION,
                     session1.getDuration().getMinutes());
        session1.setDuration(new Time(42));
        assertEquals(42, session1.getDuration().getMinutes());
        Session session2 = new Session(new Time(43));
        assertEquals(43, session2.getDuration().getMinutes());
    }

    /** Test getStartTime() and setStartTime(). */
    public void testStartTimeAttribute() {
        Session session1 = new Session();
        assertEquals(null, session1.getStartTime());
        session1.setStartTime(new Time(20));
        assertEquals(20, session1.getStartTime().getMinutes());
        Session session2 = new Session(new Time(10),
                                       new Room("SI", "222"),
                                       new Time(22));
        assertEquals(22, session2.getStartTime().getMinutes());
    }

    /** Test getNumberOfSubjects(). */
    public void testGetNumberOfSubjects() {
        Session session1 = new Session();
        assertEquals(0, session1.getNumberOfSubjects());
        Student student1 = new Student("Ima Student", 987654321);
        session1.addSubject(student1);
        assertEquals(1, session1.getNumberOfSubjects());
        Student student2 = new Student("Another Student", 123456789);
        session1.addSubject(student2);
        assertEquals(2, session1.getNumberOfSubjects());
        java.util.ArrayList subjects1 = session1.getSubjects();
        assertEquals(2, subjects1.size());
        assertSame(student1, subjects1.get(0));
        assertSame(student2, subjects1.get(1));
    }

    /** Test getRoom() and setRoom(Room r). */
    public void testRoomAttribute() {
        Room roomA222 = new Room("Bldg A", "222");
        Session session1 = new Session();
        assertNull(session1.getRoom());
        session1.setRoom(roomA222);
        assertSame(roomA222, session1.getRoom());
    }

    /**
     * Test getSubject(), addSubject(Student s),
     * getSubjects() and setSubjects(ArrayList<Student> als).
     */
    public void testSubjectsAttribute() {
        Student student1 = new Student("Ima Student", 987654321);
        Student student2 = new Student("Another Student", 123456789);
        Session session1 = new Session();
        assertEquals(0, session1.getSubjects().size());
        session1.addSubject(student1);
        assertEquals(1, session1.getSubjects().size());
        assertEquals(student1, session1.getSubject(0));
        session1.addSubject(student2);
        assertEquals(2, session1.getSubjects().size());
        assertEquals(student2, session1.getSubject(1));
        java.util.ArrayList<Student> als1 = new java.util.ArrayList<Student>();
        session1.setSubjects(als1);
        assertEquals(0, session1.getSubjects().size());
        java.util.ArrayList<Student> als2 = new java.util.ArrayList<Student>();
        als2.add(student2);
        als2.add(student1);
        session1.setSubjects(als2);
        assertEquals(2, session1.getSubjects().size());
        assertEquals(student2, session1.getSubject(0));
        assertEquals(student1, session1.getSubject(1));
        java.util.ArrayList<Student> als3 = session1.getSubjects();
        assertEquals(student2, als3.get(0));
        assertEquals(student1, als3.get(1));
    }
}
