package edu.stanford.nlp.util;
import junit.framework.TestCase;
/**
* @author Christopher Manning
*/
public class PriorityQueueTest extends TestCase {
public void testBinaryHeapPriorityQueue() {
runBasicTests("edu.stanford.nlp.util.BinaryHeapPriorityQueue");
runRelaxingTests("edu.stanford.nlp.util.BinaryHeapPriorityQueue");
}
public void testFixedPrioritiesPriorityQueue() {
runBasicTests("edu.stanford.nlp.util.FixedPrioritiesPriorityQueue");
runNotRelaxingTests("edu.stanford.nlp.util.FixedPrioritiesPriorityQueue");
}
private static void runBasicTests(String className) {
PriorityQueue<String> queue;
try {
queue = ErasureUtils.uncheckedCast(Class.forName(className).newInstance());
} catch (Exception e) {
fail(e.toString());
return;
}
runBasicTests(queue);
}
protected static void runBasicTests(PriorityQueue<String> queue) {
queue.add("a", 1.0);
assertEquals("Added a:1", "[a=1.0]", queue.toString());
queue.add("b", 2.0);
assertEquals("Added b:2", "[b=2.0, a=1.0]", queue.toString());
queue.add("c", 1.5);
assertEquals("Added c:1.5", "[b=2.0, c=1.5, a=1.0]", queue.toString());
assertEquals("removeFirst()", "b", queue.removeFirst());
assertEquals("queue", "[c=1.5, a=1.0]", queue.toString());
assertEquals("removeFirst()", "c", queue.removeFirst());
assertEquals("queue", "[a=1.0]", queue.toString());
assertEquals("removeFirst()", "a", queue.removeFirst());
assertTrue(queue.isEmpty());
}
private static void runRelaxingTests(String className) {
BinaryHeapPriorityQueue<String> queue;
try {
queue = ErasureUtils.uncheckedCast(Class.forName(className).newInstance());
} catch (Exception e) {
fail(e.toString());
return;
}
runRelaxingTests(queue);
}
protected static void runRelaxingTests(BinaryHeapPriorityQueue<String> queue) {
queue.add("a", 1.0);
assertEquals("Added a:1", "[a=1.0]", queue.toString());
queue.add("b", 2.0);
assertEquals("Added b:2", "[b=2.0, a=1.0]", queue.toString());
queue.add("c", 1.5);
assertEquals("Added c:1.5", "[b=2.0, c=1.5, a=1.0]", queue.toString());
queue.relaxPriority("a", 3.0);
assertEquals("Increased a to 3", "[a=3.0, b=2.0, c=1.5]", queue.toString());
queue.decreasePriority("b", 0.0);
assertEquals("Decreased b to 0", "[a=3.0, c=1.5, b=0.0]", queue.toString());
assertEquals("removeFirst()", "a", queue.removeFirst());
assertEquals("queue", "[c=1.5, b=0.0]", queue.toString());
assertEquals("removeFirst()", "c", queue.removeFirst());
assertEquals("queue", "[b=0.0]", queue.toString());
assertEquals("removeFirst()", "b", queue.removeFirst());
assertTrue(queue.isEmpty());
}
private static void runNotRelaxingTests(String className) {
FixedPrioritiesPriorityQueue<String> pq;
try {
pq = ErasureUtils.uncheckedCast(Class.forName(className).newInstance());
} catch (Exception e) {
fail(e.toString());
return;
}
assertEquals("[]", pq.toString());
pq.add("one",1);
assertEquals("[one=1.0]", pq.toString());
pq.add("three",3);
assertEquals("[three=3.0, one=1.0]", pq.toString());
pq.add("one",1.1);
assertEquals("[three=3.0, one=1.1, one=1.0]", pq.toString());
pq.add("two",2);
assertEquals("[three=3.0, two=2.0, one=1.1, one=1.0]", pq.toString());
assertEquals("[three=3.000, two=2.000, ...]", pq.toString(2));
FixedPrioritiesPriorityQueue<String> clone = pq.clone();
assertEquals(3.0, clone.getPriority());
assertEquals(pq.next(), clone.next());
assertEquals(2.0, clone.getPriority());
assertEquals(pq.next(), clone.next());
assertEquals(1.1, clone.getPriority());
assertEquals(pq.next(), clone.next());
assertEquals(1.0, clone.getPriority());
assertEquals(pq.next(), clone.next());
assertFalse(clone.hasNext());
assertTrue(clone.isEmpty());
}
}