// Copyright (c) 2003 Dustin Sallings <dustin@spy.net>
package net.spy.util;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;
/**
* Test range operations.
*/
public class RangeTest extends TestCase {
/**
* Get an instance of RangeTest.
*/
public RangeTest(String name) {
super(name);
}
/**
* Get the test suite.
*/
public static Test suite() {
return new TestSuite(RangeTest.class);
}
/**
* Run the test.
*/
public static void main(String args[]) {
junit.textui.TestRunner.run(suite());
}
/**
* Test the Comparable implementation (sorting).
*/
@SuppressWarnings("unchecked")
public void testRangeSorting() {
Integer a=new Integer(1);
Integer b=new Integer(2);
Integer c=new Integer(3);
Integer d=new Integer(4);
Integer e=new Integer(5);
Integer f=new Integer(6);
String[] sortedVals={
"null-1", "null-2", "1-1", "1-2", "1-null", "2-2",
"2-3", "2-null", "3-3", "3-4", "4-4", "4-5", "5-5", "5-6", "6-6"
};
ArrayList<Range<Integer>> al=new ArrayList<Range<Integer>>();
al.add(new Range<Integer>(null, a));
al.add(new Range<Integer>(null, b));
al.add(new Range<Integer>(a, a));
al.add(new Range<Integer>(a, b));
al.add(new Range<Integer>(a, null));
al.add(new Range<Integer>(b, b));
al.add(new Range<Integer>(b, null));
al.add(new Range<Integer>(b, c));
al.add(new Range<Integer>(c, c));
al.add(new Range<Integer>(c, d));
al.add(new Range<Integer>(d, d));
al.add(new Range<Integer>(d, e));
al.add(new Range<Integer>(e, e));
al.add(new Range<Integer>(e, f));
al.add(new Range<Integer>(f, f));
// Unsort
Collections.shuffle(al);
// Sort
Collections.sort(al);
// Validate the order
for(int i=0; i<sortedVals.length; i++) {
Range r=al.get(i);
String tmps=r.getLow() + "-" + r.getHigh();
assertEquals("Sort failure", sortedVals[i], tmps);
}
}
public void testSimpleCompare() {
Integer a=new Integer(1);
Integer b=new Integer(2);
assertEquals(0,
new Range<Integer>(a, b).compareTo(new Range<Integer>(a, b)));
assertEquals(1,
new Range<Integer>(a, null).compareTo(new Range<Integer>(a, b)));
assertEquals(-1,
new Range<Integer>(a, b).compareTo(new Range<Integer>(a, null)));
assertEquals(0,
new Range<Integer>(a, null).compareTo(new Range<Integer>(a, null)));
assertEquals(-1,
new Range<Integer>(null, a).compareTo(new Range<Integer>(a, null)));
assertEquals(1,
new Range<Integer>(a, null).compareTo(new Range<Integer>(null, a)));
}
@SuppressWarnings("unchecked")
public void testRangeEquality() {
ArrayList<Range<Integer>> al=new ArrayList<Range<Integer>>();
Integer a=new Integer(1);
Integer b=new Integer(2);
al.add(new Range<Integer>(null, a));
al.add(new Range<Integer>(null, b));
al.add(new Range<Integer>(a, a));
al.add(new Range<Integer>(a, b));
al.add(new Range<Integer>(a, null));
al.add(new Range<Integer>(b, b));
al.add(new Range<Integer>(b, null));
HashSet<Range<Integer>> hs=new HashSet<Range<Integer>>(al);
assertEquals(al.size(), hs.size());
// Make sure they can all be looked up
for(Iterator i=al.iterator(); i.hasNext();) {
assertTrue(hs.contains(i.next()));
}
}
public void testForeignEquality() {
Range<Integer> r=new Range<Integer>(new Integer(0), new Integer(1));
assertFalse(r.equals("x"));
}
// Verify r.contains(c)
@SuppressWarnings("unchecked")
private void assertRangeHit(Range r, Comparable c) {
// System.out.println("Expecting " + c + " in " + r);
assertTrue(r + " should contain " + c, r.contains(c));
}
// Verify !r.contains(c)
@SuppressWarnings("unchecked")
private void assertRangeMiss(Range r, Comparable c) {
// System.out.println("Not expecting " + c + " in " + r);
assertTrue(r + " should not contain " + c, (!r.contains(c)));
}
@SuppressWarnings("unchecked")
private void assertInvalidConstruct(Comparable l, Comparable h) {
try {
Range r=new Range(l, h);
fail("Allowed to make range from " + l + " to " + h + ": " + r);
} catch(IllegalArgumentException e) {
// pass
}
}
public void testBadConstructors() {
assertInvalidConstruct(null, null);
assertInvalidConstruct(new Integer(2), new Integer(1));
}
public void testDefaultParams() {
Range<Integer> r=new Range<Integer>(new Integer(0), new Integer(100));
assertEquals(Range.MatchType.INCLUSIVE, r.getLowMatch());
assertEquals(Range.MatchType.INCLUSIVE, r.getHighMatch());
}
public void testRangeOperations() {
Integer a=new Integer(3);
Integer b=new Integer(9);
// Build some ranges
Range<Integer> athroughb=new Range<Integer>(a, b);
Range<Integer> athrougha=new Range<Integer>(a, a);
Range<Integer> nullthroughb=new Range<Integer>(null, b);
Range<Integer> bthroughnull=new Range<Integer>(b, null);
// Exclusive matched ends
Range<Integer> athroughbx=new Range<Integer>(a, b);
athroughbx.setHighMatch(Range.MatchType.EXCLUSIVE);
Range<Integer> axthroughb=new Range<Integer>(a, b);
axthroughb.setLowMatch(Range.MatchType.EXCLUSIVE);
Range<Integer> axthroughbx=new Range<Integer>(a, b);
axthroughbx.setLowMatch(Range.MatchType.EXCLUSIVE);
axthroughbx.setHighMatch(Range.MatchType.EXCLUSIVE);
// Things to look for
Integer a0=new Integer(1);
Integer b0=new Integer(7);
Integer c=new Integer(137);
assertRangeHit(athrougha, a);
assertRangeMiss(athrougha, a0);
assertRangeMiss(athrougha, b);
assertRangeMiss(athrougha, null);
assertRangeHit(athroughb, a);
assertRangeHit(athroughb, b);
assertRangeHit(athroughb, b0);
assertRangeMiss(athroughb, a0);
assertRangeMiss(athroughb, c);
assertRangeMiss(athroughb, null);
assertRangeHit(nullthroughb, a0);
assertRangeHit(nullthroughb, a);
assertRangeHit(nullthroughb, b);
assertRangeMiss(nullthroughb, c);
assertRangeMiss(nullthroughb, null);
assertRangeHit(bthroughnull, b);
assertRangeHit(bthroughnull, c);
assertRangeMiss(bthroughnull, a);
assertRangeMiss(bthroughnull, null);
assertRangeHit(athroughbx, a);
assertRangeHit(athroughbx, b0);
assertRangeMiss(athroughbx, a0);
assertRangeMiss(athroughbx, b);
assertRangeMiss(athroughbx, c);
assertRangeHit(axthroughb, b);
assertRangeHit(axthroughb, b0);
assertRangeMiss(axthroughb, a);
assertRangeMiss(axthroughb, a0);
assertRangeMiss(axthroughb, c);
assertRangeHit(axthroughbx, b0);
assertRangeMiss(axthroughbx, a);
assertRangeMiss(axthroughbx, b);
assertRangeMiss(axthroughbx, a0);
assertRangeMiss(axthroughbx, c);
}
}