package com.jcwhatever.nucleus.collections.java; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import com.jcwhatever.nucleus.utils.ArrayUtils; import org.junit.Ignore; import java.util.Collection; import java.util.Iterator; /** * Test a {@link Collection} implementation. * * <p>Also 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> */ @Ignore public class CollectionRunnable<E> implements Runnable { final Collection<E> _collection; final E _value1; final E _value2; final E _value3; /** * Constructor. * * @param collection The collection 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 CollectionRunnable(Collection<E> collection, E value1, E value2, E value3) { _collection = collection; _value1 = value1; _value2 = value2; _value3 = value3; } @Override public void run() { // test empty assertEquals(true, _collection.isEmpty()); assertEquals(0, _collection.size()); assertNotNull(_collection.toString()); try { // test add 1 value assertEquals(true, _collection.add(_value1)); assertEquals(false, _collection.isEmpty()); assertEquals(1, _collection.size()); assertEquals(true, _collection.contains(_value1)); // test remove 1 value assertEquals(true, _collection.remove(_value1)); assertEquals(true, _collection.isEmpty()); assertEquals(0, _collection.size()); assertEquals(false, _collection.contains(_value1)); // test add 2 values assertEquals(true, _collection.add(_value1)); assertEquals(true, _collection.add(_value2)); assertEquals(2, _collection.size()); assertEquals(false, _collection.isEmpty()); assertEquals(true, _collection.contains(_value1)); assertEquals(true, _collection.contains(_value2)); // test containsAll assertEquals(true, _collection.containsAll(ArrayUtils.asList(_value1, _value2))); // test iterator Iterator<E> iterator = _collection.iterator(); int size = 0; synchronized (_collection) { // prevent exceptions from iterators that require external sync // test iterator hasNext and next assertEquals(true, iterator.hasNext()); assertNotNull(iterator.next()); // test iterator remove try { iterator.remove(); assertEquals(1, _collection.size()); } catch (UnsupportedOperationException ignore) { size++; } // test iterator hasNext and next (second iteration) assertEquals(true, iterator.hasNext()); assertNotNull(iterator.next()); // test iterator remove (second iteration) try { iterator.remove(); assertEquals(0, _collection.size()); } catch (UnsupportedOperationException ignore) { size++; } // test iterator hasNext (iteration complete) assertEquals(false, iterator.hasNext()); } // test iterator remove valid assertEquals(size, _collection.size()); assertEquals(false, _collection.contains(_value1)); assertEquals(false, _collection.contains(_value2)); // make sure collection has values if (size == 0) { _collection.add(_value1); _collection.add(_value2); assertEquals(2, _collection.size()); } // test clear _collection.clear(); assertEquals(0, _collection.size()); // test addAll _collection.addAll(ArrayUtils.asList(_value1, _value2, _value3)); assertEquals(3, _collection.size()); // test removeAll _collection.removeAll(ArrayUtils.asList(_value2, _value3)); assertEquals(1, _collection.size()); assertEquals(true, _collection.contains(_value1)); assertEquals(false, _collection.contains(_value2)); assertEquals(false, _collection.contains(_value3)); // test toArray Object[] array = _collection.toArray(); assertArrayEquals(new Object[] { _value1 }, array); _collection.toArray(array); assertArrayEquals(new Object[] { _value1 }, array); _collection.add(_value2); _collection.add(_value3); assertEquals(3, _collection.size()); // test retainAll _collection.retainAll(ArrayUtils.asList(_value1, _value2)); assertEquals(2, _collection.size()); assertEquals(true, _collection.contains(_value1)); assertEquals(true, _collection.contains(_value2)); assertEquals(false, _collection.contains(_value3)); IterableRunnable<E> iterableTest = new IterableRunnable<>(_collection, _collection.size(), new Runnable() { @Override public void run() { _collection.add(_value1); _collection.add(_value2); _collection.add(_value3); } }); iterableTest.run(); _collection.clear(); } catch (UnsupportedOperationException ignore) {} } }