package com.jcwhatever.nucleus.collections.java; import static org.junit.Assert.assertEquals; import java.util.List; /** * Test a {@link List} implementation. * * <p>Also runs {@link ListIteratorRunnable} and {@link CollectionRunnable} * which runs {@link IterableRunnable}.</p> * * <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 ListRunnable<E> implements Runnable { final List<E> _list; final E _value1; final E _value2; final E _value3; /** * Constructor. * * @param list The list to test. * @param value1 A value to use for testing. * @param value2 A value to use for testing. * @param value3 A value to use for testing. */ public ListRunnable(List<E> list, E value1, E value2, E value3) { this._list = list; this._value1 = value1; this._value2 = value2; this._value3 = value3; } @Override public void run() { CollectionRunnable<E> test = new CollectionRunnable<>(_list, _value1, _value2, _value3); test.run(); _list.clear(); try { _list.add(_value1); _list.add(_value2); _list.add(_value3); // test get try { assertEquals(_value1, _list.get(0)); assertEquals(_value2, _list.get(1)); assertEquals(_value3, _list.get(2)); try { _list.get(3); throw new AssertionError("IndexOutOfBoundsException expected."); } catch (IndexOutOfBoundsException ignore) { } }catch (UnsupportedOperationException ignore) {} // test set try { assertEquals(_value1, _list.set(0, _value2)); assertEquals(_value2, _list.set(1, _value3)); assertEquals(_value3, _list.set(2, _value1)); try { _list.set(3, _value1); throw new AssertionError("IndexOutOfBoundsException expected."); } catch (IndexOutOfBoundsException ignore) {} } catch (UnsupportedOperationException ignore) {} // test add try { _list.clear(); _list.add(_value1); _list.add(0, _value2); assertEquals(_value2, _list.get(0)); assertEquals(_value1, _list.get(1)); try { _list.add(3, _value1); throw new AssertionError("IndexOutOfBoundsException expected."); } catch (IndexOutOfBoundsException ignore) {} } catch (UnsupportedOperationException ignore) {} // test remove try { _list.clear(); _list.add(_value1); assertEquals(_value1, _list.remove(0)); try { assertEquals(_value1, _list.remove(1)); throw new AssertionError("IndexOutOfBoundsException expected."); } catch (IndexOutOfBoundsException ignore) {} } catch (UnsupportedOperationException ignore) {} try { _list.clear(); _list.add(_value1); _list.add(_value2); _list.add(_value3); assertEquals(0, _list.indexOf(_value1)); assertEquals(1, _list.indexOf(_value2)); assertEquals(2, _list.indexOf(_value3)); } catch(UnsupportedOperationException ignore) { throw new AssertionError("UnsupportedOperationException NOT expected."); } try { _list.clear(); _list.add(_value1); _list.add(_value1); _list.add(_value2); _list.add(_value2); _list.add(_value3); _list.add(_value3); assertEquals(1, _list.lastIndexOf(_value1)); assertEquals(3, _list.lastIndexOf(_value2)); assertEquals(5, _list.lastIndexOf(_value3)); } catch(UnsupportedOperationException ignore) { throw new AssertionError("UnsupportedOperationException NOT expected."); } _list.clear(); _list.add(_value1); _list.add(_value1); _list.add(_value2); _list.add(_value2); _list.add(_value3); _list.add(_value3); List<E> subList = _list.subList(1, 4); assertEquals(3, subList.size()); assertEquals(_value1, subList.get(0)); assertEquals(_value2, subList.get(1)); assertEquals(_value2, subList.get(2)); assertEquals(2, subList.lastIndexOf(_value2)); assertEquals(true, subList.contains(_value1)); assertEquals(true, subList.contains(_value2)); assertEquals(false, subList.contains(_value3)); assertEquals(_value1, subList.remove(0)); assertEquals(2, subList.size()); assertEquals(5, _list.size()); ListIteratorRunnable<E> listIteratorTest = new ListIteratorRunnable<E>(_list, _list.listIterator(), _list, _value2, _value3); listIteratorTest.run(); } catch (UnsupportedOperationException ignore) { System.out.println("Cannot test because elements cannot be added."); } } }