package com.limegroup.gnutella.util;
import java.util.Iterator;
import java.util.NoSuchElementException;
import junit.framework.Test;
import com.limegroup.gnutella.Endpoint;
/**
* Unit tests for BucketQueue
*/
public class BucketQueueTest extends BaseTestCase {
public BucketQueueTest(String name) {
super(name);
}
public static Test suite() {
return buildTestSuite(BucketQueueTest.class);
}
public static void main(String[] args) {
junit.textui.TestRunner.run(suite());
}
/**
* Tests the method for removing objects.
*
* @throws Exception
*/
public void testRemoveAll() throws Exception {
Object o = new Object();
int priorities = 10;
BucketQueue bq = new BucketQueue(priorities, 5);
for(int i=0; i<priorities; i++) {
bq.insert(o, i);
assertTrue("should have successfully removed object",
bq.removeAll(o));
assertTrue("queue should be empty", bq.isEmpty());
}
}
public void testIterator() throws Exception {
BucketQueue bq = new BucketQueue(5, 10);
//Integer curInt = new Integer(4);
for(int i=0; i<5; i++) {
Integer curInt = new Integer(i);
bq.insert(curInt, i);
}
Iterator iter = bq.iterator();
Integer first = (Integer)iter.next();
assertEquals("unexpected priority", 4, first.intValue());
//while(iter.hasNext()) {
// Integer curInt = (Integer)iter.next();
//}
}
public void testLegacy() {
Endpoint e4=new Endpoint("1.2.3.4", 1);
Endpoint e2a=new Endpoint("1.2.3.4", 1);
Endpoint e2b=new Endpoint("1.2.3.4", 1);
Endpoint e0=new Endpoint("1.2.3.4", 1);
BucketQueue q=new BucketQueue(5, 10);
assertTrue(q.isEmpty());
assertNull(q.insert(e0, 0));
assertNull(q.insert(e4, 4));
assertNull(q.insert(e2b, 2));
assertNull(q.insert(e2a, 2));
assertEquals(4, q.size());
assertEquals(1, q.size(4));
assertEquals(2, q.size(2));
assertEquals(0, q.size(3));
assertTrue(! q.isEmpty());
Iterator iter=q.iterator();
assertSame(e4, iter.next());
assertSame(e2a, iter.next());
assertSame(e2b, iter.next());
assertSame(e0, iter.next());
try {
iter.next();
fail("no such element expected");
} catch (NoSuchElementException e) { }
//Make sure hasNext is idempotent
iter=q.iterator(4, 100);
assertTrue(iter.hasNext());
assertSame(e4, iter.next());
assertTrue(iter.hasNext());
assertTrue(iter.hasNext());
assertSame(e2a, iter.next());
assertTrue(iter.hasNext());
assertSame(e2b, iter.next());
assertTrue(iter.hasNext());
assertSame(e0, iter.next());
assertTrue(! iter.hasNext());
try {
iter.next();
fail("nse expected");
} catch (NoSuchElementException e) { }
iter=q.iterator(4, 2);
assertSame(e4, iter.next());
assertSame(e2a, iter.next());
assertTrue(! iter.hasNext());
iter=q.iterator(2, 3); //sorting by priority
assertTrue(iter.hasNext());
assertSame(e2a, iter.next());
assertTrue(iter.hasNext());
assertSame(e2b, iter.next());
assertTrue(iter.hasNext());
assertSame(e0, iter.next());
assertTrue(! iter.hasNext());
iter=q.iterator(1, 3); //sorting by priority
assertTrue(iter.hasNext());
assertSame(e0, iter.next());
assertTrue(! iter.hasNext());
assertSame(e4, q.getMax());
assertSame(e4, q.extractMax());
assertSame(e2a, q.extractMax());
assertSame(e2b, q.extractMax());
assertSame(e0, q.getMax());
assertSame(e0, q.extractMax());
try {
q.getMax();
fail("nse expected");
} catch (NoSuchElementException e) { }
Endpoint f1=new Endpoint("4.3.2.1", 6346);
assertTrue(!q.removeAll(f1));
assertNull(q.insert(e0, 0));
assertNull(q.insert(e4, 4));
assertNull(q.insert(f1, 1));
assertNull(q.insert(e2b, 2));
assertNull(q.insert(e2a, 2));
assertTrue(q.removeAll(e0));
assertEquals(1, q.size());
assertSame(f1, q.getMax());
assertTrue(q.removeAll(f1));
assertTrue(q.isEmpty());
//Test clone
q=new BucketQueue(new int[] {10, 10, 10, 10, 10});
q.insert(e4, 4);
q.insert(e2a, 2);
q.insert(e0, 0);
BucketQueue q2=new BucketQueue(q);
assertEquals(q.size(), q2.size());
Iterator iter1=q.iterator();
Iterator iter2=q.iterator();
while (iter1.hasNext()) {
assertEquals(iter1.next(), iter2.next());
}
assertTrue(! iter2.hasNext());
q.insert(e2b, 2);
assertEquals((q2.size()+1), q.size());
//More rigorous test of insertion. Also checks objects besides
//Endpoint.
q=new BucketQueue(3, 2);
assertNull(q.insert("oldest medium", 1));
assertNull(q.insert("older medium", 1));
assertEquals("oldest medium", q.insert("medium", 1));
assertNull(q.insert("low", 0));
assertNull(q.insert("high", 2));
assertEquals("high", q.extractMax());
assertEquals("medium", q.extractMax());
assertEquals("older medium", q.extractMax());
assertEquals("low", q.extractMax());
//Test exceptional cases
try {
q=new BucketQueue(new int[0]);
fail("illegal argument expected");
} catch (IllegalArgumentException e) { }
try {
q=new BucketQueue(new int[] {1, 2, 0});
fail("illegal argument expected");
} catch (IllegalArgumentException e) { }
try {
q=new BucketQueue(new int[] {1});
} catch (IllegalArgumentException e) {
fail("illegal argument expected");
}
try {
q=new BucketQueue(0, 1);
fail("illegal argument expected");
} catch (IllegalArgumentException e) {
}
try {
q=new BucketQueue(1, 0);
fail("illegal argument expected");
} catch (IllegalArgumentException e) {
}
q=new BucketQueue(new int[] {10, 10, 10});
try {
q.insert("oops", -1);
fail("illegal argument expected");
} catch (IllegalArgumentException e) { }
try {
q.insert("oops", 3);
fail("illegal argument expected");
} catch (IllegalArgumentException e) { }
try {
q.size(-1);
fail("illegal argument expected");
} catch (IllegalArgumentException e) { }
try {
q.size(3);
fail("illegal argument expected");
} catch (IllegalArgumentException e) { }
try {
iter=q.iterator(-1, 1);
fail("illegal argument expected");
} catch (IllegalArgumentException e) { }
try {
iter=q.iterator(3, 1);
fail("illegal argument expected");
} catch (IllegalArgumentException e) { }
}
}