package com.carrotsearch.hppc;
import static com.carrotsearch.hppc.TestUtils.*;
import static org.junit.Assert.*;
import java.util.*;
import org.junit.*;
import org.junit.rules.MethodRule;
import com.carrotsearch.hppc.cursors.ShortCursor;
import com.carrotsearch.hppc.mutables.IntHolder;
import com.carrotsearch.hppc.predicates.ShortPredicate;
import com.carrotsearch.hppc.procedures.ShortProcedure;
/**
* Unit tests for {@link ShortArrayDeque}.
*/
public class ShortArrayDequeTest
{
/**
* Per-test fresh initialized instance.
*/
public ShortArrayDeque deque;
/**
* Require assertions for all tests.
*/
@Rule
public MethodRule requireAssertions = new RequireAssertionsRule();
/**
* Some sequence values for tests.
*/
private ShortArrayList sequence = new ShortArrayList();
/* replaceIf:applied. */ short /* end */ key1 = 1;
/* replaceIf:applied. */ short /* end */ key2 = 2;
/* replaceIf:applied. */ short /* end */ key3 = 3;
/* */
@Before
public void initialize()
{
deque = new ShortArrayDeque();
sequence.clear();
for (int i = 0; i < 10000; i++)
sequence.add( (short) i);
}
@After
public void checkTrailingSpaceUninitialized()
{
if (deque != null)
{
for (int i = deque.tail; i < deque.head; i = ShortArrayDeque.oneRight(i, deque.buffer.length))
assertTrue(((short) 0) == deque.buffer[i]);
}
}
/* */
@Test
public void testInitiallyEmpty()
{
assertEquals(0, deque.size());
}
/* */
@Test
public void testAddFirst()
{
deque.addFirst( (short) 1);
deque.addFirst( (short) 2);
deque.addFirst( (short) 3);
assertListEquals(deque.toArray(), 3, 2, 1);
assertEquals(3, deque.size());
}
/* */
@Test
public void testAddLast()
{
deque.addLast( (short) 1);
deque.addLast( (short) 2);
deque.addLast( (short) 3);
assertListEquals(deque.toArray(), 1, 2, 3);
assertEquals(3, deque.size());
}
/* */
@Test
public void testAddWithGrowth()
{
for (int i = 0; i < sequence.size(); i++)
{
deque.addFirst(sequence.buffer[i]);
}
assertListEquals(reverse(sequence.toArray()), deque.toArray());
}
/* */
@Test
public void testAddLastWithGrowth()
{
for (int i = 0; i < sequence.size(); i++)
deque.addLast(sequence.buffer[i]);
assertListEquals(sequence.toArray(), deque.toArray());
}
/* */
@Test
public void testAddAllFirst()
{
ShortArrayList list2 = new ShortArrayList();
list2.add(newArray(list2.buffer, 0, 1, 2));
deque.addFirst(list2);
assertListEquals(deque.toArray(), 2, 1, 0);
deque.addFirst(list2);
assertListEquals(deque.toArray(), 2, 1, 0, 2, 1, 0);
deque.clear();
ShortArrayDeque deque2 = new ShortArrayDeque();
deque2.addLast(newArray(deque2.buffer, 0, 1, 2));
deque.addFirst(deque2);
assertListEquals(deque.toArray(), 2, 1, 0);
}
/* */
@Test
public void testAddAllLast()
{
ShortArrayList list2 = new ShortArrayList();
list2.add(newArray(list2.buffer, 0, 1, 2));
deque.addLast(list2);
assertListEquals(deque.toArray(), 0, 1, 2);
deque.addLast(list2);
assertListEquals(deque.toArray(), 0, 1, 2, 0, 1, 2);
deque.clear();
ShortArrayDeque deque2 = new ShortArrayDeque();
deque2.addLast(newArray(deque2.buffer, 0, 1, 2));
deque.addLast(deque2);
assertListEquals(deque.toArray(), 0, 1, 2);
}
/* */
@Test
public void testRemoveFirst()
{
deque.addLast( (short) 1);
deque.addLast( (short) 2);
deque.addLast( (short) 3);
deque.removeFirst();
assertListEquals(deque.toArray(), 2, 3);
assertEquals(2, deque.size());
deque.addFirst( (short) 4);
assertListEquals(deque.toArray(), 4, 2, 3);
assertEquals(3, deque.size());
deque.removeFirst();
deque.removeFirst();
deque.removeFirst();
assertEquals(0, deque.toArray().length);
assertEquals(0, deque.size());
}
/* */
@Test(expected = AssertionError.class)
public void testRemoveFirstEmpty()
{
deque.removeFirst();
}
/* */
@Test
public void testRemoveLast()
{
deque.addLast( (short) 1);
deque.addLast( (short) 2);
deque.addLast( (short) 3);
deque.removeLast();
assertListEquals(deque.toArray(), 1, 2);
assertEquals(2, deque.size());
deque.addLast( (short) 4);
assertListEquals(deque.toArray(), 1, 2, 4);
assertEquals(3, deque.size());
deque.removeLast();
deque.removeLast();
deque.removeLast();
assertEquals(0, deque.toArray().length);
assertEquals(0, deque.size());
}
/* */
@Test(expected = AssertionError.class)
public void testRemoveLastEmpty()
{
deque.removeLast();
}
/* */
@Test
public void testGetFirst()
{
deque.addLast( (short) 1);
deque.addLast( (short) 2);
assertEquals2( (short) 1, deque.getFirst());
deque.addFirst( (short) 3);
assertEquals2( (short) 3, deque.getFirst());
}
/* */
@Test(expected = AssertionError.class)
public void testGetFirstEmpty()
{
deque.getFirst();
}
/* */
@Test
public void testGetLast()
{
deque.addLast( (short) 1);
deque.addLast( (short) 2);
assertEquals2( (short) 2, deque.getLast());
deque.addLast( (short) 3);
assertEquals2( (short) 3, deque.getLast());
}
/* */
@Test(expected = AssertionError.class)
public void testGetLastEmpty()
{
deque.getLast();
}
/* */
@Test
public void testRemoveFirstOccurrence()
{
int modulo = 10;
int count = 10000;
sequence.clear();
for (int i = 0; i < count; i++)
{
deque.addLast( (short) (i % modulo));
sequence.add( (short) (i % modulo));
}
Random rnd = new Random(0x11223344);
for (int i = 0; i < 500; i++)
{
/* replaceIf:applied. */ short /* end */ k =
(short) rnd.nextInt(modulo);
assertEquals(
deque.removeFirstOccurrence(k) >= 0,
sequence.removeFirstOccurrence(k) >= 0);
}
assertListEquals(deque.toArray(), sequence.toArray());
assertTrue(0 > deque.removeFirstOccurrence( (short) (modulo + 1)));
deque.addLast( (short) (modulo + 1));
assertTrue(0 <= deque.removeFirstOccurrence( (short) (modulo + 1)));
}
/* */
@Test
public void testRemoveLastOccurrence()
{
int modulo = 10;
int count = 10000;
sequence.clear();
for (int i = 0; i < count; i++)
{
deque.addLast( (short) (i % modulo));
sequence.add( (short) (i % modulo));
}
Random rnd = new Random(0x11223344);
for (int i = 0; i < 500; i++)
{
/* replaceIf:applied. */ short /* end */ k =
(short) rnd.nextInt(modulo);
assertEquals(
deque.removeLastOccurrence(k) >= 0,
sequence.removeLastOccurrence(k) >= 0);
}
assertListEquals(deque.toArray(), sequence.toArray());
assertTrue(0 > deque.removeLastOccurrence( (short) (modulo + 1)));
deque.addFirst( (short) (modulo + 1));
assertTrue(0 <= deque.removeLastOccurrence( (short) (modulo + 1)));
}
/* */
@Test
public void testRemoveAllOccurrences()
{
deque.addLast(newArray(deque.buffer, 0, 1, 2, 1, 0, 3, 0));
assertEquals(0, deque.removeAllOccurrences( (short) 4));
assertEquals(3, deque.removeAllOccurrences( (short) 0));
assertListEquals(deque.toArray(), 1, 2, 1, 3);
assertEquals(1, deque.removeAllOccurrences( (short) 3));
assertListEquals(deque.toArray(), 1, 2, 1);
assertEquals(2, deque.removeAllOccurrences( (short) 1));
assertListEquals(deque.toArray(), 2);
assertEquals(1, deque.removeAllOccurrences( (short) 2));
assertEquals(0, deque.size());
}
/* */
@Test
public void testRemoveAllInLookupContainer()
{
deque.addLast(newArray(deque.buffer, 0, 1, 2, 1, 0));
ShortOpenHashSet set = new ShortOpenHashSet();
set.add(newArray(set.keys, 0, 2));
assertEquals(3, deque.removeAll(set));
assertEquals(0, deque.removeAll(set));
assertListEquals(deque.toArray(), 1, 1);
}
/* */
@Test
public void testRemoveAllWithPredicate()
{
deque.addLast(newArray(deque.buffer, 0, key1, key2, key1, 4));
assertEquals(3, deque.removeAll(new ShortPredicate()
{
public boolean apply(/* replaceIf:applied. */ short /* end */ v)
{
return v == key1 || v == key2;
};
}));
assertListEquals(deque.toArray(), 0, 4);
}
/* */
@Test
public void testRemoveAllWithPredicateInterrupted()
{
deque.addLast(newArray(deque.buffer, 0, key1, key2, key1, 4));
final RuntimeException t = new RuntimeException();
try
{
assertEquals(3, deque.removeAll(new ShortPredicate()
{
public boolean apply(/* replaceIf:applied. */ short /* end */ v)
{
if (v == key2) throw t;
return v == key1;
};
}));
fail();
}
catch (RuntimeException e)
{
// Make sure it's really our exception...
if (e != t) throw e;
}
// And check if the deque is in consistent state.
assertListEquals(deque.toArray(), 0, key2, key1, 4);
assertEquals(4, deque.size());
}
/* */
@Test
public void testClear()
{
deque.addLast( (short) 1);
deque.addLast( (short) 2);
deque.addFirst( (short) 3);
deque.clear();
assertEquals(0, deque.size());
assertEquals(0, deque.head);
assertEquals(0, deque.tail);
deque.addLast( (short) 1);
assertListEquals(deque.toArray(), 1);
}
/* */
@Test
public void testRelease()
{
deque.addLast( (short) 1);
deque.addLast( (short) 2);
deque.addFirst( (short) 3);
deque.release();
assertEquals(0, deque.size());
assertEquals(0, deque.head);
assertEquals(0, deque.tail);
deque.addLast( (short) 1);
assertListEquals(deque.toArray(), 1);
}
/* */
@Test
public void testIterable()
{
deque.addLast(sequence);
int count = 0;
for (ShortCursor cursor : deque)
{
assertEquals2(sequence.buffer[count], cursor.value);
assertEquals2(deque.buffer[cursor.index], cursor.value);
count++;
}
assertEquals(count, deque.size());
assertEquals(count, sequence.size());
count = 0;
deque.clear();
for (@SuppressWarnings("unused") ShortCursor cursor : deque)
{
count++;
}
assertEquals(0, count);
}
/* */
@Test
public void testIterator()
{
deque.addLast(newArray(deque.buffer, 0, 1, 2, 3));
Iterator<ShortCursor> iterator = deque.iterator();
int count = 0;
while (iterator.hasNext())
{
iterator.hasNext();
iterator.hasNext();
iterator.hasNext();
iterator.next();
count++;
}
assertEquals(count, deque.size());
deque.clear();
assertFalse(deque.iterator().hasNext());
}
/* */
@Test
public void testDescendingIterator()
{
deque.addLast(sequence);
int index = sequence.size() - 1;
for (Iterator<ShortCursor> i = deque.descendingIterator(); i.hasNext(); )
{
ShortCursor cursor = i.next();
assertEquals2(sequence.buffer[index], cursor.value);
assertEquals2(deque.buffer[cursor.index], cursor.value);
index--;
}
assertEquals(-1, index);
deque.clear();
assertFalse(deque.descendingIterator().hasNext());
}
/* */
@Test
/* removeIf:applied. */
public void testForEachWithProcedure()
{
deque.addLast(sequence);
final IntHolder count = new IntHolder();
((ShortArrayDeque) deque).forEach(new ShortProcedure() {
int index = 0;
public void apply(short v)
{
assertEquals2(sequence.buffer[index++], v);
count.value++;
}
});
assertEquals(count.value, deque.size());
}
/* */
@Test
/* removeIf:applied. */
public void testDescendingForEachWithProcedure()
{
deque.addLast(sequence);
final IntHolder count = new IntHolder();
((ShortArrayDeque) deque).descendingForEach(new ShortProcedure() {
int index = sequence.size();
public void apply(short v)
{
assertEquals2(sequence.buffer[--index], v);
count.value++;
}
});
assertEquals(count.value, deque.size());
}
/* removeIf:applied. */
/* */
@Test
public void testHashCodeEquals()
{
ShortArrayDeque l0 = ShortArrayDeque.from();
assertEquals(1, l0.hashCode());
assertEquals(l0, ShortArrayDeque.from());
ShortArrayDeque l1 = ShortArrayDeque.from(
(short) 1,
(short) 2,
(short) 3);
ShortArrayDeque l2 = ShortArrayDeque.from(
(short) 1,
(short) 2,
(short) 3);
assertEquals(l1.hashCode(), l2.hashCode());
assertEquals(l1, l2);
}
/* removeIf:applied. */
}