/**
 * Sample JUnit test class for TreeCollection.
 * Performs superficial tests of functionality.
 * @author Dr. Jody Paul
 * @version Fall 2005 - CSI 3050
 */
public class TreeCollectionTest extends junit.framework.TestCase
{

    TreeCollection treeColl;
    TreeCollection treeColl2;
    java.util.ArrayList<Integer> al;

    /**
     * Default constructor for test class TreeCollectionTest
     */
    public TreeCollectionTest()
    {
    }

    /**
     * Sets up the test fixture.
     *
     * Called before every test case method.
     */
    protected void setUp()
    {
        treeColl = new TreeCollection();
        treeColl2 = new TreeCollection();
        treeColl2.add(new Integer(1));
        treeColl2.add(new Integer(2));
        treeColl2.add(new Integer(3));
        treeColl2.add(new Integer(4));
        treeColl2.add(new Integer(5));
        treeColl2.add(new Integer(6));
        treeColl2.add(new Integer(7));
        treeColl2.add(new Integer(8));
        treeColl2.add(new Integer(9));
        treeColl2.add(new Integer(10));
        al = new java.util.ArrayList<Integer>();
        al.add(4);
        al.add(7);
    }

    /**
     * Tears down the test fixture.
     *
     * Called after every test case method.
     */
    protected void tearDown()
    {
    }

    public void testConstructor()
    {
        TreeCollection tc1 = new TreeCollection();
        assertEquals(0, tc1.size());
        assertEquals(true, tc1.add(new Integer(42)));
        TreeCollection tc2 = new TreeCollection(tc1);
        assertEquals(1, tc2.size());
        assertEquals(true, tc2.contains(new Integer(42)));
    }

    public void testAdd()
    {
        assertEquals(0, treeColl.size());
        assertEquals(true, treeColl.add(new Integer(1)));
        assertEquals(1, treeColl.size());
        assertEquals(true, treeColl.add(new Integer(2)));
        assertEquals(2, treeColl.size());
        assertEquals(true, treeColl.add(new Integer(3)));
        assertEquals(3, treeColl.size());
    }

    public void testAddAll()
    {
        assertEquals(0, treeColl.size());
        assertEquals(true, treeColl.addAll(al));
        assertEquals(2, treeColl.size());
        assertEquals(false, treeColl.addAll(al));
        assertEquals(false, treeColl2.addAll(al));
    }

    public void testClear()
    {
        assertEquals(10, treeColl2.size());
        treeColl2.clear();
        assertEquals(0, treeColl2.size());
        treeColl.clear();
        assertEquals(0, treeColl.size());
    }


    public void testContains()
    {
        assertEquals(false, treeColl.contains(new Integer(42)));
        assertEquals(true, treeColl2.contains(new Integer(4)));
        assertEquals(false, treeColl2.contains(new Integer(42)));
    }

    public void testContainsAll()
    {
        assertEquals(true, treeColl2.containsAll(al));
        assertEquals(false, treeColl.containsAll(al));
    }

    public void testEquals()
    {
        assertEquals(true, treeColl.equals(treeColl));
        assertEquals(true, treeColl.equals(new TreeCollection(treeColl)));
    }

    public void testFirst()
    {
        assertEquals(new Integer(1), treeColl2.first());
        try {
            treeColl.first();
            assertTrue(false);
        } catch (Exception e) {
            assertTrue(true);
        }
    }

    public void testGetHeight()
    {
        assertEquals(-1, treeColl.getHeight());
        assertEquals(true, treeColl.add(new Integer(1)));
        assertEquals(0, treeColl.getHeight());
        assertEquals(true, treeColl.add(new Integer(2)));
        assertEquals(1, treeColl.getHeight());
        assertEquals(true, treeColl.add(new Integer(3)));
        assertEquals(1, treeColl.getHeight());
        assertEquals(true, treeColl.add(new Integer(4)));
        assertEquals(2, treeColl.getHeight());
        assertEquals(3, treeColl2.getHeight());
    }

