package com.limegroup.gnutella.util;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.NoSuchElementException;
import junit.framework.Test;
/**
* Unit tests for BinaryHeap
*/
public class BinaryHeapTest extends BaseTestCase {
private List FINALIZED = new ArrayList();
public BinaryHeapTest(String name) {
super(name);
}
public static Test suite() {
return buildTestSuite(BinaryHeapTest.class);
}
public static void main(String[] args) {
junit.textui.TestRunner.run(suite());
}
public void testLegacy() throws Exception {
BinaryHeap q=new BinaryHeap(4);
MyInteger one=new MyInteger(1);
MyInteger two=new MyInteger(2);
MyInteger three=new MyInteger(3);
MyInteger four=new MyInteger(4);
MyInteger five=new MyInteger(5);
assertTrue(q.isEmpty());
assertEquals(4, q.capacity());
assertEquals(0, q.size());
q.insert(two);
assertEquals(1, q.size());
q.insert(three);
q.insert(four);
q.insert(one);
assertTrue(q.isFull());
assertEquals(4, q.size());
assertEquals(four, q.getMax());
assertEquals(four, q.extractMax());
assertEquals(three, q.getMax());
assertEquals(three, q.extractMax());
q.insert(two);
assertEquals(two, q.extractMax());
assertEquals(two, q.extractMax());
assertEquals(one, q.extractMax());
try {
q.extractMax();
fail("no such element expected");
} catch (NoSuchElementException e) { }
//Iterator
q=new BinaryHeap(2);
assertTrue(! q.iterator().hasNext());
q.insert(one);
q.insert(two);
Iterator iter=q.iterator();
assertTrue(iter.hasNext());
//first element is max
assertEquals(two, iter.next());
assertTrue(iter.hasNext());
assertEquals(one, iter.next());
assertTrue(! iter.hasNext());
try {
iter.next();
fail("no such element expected");
} catch (NoSuchElementException e) {
}
//try inserting when overfilled
q=new BinaryHeap(4);
assertNull(q.insert(one));
assertNull(q.insert(four));
assertNull(q.insert(three));
assertTrue(! q.isFull());
assertNull(q.insert(two));
assertTrue(q.isFull());
// System.out.println("The following tests are STRONGER than required"
// +" the specification of insert.");
// System.out.println("(The spec does not say that the smallest"
// +" element is removed on overflow.)");
assertNotNull(q.insert(five));
assertEquals(new MyInteger(2), q.insert(five));
assertEquals(five, q.extractMax());
assertEquals(five, q.extractMax());
assertEquals(four, q.extractMax());
assertEquals(three, q.extractMax());
assertTrue(q.isEmpty());
}
public void testResize() throws Exception {
MyInteger one=new MyInteger(1);
MyInteger two=new MyInteger(2);
MyInteger three=new MyInteger(3);
MyInteger four=new MyInteger(4);
MyInteger five=new MyInteger(5);
BinaryHeap q=new BinaryHeap(2, true);
assertNull(q.insert(one));
assertTrue(! q.isFull());
assertNull(q.insert(four));
assertEquals(2, q.capacity());
assertTrue(q.isFull());
assertNull(q.insert(three));
assertEquals(4, q.capacity());
assertTrue(! q.isFull());
assertEquals(3, q.size());
assertEquals(5, getArray(q).length);
assertNull(getArray(q)[0]);
assertNull(q.insert(two));
assertEquals(4, q.capacity());
assertTrue(q.isFull());
assertEquals(4, q.size());
assertNull(q.insert(five));
assertEquals(8, q.capacity());
assertTrue(! q.isFull());
assertEquals(5, q.size());
assertEquals(five, q.extractMax());
assertEquals(four, q.extractMax());
assertEquals(three, q.extractMax());
assertEquals(two, q.extractMax());
assertEquals(one, q.extractMax());
assertTrue(q.isEmpty());
assertEquals(8, q.capacity());
}
public void testErasesReferences() throws Exception {
BinaryHeap heap = new BinaryHeap(50);
heap.insert(new Finalizable(1));
heap.extractMax();
System.gc();
Thread.sleep(2000);
assertEquals(1, FINALIZED.size());
assertEquals(new Integer(1), FINALIZED.get(0));
}
private static Comparable[] getArray(BinaryHeap q) throws Exception {
return (Comparable[])PrivilegedAccessor.getValue(
q, "array");
}
private class Finalizable implements Comparable {
private int id;
Finalizable(int id) {
this.id = id;
}
public int compareTo(Object other) {
return new Integer(id).compareTo(new Integer(((Finalizable)other).id));
}
protected void finalize() throws Throwable {
super.finalize();
FINALIZED.add(new Integer(id));
}
}
//For testing with Java 1.1.8
static class MyInteger implements Comparable
{
private int val;
public MyInteger(int val)
{
this.val=val;
}
public int compareTo(Object other)
{
int val2=((MyInteger)other).val;
if (val<val2)
return -1;
else if (val>val2)
return 1;
else
return 0;
}
public String toString()
{
return String.valueOf(val);
}
public boolean equals(Object o) {
return ((MyInteger)o).val == val;
}
}
}