package com.github.fge.grappa.stack; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; import static org.assertj.core.api.Assertions.assertThat; @Test public abstract class ValueStackTest { protected final Object o1 = new Object(); protected final Object o2 = new Object(); protected final Object o3 = new Object(); protected final Object o4 = new Object(); protected final Object o5 = new Object(); protected final Object o6 = new Object(); protected ValueStack<Object> stack; @BeforeMethod public void createStack() { stack = newStack(); } protected abstract ValueStack<Object> newStack(); protected abstract void checkNoContents(); protected abstract void checkContents(Object first, Object... others); @Test public final void initialSizeTest() { assertThat(stack.size()).isEqualTo(6); } @Test public final void iteratorTest() { assertThat(stack.iterator()) .containsExactly(o1, o2, o3, o4, o5, o6); } @Test public final void clearTest() { stack.clear(); checkNoContents(); } @Test public final void pushTest() { final Object o7 = new Object(); stack.push(o7); checkContents(o7, o1, o2, o3, o4, o5, o6); } @Test public final void pushMiddleTest() { final Object o7 = new Object(); stack.push(3, o7); checkContents(o1, o2, o3, o7, o4, o5, o6); } @Test public final void pushAtEndTest() { final Object o7 = new Object(); stack.push(6, o7); checkContents(o1, o2, o3, o4, o5, o6, o7); } @Test public final void popTest() { final Object expected = o1; final Object actual = stack.pop(); assertThat(expected).isSameAs(actual); checkContents(o2, o3, o4, o5, o6); } @Test public final void popMidleTest() { final Object expected = o5; final Object actual = stack.pop(4); assertThat(expected).isSameAs(actual); checkContents(o1, o2, o3, o4, o6); } @Test public final void peekTest() { final Object expected = o1; final Object actual = stack.peek(); assertThat(expected).isSameAs(actual); checkContents(o1, o2, o3, o4, o5, o6); } @Test public final void peekMiddleTest() { final Object expected = o3; final Object actual = stack.peek(2); assertThat(expected).isSameAs(actual); checkContents(o1, o2, o3, o4, o5, o6); } @Test(dependsOnMethods = "peekTest") public final void pokeTest() { final Object expected = new Object(); stack.poke(expected); final Object actual = stack.peek(); assertThat(actual).isSameAs(expected); checkContents(expected, o2, o3, o4, o5, o6); } @Test(dependsOnMethods = "peekMiddleTest") public final void pokeMiddleTest() { final Object expected = new Object(); stack.poke(2, expected); final Object actual = stack.peek(2); assertThat(actual).isSameAs(expected); checkContents(o1, o2, expected, o4, o5, o6); } @Test public final void dupTest() { stack.dup(); checkContents(o1, o1, o2, o3, o4, o5, o6); } @Test public final void swapTest() { stack.swap(); checkContents(o2, o1, o3, o4, o5, o6); } @Test public final void swapMiddleEvenTest() { stack.swap(4); checkContents(o4, o3, o2, o1, o5, o6); } @Test public final void swapMiddleOddTest() { stack.swap(5); checkContents(o5, o4, o3, o2, o1, o6); } @Test(dependsOnMethods = { "pushTest", "dupTest", "pokeTest", "swapTest", "pokeTest" }) public final void snapshotTest() { final Object snapshot = stack.takeSnapshot(); final Object value = new Object(); stack.pop(); stack.push(value); stack.dup(); stack.swap(3); stack.restoreSnapshot(snapshot); checkContents(o1, o2, o3, o4, o5, o6); } }