package datastructure;
import datastructure.basic.*;
import org.junit.Assert;
import org.junit.Test;
import org.junit.Before;
import org.junit.After;
import java.lang.reflect.Field;
import java.util.EmptyStackException;
/**
* Stack Tester.
*
* @author <Authors name>
* @version 1.0
* @since <pre>二月 24, 2017</pre>
*/
public class StackTest {
@Before
public void before() throws Exception {
}
@After
public void after() throws Exception {
}
private Stack getStack() {
Stack stack = new Stack();
for (int i = 1; i <= 5; ++i) {
stack.push(i);
}
return stack;
}
private void assertStack(Stack stack, Object[] actual) {
Class<Stack> clazz = Stack.class;
ArrayList elementData = null;
try {
Field field = clazz.getDeclaredField("elementData");
field.setAccessible(true);
elementData = (ArrayList) field.get(stack);
} catch (NoSuchFieldException | IllegalAccessException e) {
e.printStackTrace();
}
Object[] excepted = null;
if (elementData != null) {
int size = stack.size();
excepted = new Object[size];
for (int i = 0; i < size; ++i) {
excepted[i] = elementData.get(i);
}
}
Assert.assertArrayEquals(excepted, actual);
}
/**
* Method: push(Object o)
*/
@Test
public void testPush() throws Exception {
//TODO: Test goes here...
Stack stack = getStack();
for (int i = 6; i <= 10; ++i) {
stack.push(i);
}
assertStack(stack, new Object[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10});
}
/**
* Method: pop()
*/
@Test
public void testPop() throws Exception {
//TODO: Test goes here...
Stack stack = getStack();
int count = stack.size() + 2;
Object[] values = new Object[count];
boolean[] exceptions = new boolean[count];
for (int i = 0; i < count; ++i) {
try {
values[i] = stack.pop();
} catch (EmptyStackException e) {
exceptions[i] = true;
}
}
Assert.assertArrayEquals(values, new Object[]{5, 4, 3, 2, 1, null, null});
Assert.assertArrayEquals(exceptions, new boolean[]{false, false, false, false, false, true, true});
assertStack(stack, new Object[0]);
}
}