/*
* File: QuadtreeTest.java
* Authors: Justin Basilico
* Company: Sandia National Laboratories
* Project: Cognitive Foundry
*
* Copyright May 21, 2008, Sandia Corporation.
* Under the terms of Contract DE-AC04-94AL85000, there is a non-exclusive
* license for use of this work by or on behalf of the U.S. Government. Export
* of this program may require a license from the United States Government.
* See CopyrightHistory.txt for complete details.
*
*/
package gov.sandia.cognition.math.geometry;
import gov.sandia.cognition.math.matrix.Vector;
import gov.sandia.cognition.math.matrix.mtj.Vector2;
import gov.sandia.cognition.math.matrix.mtj.Vector3;
import java.awt.geom.Rectangle2D;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Random;
import junit.framework.TestCase;
/**
*
* @author Justin Basilico
*/
public class QuadtreeTest extends TestCase
{
protected Random random;
public QuadtreeTest(String testName)
{
super(testName);
this.random = new Random();
}
public void testConstructors()
{
int splitThreshold = Quadtree.DEFAULT_SPLIT_THRESHOLD;
Quadtree<Vector> instance = new Quadtree<Vector>();
assertEquals(splitThreshold, instance.getSplitThreshold());
splitThreshold /= 2;
instance = new Quadtree<Vector>(splitThreshold);
assertEquals(splitThreshold, instance.getSplitThreshold());
ArrayList<Vector2> items = new ArrayList<Vector2>();
for (int i = 0; i < 100; i++)
{
items.add(new Vector2(Math.random(), Math.random()));
}
instance = new Quadtree<Vector>(2, items);
}
/**
* Test of add method, of class Quadtree.
*/
public void testAdd()
{
Quadtree<Vector> instance = new Quadtree<Vector>();
Vector2 item1 = new Vector2(1.0, 1.0);
Vector2 item2 = new Vector2(-1.0, 5.0);
Vector2 item3 = new Vector2(0.0, 1.0);
assertFalse(instance.boundsContain(item1));
assertFalse(instance.boundsContain(item2));
assertFalse(instance.boundsContain(item3));
instance.add(item1);
assertTrue(instance.boundsContain(item1));
assertFalse(instance.boundsContain(item2));
assertFalse(instance.boundsContain(item3));
instance.add(item2);
assertTrue(instance.boundsContain(item1));
assertTrue(instance.boundsContain(item2));
assertTrue(instance.boundsContain(item3));
instance.setSplitThreshold(1);
assertTrue(instance.boundsContain(item1));
assertTrue(instance.boundsContain(item2));
assertTrue(instance.boundsContain(item3));
}
/**
* Test of addAll method, of class Quadtree.
*/
public void testAddAll()
{
Quadtree<Vector> instance = new Quadtree<Vector>();
Vector2 item1 = new Vector2(1.0, 1.0);
Vector2 item2 = new Vector2(-1.0, 5.0);
Vector2 item3 = new Vector2(0.0, 1.0);
Vector2 item4 = new Vector2(0.0, -1.0);
assertFalse(instance.boundsContain(item1));
assertFalse(instance.boundsContain(item2));
assertFalse(instance.boundsContain(item3));
assertFalse(instance.boundsContain(item4));
ArrayList<Vector2> items = new ArrayList<Vector2>();
instance.addAll(items);
assertFalse(instance.boundsContain(item1));
assertFalse(instance.boundsContain(item2));
assertFalse(instance.boundsContain(item3));
assertFalse(instance.boundsContain(item4));
items.add(item1);
items.add(item2);
items.add(item3);
instance.addAll(items);
assertTrue(instance.boundsContain(item1));
assertTrue(instance.boundsContain(item2));
assertTrue(instance.boundsContain(item3));
assertFalse(instance.boundsContain(item4));
}
/**
* Test of convertTo2D method, of class Quadtree.
*/
public void testConvertTo2D()
{
Quadtree<Vector> instance = new Quadtree<Vector>();
Vector2 item = new Vector2(random.nextDouble(), random.nextDouble());
Vector2 result = instance.convertTo2D(item);
assertEquals(item, result);
boolean exceptionThrown = false;
try
{
instance.convertTo2D(new Vector3());
}
catch (IllegalArgumentException e)
{
exceptionThrown = true;
}
finally
{
assertTrue(exceptionThrown);
}
}
/**
* Test of find method, of class Quadtree.
*/
public void testFind()
{
Quadtree<Vector> instance = new Quadtree<Vector>(2);
Vector2 item1 = new Vector2(1.0, 1.0);
Vector2 item2 = new Vector2(-1.0, 5.0);
Vector2 item3 = new Vector2(0.0, 1.0);
Vector2 item4 = new Vector2(0.0, -1.0);
assertNull(instance.find(item1));
assertNull(instance.find(item2));
assertNull(instance.find(item3));
assertNull(instance.find(item4));
instance.add(item1);
assertSame(instance.getRoot(), instance.find(item1));
assertNull(instance.find(item2));
assertNull(instance.find(item3));
assertNull(instance.find(item4));
instance.add(item2);
assertSame(instance.getRoot(), instance.find(item1));
assertSame(instance.getRoot(), instance.find(item2));
assertSame(instance.getRoot(), instance.find(item3));
assertNull(instance.find(item4));
instance.add(item3);
assertNotSame(instance.getRoot(), instance.find(item1));
assertNotSame(instance.getRoot(), instance.find(item2));
assertNotSame(instance.getRoot(), instance.find(item3));
assertNull(instance.find(item4));
assertSame(instance.find(item1), instance.find(item3));
assertNotSame(instance.find(item1), instance.find(item2));
assertEquals(1, instance.find(item1).getDepth());
assertEquals(1, instance.find(item2).getDepth());
assertEquals(1, instance.find(item3).getDepth());
instance.add(item2);
instance.add(item2);
instance.add(item2);
assertEquals(1, instance.find(item1).getDepth());
assertEquals(1, instance.find(item2).getDepth());
assertEquals(1, instance.find(item3).getDepth());
instance.add(item4);
assertEquals(2, instance.find(item1).getDepth());
assertEquals(1, instance.find(item2).getDepth());
assertEquals(2, instance.find(item3).getDepth());
assertEquals(2, instance.find(item4).getDepth());
instance.setSplitThreshold(10);
assertSame(instance.getRoot(), instance.find(item1));
assertSame(instance.getRoot(), instance.find(item2));
assertSame(instance.getRoot(), instance.find(item3));
assertSame(instance.getRoot(), instance.find(item4));
}
public void testFindNodes()
{
Quadtree<Vector> instance = new Quadtree<Vector>(2);
instance.add(new Vector2(1.0, 1.0));
instance.add(new Vector2(-1.0, 5.0));
instance.add(new Vector2(0.0, 1.0));
instance.add(new Vector2(0.0, -1.0));
LinkedList<Quadtree<Vector>.Node> result = instance.findNodes(
new Rectangle2D.Double(-10.0, -10.0, 20, 20));
assertEquals(1, result.size());
}
/**
* Test of isInBounds method, of class Quadtree.
*/
public void testIsInBounds()
{
Quadtree<Vector> instance = new Quadtree<Vector>(2);
Vector2 item1 = new Vector2(1.0, 1.0);
Vector2 item2 = new Vector2(-1.0, 5.0);
Vector2 item3 = new Vector2(0.0, 1.0);
Vector2 item4 = new Vector2(0.0, -1.0);
assertFalse(instance.boundsContain(0.0, 0.0));
assertFalse(instance.boundsContain(item1));
assertFalse(instance.boundsContain(item2));
assertFalse(instance.boundsContain(item3));
assertFalse(instance.boundsContain(item4));
instance.add(item1);
assertTrue(instance.boundsContain(item1));
assertFalse(instance.boundsContain(item2));
assertFalse(instance.boundsContain(item3));
assertFalse(instance.boundsContain(item4));
instance.add(item2);
assertTrue(instance.boundsContain(item1));
assertTrue(instance.boundsContain(item2));
assertTrue(instance.boundsContain(item3));
assertFalse(instance.boundsContain(item4));
}
/**
* Test of getSplitThreshold method, of class Quadtree.
*/
public void testGetSplitThreshold()
{
this.testSetSplitThreshold();
}
/**
* Test of setSplitThreshold method, of class Quadtree.
*/
public void testSetSplitThreshold()
{
int splitThreshold = Quadtree.DEFAULT_SPLIT_THRESHOLD;
Quadtree<Vector2> instance = new Quadtree<Vector2>();
assertEquals(splitThreshold, instance.getSplitThreshold());
splitThreshold = 1;
instance.setSplitThreshold(splitThreshold);
assertEquals(splitThreshold, instance.getSplitThreshold());
splitThreshold = 100;
instance.setSplitThreshold(splitThreshold);
assertEquals(splitThreshold, instance.getSplitThreshold());
boolean exceptionThrown = false;
try
{
instance.setSplitThreshold(0);
}
catch (IllegalArgumentException e)
{
exceptionThrown = true;
}
finally
{
assertTrue(exceptionThrown);
}
}
/**
* Test of getRoot method, of class Quadtree.
*/
public void testGetRoot()
{
Quadtree<Vector2> instance = new Quadtree<Vector2>();
assertNotNull(instance.getRoot());
}
}