/**
 * The test class BalancedBSTTest.
 * @author  Dr. Jody Paul
 * @version Fall 2005 - September 7
 */
public class BalancedBSTTest extends junit.framework.TestCase
{
    BTNode node3, node4, node5, node6, node7, node8, node9;
    BalancedBST balanced1;
    
    /** Default constructor for test class BalancedBSTTest */
    public BalancedBSTTest() { }

    /**
     * Sets up the test fixture.
     * Called before every test case method.
     */
    protected void setUp()
    {
        node3 = new BTNode(null, null, null, new Integer(3));
        node4 = new BTNode(null, null, null, new Integer(4));
        node5 = new BTNode(null, null, null, new Integer(5));
        node6 = new BTNode(null, null, null, new Integer(6));
        node7 = new BTNode(null, null, null, new Integer(7));
        node8 = new BTNode(null, null, null, new Integer(8));
        node9 = new BTNode(null, null, null, new Integer(9));

        balanced1 = new BalancedBST();
    }

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

    public void testAdd()
    {
        assertEquals(0, balanced1.size());
        assertTrue(balanced1.add(node6));
        assertSame(node6, balanced1.getRoot());
        assertEquals(1, balanced1.size());
        assertTrue(node6.getKey().equals(new Integer(6)));
        assertTrue(balanced1.add(node3));
        assertEquals(2, balanced1.size());
        assertSame(node6, balanced1.getRoot());
        assertSame(node3, balanced1.getRoot().getLeftChild());
        assertTrue(balanced1.add(new BTNode(null, null, null, new Integer(6))));
        assertEquals(2, balanced1.size());
        assertTrue(balanced1.add(node9));
        assertEquals(3, balanced1.size());
        assertSame(balanced1.getRoot().getRightChild(), node9);
    }

    public void testIsEmpty()
    {
        assertTrue(balanced1.isEmpty());
        assertTrue(balanced1.add(node6));
        assertFalse(balanced1.isEmpty());
    }

    public void testGetRoot()
    {
        assertNull(balanced1.getRoot());
        assertTrue(balanced1.add(node6));
        assertNotNull(balanced1.getRoot());
        assertSame(node6, balanced1.getRoot());
    }

	public void testFirst()
	{
		assertNull(balanced1.first());
		assertEquals(true, balanced1.add(node7));
		assertEquals(node7, balanced1.first());
		assertEquals(true, balanced1.add(node4));
		assertSame(node4, balanced1.first());
		assertEquals(true, balanced1.add(node8));
		assertSame(node4, balanced1.first());
		assertEquals(true, balanced1.add(node3));
		assertSame(node3, balanced1.first());
	}
	
	public void testSize()
    {
        assertEquals(0, balanced1.size());
        assertTrue(balanced1.add(node6));
        assertEquals(1, balanced1.size());
        assertTrue(balanced1.add(node3));
        assertEquals(2, balanced1.size());
        assertTrue(balanced1.add(node9));
        assertEquals(3, balanced1.size());
    }

    public void testContains()
    {
        assertFalse(balanced1.contains(null));
        assertFalse(balanced1.contains(node6));
        assertTrue(balanced1.add(node6));
        assertTrue(balanced1.contains(node6));
        assertFalse(balanced1.contains(node3));
        assertTrue(balanced1.add(node9));
        assertTrue(balanced1.contains(node9));
    }

    public void testToList()
    {
        assertNull(balanced1.toList());
        assertTrue(balanced1.add(node6));
        java.util.ArrayList arrayList1 = (java.util.ArrayList)balanced1.toList();
        assertNotNull(arrayList1);
        assertEquals(1, arrayList1.size());
        assertEquals(node6, arrayList1.get(0));
        assertTrue(balanced1.add(node3));
        assertTrue(balanced1.add(node9));
        java.util.ArrayList arrayList2 = (java.util.ArrayList)balanced1.toList();
        assertNotNull(arrayList2);
        assertEquals(3, arrayList2.size());
        assertSame(node3, arrayList2.get(0));
        assertSame(node6, arrayList2.get(1));
        assertSame(node9, arrayList2.get(2));
    }

