import org.junit.Assert; import org.junit.Test; import java.util.Collections; import java.util.List; import java.util.stream.IntStream; public class StackWithMaxTest { private final int N = 5; private int length; @Test public void stackWithMax1(){ length = 10; test(length); } @Test public void stackWithMax2(){ length = 100; test(length); } private void test(int length) { List<Integer> values = StreamUtil.sequence(length); final Integer max = Collections.max(values); assertTracksMax(values); IntStream.range(0, N) .forEach(n -> { Collections.shuffle(values); StackWithMax stack = createStack(values); Assert.assertEquals(max, stack.max()); }); } private void assertTracksMax(List<Integer> values) { final StackWithMax stackWithMax = new StackWithMax(); StreamUtil.revRange(0, values.size()).forEach( i -> { stackWithMax.push(values.get(i)); } ); IntStream.range(0, values.size()).forEach( i -> { Assert.assertEquals(values.get(i), stackWithMax.pop()); } ); } private StackWithMax createStack(List<Integer> values) { final StackWithMax stack = new StackWithMax(); IntStream.range(0, values.size()) .forEach(i -> { stack.push(values.get(i)); }); return stack; } }