package cc.mallet.util.tests; import cc.mallet.util.search.*; import junit.framework.*; /** * Created by IntelliJ IDEA. * User: pereira * Date: Jun 18, 2005 * Time: 11:19:36 PM * Test priority queues and their implementation. */ public class TestPriorityQueue extends TestCase { private static final int N = 100; private static class Item implements QueueElement { private int position; private double priority; private Item(double p) { priority = p; } public double getPriority() { return priority; }; public void setPriority(double p) { priority = p; } public int getPosition() { return position; } public void setPosition(int p) { position = p; } } public TestPriorityQueue(String name) { super(name); } public void testAscending() { PriorityQueue q = new MinHeap(N); double p[] = new double[N]; for (int i = 0; i < N; i++) { p[i] = i; Item e = new Item(i); q.insert(e); } int j = 0; double pr = Double.NEGATIVE_INFINITY; assertTrue("ascending size", q.size() == N); while (q.size() > 0) { assertTrue("ascending extract", j < N); QueueElement e = q.extractMin(); assertTrue("ascending order", e.getPriority() > pr); assertEquals("ascending priority", e.getPriority(), p[j++], 1e-5); pr = e.getPriority(); } } public void testDescending() { PriorityQueue q = new MinHeap(N); double p[] = new double[N]; for (int i = 0; i < N; i++) { p[i] = i; Item e = new Item(N-i-1); q.insert(e); } int j = 0; double pr = Double.NEGATIVE_INFINITY; assertTrue("descending size", q.size() == N); while (q.size() > 0) { assertTrue("descending extract", j < N); QueueElement e = q.extractMin(); assertTrue("descending order", e.getPriority() > pr); assertEquals("descending priority", e.getPriority(), p[j++], 1e-5); pr = e.getPriority(); } } public void testChangePriority () { PriorityQueue q = new MinHeap(N); Item items[] = new Item[N]; for (int i = 0; i < N; i++) { Item e = new Item(N-i-1); q.insert(e); items[i] = e; } q.changePriority (items[N-1], -2); q.changePriority (items[N/2], -1); q.changePriority (items[N/2 + 1], N*2); int j = 0; double pr_last = Double.NEGATIVE_INFINITY; assertTrue("descending size", q.size() == N); while (q.size() > 0) { assertTrue("descending extract", j < N); QueueElement e = q.extractMin(); assertTrue("descending order", e.getPriority() > pr_last); pr_last = e.getPriority(); if (j == 0) assertTrue ("lowest elt", e.getPriority () == -2); if (j == 1) assertTrue ("second-lowest elt", e.getPriority () == -1); if (q.size() == 1) assertTrue ("penultimate elt", e.getPriority () == N-1); if (q.size() == 0) assertTrue ("final elt", e.getPriority () == N*2); j++; } } public void testReverse () { PriorityQueue q = new MinHeap(N); Item items[] = new Item[N]; for (int i = 0; i < N; i++) { Item e = new Item(N-i-1); q.insert(e); items[i] = e; } for (int i = 0; i < N; i++) { q.changePriority (items[i], i); } int j = 0; double pr_last = Double.NEGATIVE_INFINITY; assertTrue("ascending size", q.size() == N); while (q.size() > 0) { assertTrue("ascending extract", j < N); QueueElement e = q.extractMin(); assertTrue("ascending order", e.getPriority() > pr_last); pr_last = e.getPriority(); assertEquals ("ascending priority", items[j].getPriority (), e.getPriority ()); assertEquals ("ascending identity", items[j], e); j++; } } public void testEqualKeys () { PriorityQueue q = new MinHeap (N); Item[] items = new Item[20]; int j = 0; for (int i = 0; i < 5; i++) { items[j] = new Item (5); q.insert (items[j]); j++; } for (int i = 0; i < 5; i++) { items[j] = new Item (3); q.insert (items[j]); j++; } for (int i = 0; i < 5; i++) { items[j] = new Item (4); q.insert (items[j]); j++; } for (int i = 0; i < 5; i++) { items[j] = new Item (7); q.insert (items[j]); j++; } assertEquals (20, q.size ()); for (int i = 0; i < items.length; i++) { assertTrue (q.contains (items[i])); } for (int i = 0; i < 5; i++) { QueueElement e = q.extractMin (); assertTrue (q.contains (q.min ())); assertEquals (3.0, e.getPriority ()); } for (int i = 0; i < 5; i++) { QueueElement e = q.extractMin (); assertTrue (q.contains (q.min ())); assertEquals (4.0, e.getPriority ()); } for (int i = 0; i < 5; i++) { QueueElement e = q.extractMin (); assertTrue (q.contains (q.min ())); assertEquals (5.0, e.getPriority ()); } for (int i = 0; i < 5; i++) { QueueElement e = q.extractMin (); if (q.size() > 0) assertTrue (q.contains (q.min ())); assertEquals (7.0, e.getPriority ()); } } public static Test suite() { return new TestSuite(TestPriorityQueue.class); } public static void main(String[] args) { junit.textui.TestRunner.run(suite()); } }