@Test public void testGetDistance_fromOutsideExtent() { QuadTree<String> qt = getTestTree(); assertContains(new String[] {"100.0, 0.0"}, qt.getDisk(160.0, 0, 60.1)); // E assertContains(new String[] {"15.0, 15.0", "15.0, 15.0 B"}, qt.getDisk(15.0, 160, 145.1)); // N assertContains(new String[] {"-15.0, 0.0"}, qt.getDisk(-60.0, 0, 45.1)); // W assertContains(new String[] {"100.0, 0.0"}, qt.getDisk(100.0, -60, 60.1)); // S }
public static void main(String[] args) { for (int i = 0; i < 5; i++) { log.info("Round " + i); measurePerformance(); } }
/** * Tests that by serializing and de-serializing a QuadTree, all important attributes * of the QuadTree are maintained. At the moment, this is essentially the size-attribute. * @throws IOException * @throws ClassNotFoundException */ @Test public void testSerialization() throws IOException, ClassNotFoundException { QuadTree<String> qt = getTestTree(); ByteArrayOutputStream outStream = new ByteArrayOutputStream(); ObjectOutputStream out = new ObjectOutputStream(outStream); out.writeObject(qt); out.close(); ByteArrayInputStream inStream = new ByteArrayInputStream(outStream.toByteArray()); ObjectInputStream in = new ObjectInputStream(inStream); QuadTree<String> qt2 = (QuadTree<String>)in.readObject(); in.close(); assertEquals(qt.size(), qt2.size()); valuesTester(qt2.size(), qt2.values()); }
@Test public void testValuesIterator_ConcurrentModification() { QuadTree<String> qt = getTestTree(); Iterator<String> iter = qt.values().iterator(); assertTrue(iter.hasNext()); assertNotNull(iter.next()); qt.put(39.0, 52.1, "39.0 52.1"); assertTrue(iter.hasNext()); // hasNext() should not yet provoke exception try { iter.next(); fail("missing exception."); } catch (ConcurrentModificationException e) { log.info("catched expected exception: ", e); } }
@Test public void testGetDistance_EntryOnDividingBorder() { QuadTree<String> qt = new QuadTree<>(0, 0, 40, 60); qt.put(10.0, 10.0, "10.0, 10.0"); qt.put(20.0, 20.0, "20.0, 20.0"); // on vertical border qt.put(20.0, 30.0, "20.0, 30.0"); // exactly on center qt.put(30.0, 30.0, "30.0, 30.0"); // on horizontal border qt.put(12.0, 15.0, "12.0, 15.0"); qt.put(10.0, 25.0, "10.0, 25.0"); assertContains(new String[] {"10.0, 10.0"}, qt.getDisk(10.0, 7.0, 3.0)); assertContains(new String[] {"10.0, 10.0"}, qt.getDisk(10.0, 12.0, 2.0)); assertContains(new String[] {"10.0, 10.0"}, qt.getDisk(7.0, 10.0, 3.0)); assertContains(new String[] {"10.0, 10.0"}, qt.getDisk(13.0, 10.0, 3.0)); assertContains(new String[] {"20.0, 20.0"}, qt.getDisk(20.0, 23.0, 3.0)); assertContains(new String[] {"20.0, 30.0"}, qt.getDisk(20.0, 27.0, 3.0)); assertContains(new String[] {"30.0, 30.0"}, qt.getDisk(27.0, 30.0, 3.0)); assertContains(new String[] {"12.0, 15.0"}, qt.getDisk(15.0, 15.0, 3.0)); assertContains(new String[] {"10.0, 25.0"}, qt.getDisk(10.0, 28.0, 3.0)); }
QuadTree<String> qt = getTestTree();
@Test public void testGetDistance_EntryOnOutsideBorder() { QuadTree<String> qt = new QuadTree<>(0.0, 0.0, 40.0, 60.0); // the 4 corners qt.put(0.0, 0.0, "SW"); qt.put(40.0, 0.0, "SE"); qt.put(0.0, 60.0, "NW"); qt.put(40.0, 60.0, "NE"); // the 4 sides qt.put(10.0, 60.0, "N"); qt.put(40.0, 10.0, "E"); qt.put(10.0, 0.0, "S"); qt.put(0.0, 10.0, "W"); assertContains(new String[] {"SW"}, qt.getDisk(3.0, 0.0, 3.0)); assertContains(new String[] {"SE"}, qt.getDisk(40.0, 3.0, 3.0)); assertContains(new String[] {"NW"}, qt.getDisk(3.0, 60.0, 3.0)); assertContains(new String[] {"NE"}, qt.getDisk(40.0, 57.0, 3.0)); assertContains(new String[] {"N"}, qt.getDisk(7.0, 60.0, 3.0)); assertContains(new String[] {"E"}, qt.getDisk(40.0, 13.0, 3.0)); assertContains(new String[] {"S"}, qt.getDisk(13.0, 0.0, 3.0)); assertContains(new String[] {"W"}, qt.getDisk(3.0, 10.0, 3.0)); }
/** * Test {@link QuadTree#clear()}. */ @Test public void testClear() { QuadTree<String> qt = getTestTree(); int size = qt.size(); assertTrue(size > 0); // it makes no sense to test clear() on an empty tree qt.clear(); assertEquals(0, qt.size()); valuesTester(0, qt.values()); }
/** * Test {@link QuadTree#execute(double, double, double, double, QuadTree.Executor)}. */ @Test public void testExecute() { QuadTree<String> qt = getTestTree(); TestExecutor executor = new TestExecutor(); int count = qt.execute(0.0, 0.0, 20.1, 20.1, executor); assertEquals(4, count); assertEquals(4, executor.objects.size()); executor = new TestExecutor(); count = qt.execute(0.0, 0.0, 20.0, 20.0, executor); assertEquals(3, count); assertEquals(3, executor.objects.size()); executor = new TestExecutor(); count = qt.execute(0.0, 0.0, 19.9, 19.9, executor); assertEquals(3, count); assertEquals(3, executor.objects.size()); executor = new TestExecutor(); count = qt.execute(null, executor); assertEquals(qt.size(), count); assertEquals(qt.size(), executor.objects.size()); }
/** * Tests that a once obtained values-collection is indeed a live view * on the QuadTree, so when the QuadTree changes, the view is updated * as well. */ @Test public void testValues_isView() { QuadTree<String> qt = getTestTree(); int size = qt.size(); Collection<String> values = qt.values(); valuesTester(qt.size(), values); qt.put(80.0, 80.0, "80.0, 80.0"); assertEquals(size + 1, qt.size()); valuesTester(size + 1, values); qt.put(75.0, 75.0, "75.0, 75.0"); assertEquals(size + 2, qt.size()); valuesTester(size + 2, values); assertTrue(qt.remove(80.0, 80.0, "80.0, 80.0")); assertEquals(size + 1, qt.size()); valuesTester(size + 1, values); }
QuadTree<String> qt = getTestTree(); int size = qt.size(); qt = getTestTree();
/** * Test {@link QuadTree#values()} that it returns the correct content. */ @Test public void testValues() { QuadTree<String> qt = getTestTree(); int size = qt.size(); assertEquals(6, size); // generic test valuesTester(qt.size(), qt.values()); // test that values() got updated after adding an object to the tree qt.put(80.0, 80.0, "80.0, 80.0"); assertEquals(size + 1, qt.size()); valuesTester(qt.size(), qt.values()); // test that values() got updated after removing an object to the tree assertTrue(qt.remove(80.0, 80.0, "80.0, 80.0")); assertEquals(size, qt.size()); valuesTester(qt.size(), qt.values()); // and remove one more... assertTrue(qt.remove(10.0, 10.0, "10.0, 10.0")); assertEquals(size - 1, qt.size()); valuesTester(qt.size(), qt.values()); // test the iterator Iterator<String> iter = qt.values().iterator(); iter.next(); try { iter.remove(); fail("expected UnsupportedOperationException, got none."); } catch (UnsupportedOperationException expected) {} }