package com.github.davidmoten.rtree.internal.util; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import java.util.Iterator; import org.junit.Test; import com.github.davidmoten.rtree.internal.util.ImmutableStack; public class ImmutableStackTest { private final Object a = new Object(); private final Object b = new Object(); @Test public void testNewStackIsEmpty() { ImmutableStack<Object> s = ImmutableStack.empty(); assertTrue(s.isEmpty()); } @Test(expected = RuntimeException.class) public void testPopOnEmptyStackThrowsException() { ImmutableStack.empty().pop(); } @Test(expected = RuntimeException.class) public void testPeekOnEmptyStackThrowsException() { ImmutableStack.empty().peek(); } @Test(expected = RuntimeException.class) public void testRemoveThrowsException() { ImmutableStack.empty().push(a).iterator().remove(); } @Test public void testStackIsEmptyAfterPushThenPop() { assertTrue(ImmutableStack.empty().push(new Object()).pop().isEmpty()); } @Test public void testPeekGivesLastPushed() { assertEquals(b, ImmutableStack.empty().push(a).push(b).peek()); } @Test public void testPopPeekGivesSecondLastPushed() { assertEquals(a, ImmutableStack.empty().push(a).push(b).pop().peek()); } @Test public void testIteratorWhenEmpty() { assertFalse(ImmutableStack.empty().iterator().hasNext()); } @Test public void testIteratorWhenHasOneItem() { assertTrue(ImmutableStack.empty().push(a).iterator().hasNext()); } @Test public void testIteratorReturnsOneItem() { assertEquals(a, ImmutableStack.empty().push(a).iterator().next()); } @Test public void testIteratorReturnsLastPushedFirst() { assertEquals(b, ImmutableStack.empty().push(a).push(b).iterator().next()); } @Test public void testIteratorReturnsTwoItemsInOrderOfPop() { Iterator<Object> it = ImmutableStack.empty().push(a).push(b).iterator(); assertEquals(b, it.next()); assertEquals(a, it.next()); assertFalse(it.hasNext()); } }