    public void testToArray()
    {
        BTNode[] nodeArray1 = (BTNode[])balanced1.toArray();
        assertNotNull(nodeArray1);
        assertEquals(nodeArray1.length, 0); 
        assertTrue(balanced1.add(node6));
        BTNode[] nodeArray2 = (BTNode[])balanced1.toArray();
        assertEquals(nodeArray2.length, 1);
        assertTrue(nodeArray2[0].equals(node6));
        assertTrue(balanced1.add(node3));
        assertTrue(balanced1.add(node9));
        BTNode[] nodeArray3 = (BTNode[])balanced1.toArray();
        assertEquals(nodeArray3.length, 3);
        assertTrue(nodeArray3[0].equals(node3));
        assertTrue(nodeArray3[1].equals(node6));
        assertTrue(nodeArray3[2].equals(node9));
    }

    public void testIterator()
    {
        java.util.Iterator iterator1 = (java.util.Iterator)balanced1.iterator();
        assertFalse(iterator1.hasNext());
        assertTrue(balanced1.add(node6));
        java.util.Iterator iterator2 = (java.util.Iterator)balanced1.iterator();
        assertTrue(iterator2.hasNext());
        assertTrue(node6.equals((BTNode)iterator2.next()));
        assertFalse(iterator2.hasNext());       
        assertTrue(balanced1.add(node3));
        java.util.Iterator iterator3 = (java.util.Iterator)balanced1.iterator();
        assertTrue(iterator3.hasNext());
        assertTrue(node3.equals((BTNode)iterator3.next()));
        assertTrue(iterator3.hasNext());        
        assertTrue(node6.equals((BTNode)iterator3.next()));
        assertFalse(iterator3.hasNext());       
    }

    public void testRemove()
    {
        assertTrue(balanced1.remove(node6));
        assertTrue(balanced1.add(node6));
        assertTrue(balanced1.contains(node6));
        assertTrue(balanced1.add(node3));
        assertTrue(balanced1.contains(node3));
        assertTrue(balanced1.add(node9));
        assertTrue(balanced1.remove(node3));
        assertFalse(balanced1.contains(node3));
        assertTrue(balanced1.remove(node6));
        assertFalse(balanced1.contains(node6));
        assertTrue(balanced1.remove(node9));
        assertTrue(balanced1.isEmpty());
    }


    public void testBalance()
    {
        assertTrue(balanced1.add(node9));
        assertTrue(balanced1.add(node6));
        assertTrue(balanced1.add(node3));
        assertSame(node6, balanced1.getRoot());
        balanced1 = new BalancedBST();
        assertTrue(balanced1.add(node3));
        assertTrue(balanced1.add(node6));
        assertTrue(balanced1.add(node9));
        assertSame(node6, balanced1.getRoot());
        balanced1 = new BalancedBST();
        assertTrue(balanced1.add(node9));
        assertTrue(balanced1.add(node8));
        assertTrue(balanced1.add(node7));
        assertTrue(balanced1.add(node6));
        assertTrue(balanced1.add(node5));
        assertTrue(balanced1.add(node4));
        assertTrue(balanced1.add(node3));
        assertTrue(node6.equals(balanced1.getRoot())
                || node5.equals(balanced1.getRoot())
                || node7.equals(balanced1.getRoot()));
        balanced1 = new BalancedBST();
        assertTrue(balanced1.add(node3));
        assertTrue(balanced1.add(node4));
        assertTrue(balanced1.add(node5));
        assertTrue(balanced1.add(node6));
        assertTrue(balanced1.add(node7));
        assertTrue(balanced1.add(node8));
        assertTrue(balanced1.add(node9));
        assertTrue(node6.equals(balanced1.getRoot())
                || node5.equals(balanced1.getRoot())
                || node7.equals(balanced1.getRoot()));
    }


	public void testToString()
	{
		assertEquals("java.lang.String", balanced1.toString().getClass().getName());
		assertEquals(true, balanced1.add(node5));
		assertNotNull(balanced1.toString());
	}
}



