Ticket #13460: QuadBuckets_remove.patch

File QuadBuckets_remove.patch, 4.6 KB (added by GerdP, 8 years ago)
  • src/org/openstreetmap/josm/data/osm/QuadBuckets.java

     
    501501        private QBLevel<T> currentNode;
    502502        private int contentIndex;
    503503        private int iteratedOver;
     504        QuadBuckets<T> qb;
    504505
    505506        final QBLevel<T> nextContentNode(QBLevel<T> q) {
    506507            if (q == null)
     
    521522                currentNode = nextContentNode(qb.root);
    522523            }
    523524            iteratedOver = 0;
     525            this.qb = qb;
    524526        }
    525527
    526528        @Override
     
    563565            //    an element
    564566            contentIndex--;
    565567            T object = peek();
    566             currentNode.removeContent(object);
     568            if (currentNode.removeContent(object))
     569                qb.size--;
    567570        }
    568571    }
    569572
  • test/unit/org/openstreetmap/josm/data/osm/QuadBucketsTest.java

     
    44import java.io.FileInputStream;
    55import java.io.InputStream;
    66import java.util.ArrayList;
     7import java.util.Arrays;
    78import java.util.Collection;
    89import java.util.Iterator;
    910import java.util.List;
     
    8990            removeAllTest(ds);
    9091        }
    9192    }
     93
     94    /**
     95     * Test handling of objects with invalid bbox
     96     * @throws Exception
     97     */
     98    @Test
     99    public void testSpecialBBox() throws Exception {
     100        QuadBuckets<Node> qbNodes = new QuadBuckets<>();
     101        QuadBuckets<Way> qbWays = new QuadBuckets<>();
     102        Way w1 = new Way(1);
     103        Way w2 = new Way(2);
     104        Way w3 = new Way(3);
     105        Node n1 = new Node(1);
     106        Node n2 = new Node(2); n2.setCoor(new LatLon(10, 20));
     107        Node n3 = new Node(3); n2.setCoor(new LatLon(20, 30));
     108        w2.setNodes(Arrays.asList(n1));
     109        w3.setNodes(Arrays.asList(n1, n2, n3));
     110
     111        qbNodes.add(n1);
     112        qbNodes.add(n2);
     113        Assert.assertEquals(2, qbNodes.size());
     114        Assert.assertTrue(qbNodes.contains(n1));
     115        Assert.assertTrue(qbNodes.contains(n2));
     116        Assert.assertFalse(qbNodes.contains(n3));
     117        qbNodes.remove(n1);
     118        Assert.assertEquals(1, qbNodes.size());
     119        Assert.assertFalse(qbNodes.contains(n1));
     120        Assert.assertTrue(qbNodes.contains(n2));
     121        qbNodes.remove(n2);
     122        Assert.assertEquals(0, qbNodes.size());
     123        Assert.assertFalse(qbNodes.contains(n1));
     124        Assert.assertFalse(qbNodes.contains(n2));
     125
     126        qbNodes.addAll(Arrays.asList(n1, n2, n3));
     127        qbNodes.removeAll(Arrays.asList(n1, n3));
     128        Assert.assertEquals(1, qbNodes.size());
     129        Assert.assertTrue(qbNodes.contains(n2));
     130
     131        qbWays.add(w1);
     132        qbWays.add(w2);
     133        qbWays.add(w3);
     134        Assert.assertEquals(3, qbWays.size());
     135        Assert.assertTrue(qbWays.contains(w1));
     136        Assert.assertTrue(qbWays.contains(w2));
     137        Assert.assertTrue(qbWays.contains(w3));
     138        qbWays.remove(w1);
     139        Assert.assertEquals(2, qbWays.size());
     140        Assert.assertFalse(qbWays.contains(w1));
     141        Assert.assertTrue(qbWays.contains(w2));
     142        Assert.assertTrue(qbWays.contains(w3));
     143        qbWays.remove(w2);
     144        Assert.assertEquals(1, qbWays.size());
     145        Assert.assertFalse(qbWays.contains(w1));
     146        Assert.assertFalse(qbWays.contains(w2));
     147        Assert.assertTrue(qbWays.contains(w3));
     148        qbWays.remove(w3);
     149        Assert.assertEquals(0, qbWays.size());
     150        Assert.assertFalse(qbWays.contains(w1));
     151        Assert.assertFalse(qbWays.contains(w2));
     152        Assert.assertFalse(qbWays.contains(w3));
     153
     154        qbWays.clear();
     155        Assert.assertEquals(0, qbWays.size());
     156        List<Way> allWays = new ArrayList<>(Arrays.asList(w1, w2, w3));
     157        qbWays.addAll(allWays);
     158        Assert.assertEquals(3, qbWays.size());
     159        int count = 0;
     160        for (Way w : qbWays) {
     161            Assert.assertTrue(allWays.contains(w));
     162            count++;
     163        }
     164        Assert.assertEquals(3, count);
     165        // test remove with iterator
     166        Iterator<Way> iter = qbWays.iterator();
     167        while (iter.hasNext()) {
     168            iter.next();
     169            iter.remove();
     170            count--;
     171            Assert.assertEquals(count, qbWays.size());
     172        }
     173        Assert.assertEquals(0, qbWays.size());
     174    }
    92175}