package com.github.fge.grappa.stack; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.shouldHaveThrown; import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyInt; import static org.mockito.Matchers.eq; import static org.mockito.Matchers.same; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; public final class ValueStackBaseTest { @SuppressWarnings("InstanceVariableMayNotBeInitialized") private ValueStackBase<Object> stack; @BeforeMethod public void initStack() { stack = spy(new DummyValueStack()); } @Test public void zeroSizeEmptyTest() { // This is the default; but let's just clarify doReturn(0).when(stack).size(); assertThat(stack.isEmpty()).isTrue(); } @Test public void nonZeroSizeEmptyTest() { doReturn(1).when(stack).size(); assertThat(stack.isEmpty()).isFalse(); } @Test public void pushNegativeIndex() { try { stack.push(-1, new Object()); shouldHaveThrown(IllegalArgumentException.class); } catch (IllegalArgumentException e) { assertThat(e).hasMessage(ValueStackBase.NEGATIVE_INDEX); } verify(stack, never()).doPush(anyInt(), any()); } @Test public void pushIllegalIndex() { doReturn(2).when(stack).size(); try { stack.push(3, new Object()); shouldHaveThrown(IllegalStateException.class); } catch (IllegalStateException e) { assertThat(e).hasMessage(ValueStackBase.NOT_ENOUGH_ELEMENTS); } verify(stack, never()).doPush(anyInt(), any()); } @Test public void pushTest() { doReturn(3).when(stack).size(); final Object element = new Object(); stack.push(3, element); verify(stack).doPush(eq(3), same(element)); } @Test public void popNegativeIndex() { try { stack.pop(-1); shouldHaveThrown(IllegalArgumentException.class); } catch (IllegalArgumentException e) { assertThat(e).hasMessage(ValueStackBase.NEGATIVE_INDEX); } } @Test public void popIllegalIndex() { doReturn(1).when(stack).size(); try { stack.pop(1); shouldHaveThrown(IllegalStateException.class); } catch (IllegalStateException e) { assertThat(e).hasMessage(ValueStackBase.NOT_ENOUGH_ELEMENTS); } } @Test public void popTest() { doReturn(3).when(stack).size(); stack.pop(2); verify(stack).doPop(2); } @Test public void peekNegativeIndex() { try { stack.peek(-1); shouldHaveThrown(IllegalArgumentException.class); } catch (IllegalArgumentException e) { assertThat(e).hasMessage(ValueStackBase.NEGATIVE_INDEX); } } @Test public void peekIllegalIndex() { doReturn(2).when(stack).size(); try { stack.peek(2); shouldHaveThrown(IllegalStateException.class); } catch (IllegalStateException e) { assertThat(e).hasMessage(ValueStackBase.NOT_ENOUGH_ELEMENTS); } } @Test public void peekTest() { doReturn(3).when(stack).size(); final Object expected = new Object(); doReturn(expected).when(stack).doPeek(2); final Object actual = stack.peek(2); assertThat(actual).isSameAs(expected); } @Test public void pokeNegativeIndex() { try { stack.poke(-1, new Object()); shouldHaveThrown(IllegalArgumentException.class); } catch (IllegalArgumentException e) { assertThat(e).hasMessage(ValueStackBase.NEGATIVE_INDEX); } } @Test public void pokeIllegalIndex() { doReturn(2).when(stack).size(); try { stack.poke(2, new Object()); shouldHaveThrown(IllegalStateException.class); } catch (IllegalStateException e) { assertThat(e).hasMessage(ValueStackBase.NOT_ENOUGH_ELEMENTS); } } @Test public void pokeTest() { doReturn(3).when(stack).size(); final Object element = new Object(); stack.poke(2, element); verify(stack).doPoke(eq(2), same(element)); } @Test public void swapBadArg() { try { stack.swap(1); shouldHaveThrown(IllegalArgumentException.class); } catch (IllegalArgumentException e) { assertThat(e).hasMessage(ValueStackBase.SWAP_BADARG); } } @Test public void swapIllegalIndex() { doReturn(2).when(stack).size(); try { stack.swap(3); shouldHaveThrown(IllegalStateException.class); } catch (IllegalStateException e) { assertThat(e).hasMessage(ValueStackBase.NOT_ENOUGH_ELEMENTS); } } @Test public void swapTest() { doReturn(3).when(stack).size(); stack.swap(3); verify(stack).doSwap(3); } @Test public void dupIllegalIndex() { doReturn(0).when(stack).size(); try { stack.dup(); shouldHaveThrown(IllegalStateException.class); } catch (IllegalStateException e) { assertThat(e).hasMessage(ValueStackBase.NOT_ENOUGH_ELEMENTS); } } @Test public void dupTest() { doReturn(1).when(stack).size(); stack.dup(); verify(stack).doDup(); } }