package com.jcwhatever.nucleus.collections.java; import static org.junit.Assert.assertEquals; import java.util.List; import java.util.ListIterator; /** * Test a {@link ListIterator} implementation. * * <p>Not a JUnit test case but throws errors via JUnit. Intended * to be instantiated with a test and the {@link #run} method invoked.</p> */ public class ListIteratorRunnable<E> implements Runnable { final Object _sync; final ListIterator<E> _iterator; final List<E> _values; final E _value1; final E _value2; /** * Constructor. * * @param sync The sync object to use. Needed for iterators that require external sync. * Is generally the iterators owning collection instance. * @param iterator The iterator to test. * @param values The values contained in the iterator. at least 3 values required. * @param value1 A value to insert for testing. * @param value2 A value to insert for testing. */ public ListIteratorRunnable(Object sync, ListIterator<E> iterator, List<E> values, E value1, E value2) { _sync = sync; _iterator = iterator; _values = values; _value1 = value1; _value2 = value2; if (values.size() <= 2) throw new AssertionError("A size greater than 2 is required for proper testing."); } @Override public void run() { synchronized (_sync) { assertEquals(false, _iterator.hasPrevious()); assertEquals(true, _iterator.hasNext()); assertEquals(_values.get(0), _iterator.next()); if (_iterator.hasPrevious()) { assertEquals(true, _iterator.hasPrevious()); assertEquals(true, _iterator.hasNext()); assertEquals(_values.get(1), _iterator.next()); assertEquals(true, _iterator.hasPrevious()); assertEquals(_values.get(1), _iterator.previous()); assertEquals(true, _iterator.hasPrevious()); assertEquals(_values.get(0), _iterator.previous()); assertEquals(false, _iterator.hasPrevious()); _iterator.next(); } else { try { _iterator.previous(); throw new AssertionError("UnsupportedOperationException expected."); } catch (UnsupportedOperationException ignore) { } } //test add try { _iterator.add(_value2); assertEquals(true, _iterator.hasPrevious()); assertEquals(_value2, _iterator.previous()); } catch (UnsupportedOperationException ignore) { } // test set try { _iterator.set(_value1); _iterator.next(); assertEquals(_value1, _iterator.previous()); } catch (UnsupportedOperationException ignore) { } try { try { _iterator.add(_value2); // next or previous must be called before calling set after add _iterator.set(_value1); throw new AssertionError("IllegalStateException expected."); } catch (IllegalStateException ignore) { } // test remove: must be called after calling next or previous try { _iterator.remove(); throw new AssertionError("IllegalStateException expected."); } catch (IllegalStateException ignore) { } // go to beginning while (_iterator.hasPrevious()) _iterator.previous(); // test remove _iterator.next(); _iterator.remove(); } catch (UnsupportedOperationException ignore) { } } } }