package freenet.support; import org.junit.Before; import org.junit.Test; import java.util.NoSuchElementException; import java.util.Random; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; public class RandomArrayIteratorTest { private static final int NUM_ELEMENTS = 100; private RandomArrayIterator<Integer> iter; @Before public void setUp() { Integer[] objects = new Integer[NUM_ELEMENTS]; for (int i = 0; i < NUM_ELEMENTS; i++) { objects[i] = i; } iter = new RandomArrayIterator<Integer>(objects); } /** * Tests that reset() function correctly, both with non-null and null argument. */ @Test public void testReset() { testDefaultOrder(); iter.reset(null); testDefaultOrder(); iter.reset(new Random(0)); int[] order = new int[NUM_ELEMENTS]; for (int i = NUM_ELEMENTS; iter.hasNext(); i--) { int next = iter.next(); // Make sure we see each element exactly once assertEquals(order[next], 0); order[next] = i; } // Ensure we did not see the default order boolean defaultOrder = true; for (int i = 0; i < NUM_ELEMENTS; i++) { if (NUM_ELEMENTS - i != order[i]) { defaultOrder = false; break; } } assertFalse(defaultOrder); iter.reset(null); // Ensure we still see the same non-default order after non-randomizing reset for (int i = NUM_ELEMENTS; iter.hasNext(); i--) { int next = iter.next(); assertEquals(order[next], i); } } /** * Tests that the iterator yields the elements in their default order. */ @Test public void testDefaultOrder() { for (int i = 0; i < NUM_ELEMENTS; i++) { assertTrue(iter.hasNext()); assertEquals((int)iter.next(), i); } assertFalse(iter.hasNext()); } /** * Tests that when hasNext() returns false, next() throws. */ @Test public void testNoSuchElement() { // Exhaust the iterator first testDefaultOrder(); assertFalse(iter.hasNext()); try { iter.next(); throw new AssertionError(); } catch(NoSuchElementException expected) { assertFalse(iter.hasNext()); } } /** * Tests that remove() throws. */ @Test public void testReadonly() { // Try to remove each element for (int i = 0; i < NUM_ELEMENTS; i++) { iter.next(); try { iter.remove(); throw new AssertionError(); } catch (UnsupportedOperationException expected) { // remove() should throw } } // Make sure remove() did not modify anything before throwing iter.reset(null); testDefaultOrder(); } }