import junit.framework.*;

/**
 * JUnit test class for the StackADT
 * 
 * @author Professor Scot Morse
 * @version Changes by Michael Rivers
 */
public class StackTest extends TestCase 
{	
	public StackTest( String str )
	{
		super( str );
	}	
	
	//*********************  Test methods ************************
	
	public void testConstructor1()
	{
		assertNotNull(new ArrayStack());
	}
	
	public void testConstructor2()
	{
		assertNotNull(new ArrayStack(1000));
	}
	
	public void testPush()
	{
		StackADT stack = new ArrayStack();
		for( int i = 0; i < 1000; ++i )
		{
			Integer expected = new Integer(i);
			Integer found = (Integer)(stack.push(expected));
			assertSame(expected, found);
		}
	}
	
	public void testPop() throws EmptyStackException
	{
		StackADT stack = new ArrayStack();
		for( int i = 0; i < 1000; ++i )
		{
			stack.push("hello");
		}
		for( int i = 0; i < 1000; ++i )
		{
			stack.pop();
		}
	}
	
	public void testPushAndPop() throws EmptyStackException
	{
		StackADT stack = new ArrayStack();
		stack.push("A");
		stack.push("B");
		stack.push("C");
		assertEquals( "C", (String)(stack.pop()) );
		assertEquals( "B", (String)(stack.pop()) );
		assertEquals( "A", (String)(stack.pop()) );
		assertNull( stack.pop() );
	}
	
	public void testPushAndPop2() throws EmptyStackException
	{
		StackADT stack = new ArrayStack();
		for( int i = 0; i < 1000; ++i )
		{
			Integer expected = new Integer(i);
			stack.push(expected);
		}
		for( int i = 999; i >= 0; --i )
		{
			Integer expected = new Integer(i);
			Integer found = (Integer)(stack.pop());
			assertEquals(expected, found);
		}
		assertNull( stack.pop() );
	}
	
	public void testPushAndPop3()  throws EmptyStackException
	{
		StackADT stack = new ArrayStack();
		for(int i = 0; i < 50001; ++i)
			stack.push("A");
		stack.push("B");
		stack.push("C");
		assertEquals( "C", (String)(stack.pop()) );
		assertEquals( "B", (String)(stack.pop()) );
		assertEquals( "A", (String)(stack.pop()) );
		while( !stack.isEmpty() )
			stack.pop();
		assertTrue( stack.isEmpty() );
	}
	
	public void testClear()
	{
		StackADT stack = new ArrayStack();
		stack.push("A");
		stack.push("B");
		stack.push("C");
		stack.clear();
		assertTrue( stack.isEmpty() );
	}
	
	public void testIsEmpty()
	{
		StackADT stack = new ArrayStack();
		stack.push("A");
		stack.push("B");
		stack.push("C");
		assertFalse( stack.isEmpty() );
		StackADT stack2 = new ArrayStack();
		assertTrue( stack2.isEmpty() );
	}
	
	public void testCalculator()
	{
	    Main main = new Main();
	    String str = main.evaluatePostFixInput( "2 2 +" );
	    System.out.println(str + " ==? 4.0" );
	    assertEquals( "4.0" , str);
	}
	
	public void testCalculator2()
	{
	    Main main = new Main();
	    String str = main.evaluatePostFixInput( "2 3 *" );
	    System.out.println(str + " ==? 6.0" );
	    assertEquals( "6.0" , str);
	}
	
	public void testCalculator3()
	{
	    Main main = new Main();
	    String str = main.evaluatePostFixInput( "6 2 /" );
	    System.out.println(str + " ==? 3.0" );
	    assertEquals( "3.0" , str);
	}
	
	public void testCalculator4()
	{
	    Main main = new Main();
	    String str = main.evaluatePostFixInput( "3 2 -" );
	    System.out.println(str + " ==? 1.0" );
	    assertEquals( "1.0" , str);
	}
	
	public void testCalculator5()
	{
	    Main main = new Main();
	    String str = main.evaluatePostFixInput( "2.71 3.95 * 4 / 2.2 3.3 + *" );
	    System.out.println(str + " ==? 14.7186875" );
	    assertEquals( "14.7186875" , str);
	}
}