    public void testGetRoot()
    {
        assertNull(treeColl.getRoot());
        assertTrue(treeColl.add(new Integer(1)));
        assertTrue(treeColl.getRoot().equals(new Integer(1)));
        assertTrue(treeColl.add(new Integer(2)));
        assertTrue(treeColl.add(new Integer(3)));
        assertTrue(treeColl.getRoot().equals(new Integer(2)));
        assertTrue( (new Integer(7)).equals(treeColl2.getRoot())
                    ||(new Integer(6)).equals(treeColl2.getRoot())
                    ||(new Integer(5)).equals(treeColl2.getRoot())
                    ||(new Integer(4)).equals(treeColl2.getRoot()));
    }

    public void testHashCode()
    {
        assertFalse(treeColl.hashCode() == treeColl2.hashCode());
        TreeCollection treeColl2a = new TreeCollection(treeColl2);
        assertEquals(treeColl2.hashCode(), treeColl2a.hashCode());
        assertEquals(true, treeColl2.equals(treeColl2a));
        assertEquals(false, (treeColl2 == treeColl2a));
        assertEquals(true, treeColl2a.add(new Integer(11)));
        assertFalse(treeColl2.hashCode() == treeColl2a.hashCode());
    }

    public void testIsEmpty()
    {
        assertEquals(true, treeColl.isEmpty());
        assertEquals(false, treeColl2.isEmpty());
    }

    public void testIterator()
    {
        java.util.Iterator tcIt = treeColl.iterator();
        assertEquals(false, tcIt.hasNext());
        tcIt = treeColl2.iterator();
        assertEquals(true, tcIt.hasNext());
        assertEquals(new Integer(1), tcIt.next());
        assertEquals(true, tcIt.hasNext());
        assertEquals(new Integer(2), tcIt.next());
    }

    public void testLast()
    {
        assertEquals(new Integer(10), treeColl2.last());
        try {
            treeColl.first();
            assertTrue(false);
        } catch (Exception e) {
            assertTrue(true);
        }
    }

    public void testRetainAll()
    {
        assertEquals(true, treeColl2.retainAll(al));
        assertEquals(false,treeColl2.retainAll(al));
        assertEquals(2, treeColl2.size());
    }

    public void testRemove()
    {
        assertEquals(true, treeColl2.contains(new Integer(5)));
        assertEquals(true, treeColl2.remove(new Integer(5)));
        assertEquals(false, treeColl2.contains(new Integer(5)));
        assertEquals(false, treeColl2.remove(new Integer(5)));
    }

    public void testRemoveAll()
    {
        assertEquals(true, treeColl2.containsAll(al));
        assertEquals(true, treeColl2.removeAll(al));
        assertEquals(false, treeColl2.containsAll(al));
        assertEquals(false, treeColl2.removeAll(al));
        assertEquals(false, treeColl2.contains(new Integer(4)));
        assertEquals(true, treeColl2.contains(new Integer(1)));
        assertEquals(8, treeColl2.size());
    }

    public void testSize()
    {
        assertEquals(0, treeColl.size());
        assertEquals(10, treeColl2.size());
        assertEquals(true, treeColl.addAll(al));
        assertEquals(2, treeColl.size());
    }

    public void testToArray()
    {
        java.lang.Object[] tcArray = treeColl2.toArray();
        assertEquals(10, tcArray.length);
        assertEquals(true, tcArray[0].equals(treeColl2.first()));
        assertEquals(true, treeColl.add(new Integer(42)));
        treeColl.toArray(tcArray);
        assertEquals(true, tcArray[0].equals(treeColl.first()));
        assertEquals(true, tcArray[0].equals(new Integer(42)));
    }

    public void testToList()
    {
        java.util.List tcList = treeColl.toList();
        assertEquals(0, tcList.size());
        tcList = treeColl2.toList();
        assertEquals(10, tcList.size());
        assertEquals(treeColl2.first(), tcList.get(0));
    }
}

