import junit.framework.TestCase;

/**
 * A JUnit test case class for the ArraySearchableStack class.
 */
public class ArrayTester extends TestCase {
  
  /**
   * Test push and pop and IsEmpty
   */
  public void testPushPop() {
    
    SearchableStack<Integer> ss = new ArraySearchableStack(5);
    
    ss.push( new Integer(1) );
    assertEquals( new Integer(1), ss.pop() );
    assertTrue( ss.isEmpty() ); 
  }
  
  /**
   * Test push and isFull
   */
  public void testIsFull() {
    
    SearchableStack<Integer> ss = new ArraySearchableStack(5);
    
    ss.push( new Integer(1) );
    ss.push( new Integer(2) );
    ss.push( new Integer(3) );
    ss.push( new Integer(4) );
    ss.push( new Integer(5) );

    assertFalse( ss.isEmpty() );
    assertTrue( ss.isFull() );
  }
  
  /**
   * Test push and toString
   */
  public void testToString() {
    
    SearchableStack<Integer> ss = new ArraySearchableStack(5);
    
    ss.push( new Integer(1) );
    ss.push( new Integer(2) );
    assertEquals( "2\n1\n", ss.toString() ); 
    
    ss.push( new Integer(3) );
    ss.push( new Integer(4) );
    ss.push( new Integer(5) );

    assertFalse( ss.isEmpty() );
    assertTrue( ss.isFull() );
    
    assertEquals( "5\n4\n3\n2\n1\n", ss.toString() );
  }
  
  /**
   * Test push, pop and search
   */
  public void testSearch() {
    
    SearchableStack<Integer> ss = new ArraySearchableStack(5);
    
    ss.push( new Integer(1) );
    ss.push( new Integer(2) );
    assertFalse( ss.isEmpty() );    
    ss.push( new Integer(3) );
    assertTrue( ss.search( new Integer(1) ) );
    ss.push( new Integer(4) );
    assertTrue( ss.search( new Integer(1) ) );    
    assertTrue( ss.search( new Integer(4) ) );    
    assertFalse( ss.search( new Integer(5) ) );
    ss.push( new Integer(5) );
    assertTrue( ss.search( new Integer(5) ) );    
    //System.out.println( ss.toString() );  
    assertTrue( ss.isFull() );
    //System.out.println( ss.toString() );
    
    assertEquals( "5\n4\n3\n2\n1\n", ss.toString() );

    assertEquals( new Integer(5), ss.pop() );    
    assertFalse( ss.search( new Integer(5) ) );
    
    assertEquals( "4\n3\n2\n1\n", ss.toString() );
  }
  
  /**
   * Test push, pop and find
   */
  public void testFind() {
    
    SearchableStack<Integer> ss = new ArraySearchableStack(5);
    
    ss.push( new Integer(1) );
    ss.push( new Integer(2) );
    assertFalse( ss.isEmpty() );    
    ss.push( new Integer(3) );
    assertEquals( new Integer(1), ss.find( new Integer(1) ) );
    assertEquals( new Integer(3), ss.find( new Integer(3) ) );    
    //System.out.println( ss.toString() );      
    assertEquals( "2\n", ss.toString() );    
    ss.push( new Integer(4) );
    assertEquals( "4\n2\n", ss.toString() );       
    ss.push( new Integer(5) );
    assertEquals( new Integer(4),  ss.find( new Integer(4) ) );    
    //System.out.println( ss.toString() );  
    assertEquals( "5\n2\n", ss.toString() );
  }
  
}
