sqt/SQ-2023-H6/src/test/java/org/usi/sq/util/CircularFifoQueueTest.java

96 lines
3.4 KiB
Java

package org.usi.sq.util;
import org.junit.jupiter.api.Test;
import java.util.*;
import static org.junit.jupiter.api.Assertions.*;
class CircularFifoQueueTest {
private void testIteratorEmpty(final Iterator<?> it) {
assertFalse(it.hasNext());
assertThrows(NoSuchElementException.class, it::next);
}
private <T> void testIteratorNext(final Iterator<T> it, final T e) {
assertTrue(it.hasNext());
assertEquals(e, it.next());
}
private <T> void testQueue(final int initQueueSize, final List<T> values, final long removeQueueCount, final List<Integer> itrRemoveIndexes) {
final Set<Integer> removeIndexesSet = new HashSet<>(itrRemoveIndexes);
final CircularFifoQueue<T> queue = new CircularFifoQueue<>(initQueueSize);
for (T e : values) assertTrue(queue.offer(e));
final int queueSizeAfterOffers = Math.min(initQueueSize, values.size());
for (int i = 0; i < removeQueueCount; i++) {
assertEquals(values.get(values.size() - queueSizeAfterOffers + i), queue.remove());
}
assertEquals(queueSizeAfterOffers - removeQueueCount, queue.size());
assertEquals(queue.size() == initQueueSize, queue.isAtFullCapacity());
final Iterator<T> it = queue.iterator();
final List<T> notRemovedValues = new ArrayList<>(values.size());
final List<T> expected = values.subList(Math.max(0, values.size() - queue.size()), values.size());
// Test Iteration
for (int i = 0; i < expected.size(); i++) {
final T e = expected.get(i);
testIteratorNext(it, e);
if (removeIndexesSet.contains(i)) {
it.remove();
assertThrows(IllegalStateException.class, it::remove); // removing again causes explosion
} else {
notRemovedValues.add(e);
}
}
testIteratorEmpty(it);
// Test removal
assertEquals(notRemovedValues.size(), queue.size());
final Iterator<T> itNew = queue.iterator();
for (T e : notRemovedValues) testIteratorNext(itNew, e);
testIteratorEmpty(itNew);
}
@SafeVarargs
public final <T> List<T> list(final T... es) {
return Arrays.asList(es);
}
public final List<Integer> range(final int start, final int end) {
if (end < start) throw new IllegalArgumentException();
final List<Integer> toReturn = new ArrayList<>(end - start);
for (int i = start; i < end; i++) toReturn.add(i);
return toReturn;
}
@Test
public void testIterator() {
assertThrows(IllegalArgumentException.class, () -> new CircularFifoQueue<Void>(0));
assertThrows(NoSuchElementException.class, () -> new CircularFifoQueue<Void>().remove());
assertThrows(NullPointerException.class, () -> new CircularFifoQueue<Void>().offer(null));
final List<Integer> empty = Collections.emptyList();
testQueue(10, range(0, 3), 0, list(0, 2));
testQueue(3, range(0, 3), 0, list(0, 2));
testQueue(3, range(0, 3), 0, list(0, 2));
testQueue(2, range(0, 3), 0, empty);
testQueue(4, range(0, 9), 0, list(1, 3));
testQueue(7, range(0, 13), 4, list(1, 3));
testQueue(7, range(0, 13), 2, list(0, 2, 4, 5, 6));
testQueue(5, range(0, 34), 2, list(0, 2, 4));
testQueue(4, range(0, 5), 0, list(1, 3));
testQueue(10, empty, 0, empty);
testQueue(4, range(0, 5), 1, empty);
}
}