blob: 05af831f9c70f98ac68cae71637334379370e938 [file] [log] [blame]
package com.badlogic.gdx.utils;
import static org.junit.Assert.*;
import java.util.Iterator;
import org.junit.Test;
public class QueueTest {
@Test
public void resizableQueueTest () {
final Queue<Integer> q = new Queue<Integer>(8);
assertTrue("New queue is not empty!", q.size == 0);
for (int i = 0; i < 100; i++) {
for (int j = 0; j < i; j++) {
try {
q.addLast(j);
} catch (IllegalStateException e) {
fail("Failed to add element " + j + " (" + i + ")");
}
final Integer peeked = q.last();
assertTrue("peekLast shows " + peeked + ", should be " + j + " (" + i + ")", peeked.equals(j));
final int size = q.size;
assertTrue("Size should be " + (j + 1) + " but is " + size + " (" + i + ")", size == j + 1);
}
if (i != 0) {
final Integer peek = q.first();
assertTrue("First thing is not zero but " + peek + " (" + i + ")", peek == 0);
}
for (int j = 0; j < i; j++) {
final Integer pop = q.removeFirst();
assertTrue("Popped should be " + j + " but is " + pop + " (" + i + ")", pop == j);
final int size = q.size;
assertTrue("Size should be " + (i - 1 - j) + " but is " + size + " (" + i + ")", size == i - 1 - j);
}
assertTrue("Not empty after cycle " + i, q.size == 0);
}
for (int i = 0; i < 56; i++) {
q.addLast(42);
}
q.clear();
assertTrue("Clear did not clear properly", q.size == 0);
}
/** Same as resizableQueueTest, but in reverse */
@Test
public void resizableDequeTest () {
final Queue<Integer> q = new Queue<Integer>(8);
assertTrue("New deque is not empty!", q.size == 0);
for (int i = 0; i < 100; i++) {
for (int j = 0; j < i; j++) {
try {
q.addFirst(j);
} catch (IllegalStateException e) {
fail("Failed to add element " + j + " (" + i + ")");
}
final Integer peeked = q.first();
assertTrue("peek shows " + peeked + ", should be " + j + " (" + i + ")", peeked.equals(j));
final int size = q.size;
assertTrue("Size should be " + (j + 1) + " but is " + size + " (" + i + ")", size == j + 1);
}
if (i != 0) {
final Integer peek = q.last();
assertTrue("Last thing is not zero but " + peek + " (" + i + ")", peek == 0);
}
for (int j = 0; j < i; j++) {
final Integer pop = q.removeLast();
assertTrue("Popped should be " + j + " but is " + pop + " (" + i + ")", pop == j);
final int size = q.size;
assertTrue("Size should be " + (i - 1 - j) + " but is " + size + " (" + i + ")", size == i - 1 - j);
}
assertTrue("Not empty after cycle " + i, q.size == 0);
}
for (int i = 0; i < 56; i++) {
q.addFirst(42);
}
q.clear();
assertTrue("Clear did not clear properly", q.size == 0);
}
@Test
public void getTest () {
final Queue<Integer> q = new Queue<Integer>(7);
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 4; j++) {
q.addLast(j);
}
assertEquals("get(0) is not equal to peek (" + i + ")", q.get(0), q.first());
assertEquals("get(size-1) is not equal to peekLast (" + i + ")", q.get(q.size - 1), q.last());
for (int j = 0; j < 4; j++) {
assertTrue(q.get(j) == j);
}
for (int j = 0; j < 4 - 1; j++) {
q.removeFirst();
assertEquals("get(0) is not equal to peek (" + i + ")", q.get(0), q.first());
}
q.removeFirst();
assert q.size == 0; // Failing this means broken test
try {
q.get(0);
fail("get() on empty queue did not throw");
} catch (IndexOutOfBoundsException ignore) {
// Expected
}
}
}
@Test
public void removeTest () {
final Queue<Integer> q = new Queue<Integer>();
// Test head < tail.
for (int j = 0; j <= 6; j++)
q.addLast(j);
assertValues(q, 0, 1, 2, 3, 4, 5, 6);
q.removeIndex(0);
assertValues(q, 1, 2, 3, 4, 5, 6);
q.removeIndex(1);
assertValues(q, 1, 3, 4, 5, 6);
q.removeIndex(4);
assertValues(q, 1, 3, 4, 5);
q.removeIndex(2);
assertValues(q, 1, 3, 5);
// Test head >= tail and index >= head.
q.clear();
for (int j = 2; j >= 0; j--)
q.addFirst(j);
for (int j = 3; j <= 6; j++)
q.addLast(j);
assertValues(q, 0, 1, 2, 3, 4, 5, 6);
q.removeIndex(1);
assertValues(q, 0, 2, 3, 4, 5, 6);
q.removeIndex(0);
assertValues(q, 2, 3, 4, 5, 6);
// Test head >= tail and index < tail.
q.clear();
for (int j = 2; j >= 0; j--)
q.addFirst(j);
for (int j = 3; j <= 6; j++)
q.addLast(j);
assertValues(q, 0, 1, 2, 3, 4, 5, 6);
q.removeIndex(5);
assertValues(q, 0, 1, 2, 3, 4, 6);
q.removeIndex(5);
assertValues(q, 0, 1, 2, 3, 4);
}
@Test
public void indexOfTest () {
final Queue<Integer> q = new Queue<Integer>();
// Test head < tail.
for (int j = 0; j <= 6; j++)
q.addLast(j);
for (int j = 0; j <= 6; j++)
assertEquals(q.indexOf(j, false), j);
// Test head >= tail.
q.clear();
for (int j = 2; j >= 0; j--)
q.addFirst(j);
for (int j = 3; j <= 6; j++)
q.addLast(j);
for (int j = 0; j <= 6; j++)
assertEquals(q.indexOf(j, false), j);
}
@Test
public void iteratorTest () {
final Queue<Integer> q = new Queue<Integer>();
// Test head < tail.
for (int j = 0; j <= 6; j++)
q.addLast(j);
Iterator<Integer> iter = q.iterator();
for (int j = 0; j <= 6; j++)
assertEquals(iter.next().intValue(), j);
iter = q.iterator();
iter.next();
iter.remove();
assertValues(q, 1, 2, 3, 4, 5, 6);
iter.next();
iter.remove();
assertValues(q, 2, 3, 4, 5, 6);
iter.next();
iter.next();
iter.remove();
assertValues(q, 2, 4, 5, 6);
iter.next();
iter.next();
iter.next();
iter.remove();
assertValues(q, 2, 4, 5);
// Test head >= tail.
q.clear();
for (int j = 2; j >= 0; j--)
q.addFirst(j);
for (int j = 3; j <= 6; j++)
q.addLast(j);
iter = q.iterator();
for (int j = 0; j <= 6; j++)
assertEquals(iter.next().intValue(), j);
iter = q.iterator();
iter.next();
iter.remove();
assertValues(q, 1, 2, 3, 4, 5, 6);
iter.next();
iter.remove();
assertValues(q, 2, 3, 4, 5, 6);
iter.next();
iter.next();
iter.remove();
assertValues(q, 2, 4, 5, 6);
iter.next();
iter.next();
iter.next();
iter.remove();
assertValues(q, 2, 4, 5);
}
@Test
public void toStringTest () {
Queue<Integer> q = new Queue<Integer>(1);
assertTrue(q.toString().equals("[]"));
q.addLast(4);
assertTrue(q.toString().equals("[4]"));
q.addLast(5);
q.addLast(6);
q.addLast(7);
assertTrue(q.toString().equals("[4, 5, 6, 7]"));
}
@Test
public void hashEqualsText () {
Queue<Integer> q1 = new Queue<Integer>();
Queue<Integer> q2 = new Queue<Integer>();
assertEqualsAndHash(q1, q2);
q1.addFirst(1);
assertNotEquals(q1, q2);
q2.addFirst(1);
assertEqualsAndHash(q1, q2);
q1.clear();
q1.addLast(1);
q1.addLast(2);
q2.addLast(2);
assertEqualsAndHash(q1, q2);
for (int i = 0; i < 100; i++) {
q1.addLast(i);
q1.addLast(i);
q1.removeFirst();
assertNotEquals(q1, q2);
q2.addLast(i);
q2.addLast(i);
q2.removeFirst();
assertEqualsAndHash(q1, q2);
}
}
private void assertEqualsAndHash (Queue<?> q1, Queue<?> q2) {
assertEquals(q1, q2);
assertEquals("Hash codes are not equal", q1.hashCode(), q2.hashCode());
}
private void assertValues (Queue<Integer> q, Integer... values) {
for (int i = 0, n = values.length; i < n; i++)
if (values[i] != q.get(i)) fail(q + " != " + new Array(values));
}
}