void _sanityCheckSplit(SplitLongLinearWaysVisitor& /*splitVisitor*/, const int startNode, const int numNodes, const int numWays) { // Pull out ways WayMap ways = _map->getWays(); CPPUNIT_ASSERT_EQUAL( static_cast<size_t>(numWays), ways.size() ); // Pull out nodes OsmMap::NodeMap nodes = _map->getNodeMap(); CPPUNIT_ASSERT_EQUAL( numNodes, nodes.size() ); // Make sure no relations RelationMap relations = _map->getRelationMap(); CPPUNIT_ASSERT_EQUAL( static_cast<size_t>(0), relations.size() ); unsigned int nodesLeftToFind = numNodes; unsigned int searchId = startNode; while ( nodesLeftToFind > 0 ) { LOG_DEBUG("Looking for node ID " << searchId); bool madeProgress = false; bool hitError = false; for (WayMap::const_iterator it = ways.begin(); it != ways.end(); it++) { // Does this way have the node we're looking for? WayPtr currWay = it->second; if ( currWay->getFirstNodeId() == searchId ) { nodesLeftToFind--; LOG_DEBUG("Found node ID " << searchId << " at start of way " << currWay->getId()); madeProgress = true; // Make sure rest of nodes we want exist and are in correct order searchId++; std::vector<long> wayIds = currWay->getNodeIds(); // Start at second node, since we already checked first one for ( std::vector<long>::const_iterator nodeIt = wayIds.begin() + 1; nodeIt != wayIds.end(); ++nodeIt ) { if ( *nodeIt != searchId ) { // Throw a hissy fit hitError = true; break; } nodesLeftToFind--; searchId++; } searchId--; // Search count is off by one if ( nodesLeftToFind > 0 ) { nodesLeftToFind++; } LOG_DEBUG("Found remainder of IDs up to " << searchId << " inside way"); LOG_DEBUG("Nodes left to find: " << nodesLeftToFind); // We found what we needed, bail out of looking for more ways break; } else { LOG_DEBUG("Way started with ID " << currWay->getFirstNodeId() << ", skipping"); } } CPPUNIT_ASSERT( (madeProgress == true) && (hitError == false) ); } }
void _modifyTests(SplitLongLinearWaysVisitor& splitVisitor) { int wayID = 0; int startNode = 234; int numNodes; int numWays; // N + 1 nodes: 2 ways _map.reset(new OsmMap()); numNodes = splitVisitor.getMaxNumberOfNodes() + 1; numWays = _calcNumWays(numNodes, splitVisitor); _createWay(++wayID, startNode, startNode + numNodes - 1); _map->visitRw(splitVisitor); // Sanity checks on split WayMap ways = _map->getWays(); CPPUNIT_ASSERT_EQUAL( static_cast<size_t>(numWays), ways.size() ); _sanityCheckSplit(splitVisitor, startNode, numNodes, numWays); startNode += numNodes; // N + 2 nodes: 2 ways _map.reset(new OsmMap()); numNodes = splitVisitor.getMaxNumberOfNodes() + 2; numWays = _calcNumWays(numNodes, splitVisitor); _createWay(++wayID, startNode, startNode + numNodes - 1); _map->visitRw(splitVisitor); // Sanity checks on split ways = _map->getWays(); CPPUNIT_ASSERT_EQUAL( static_cast<size_t>(numWays), ways.size() ); _sanityCheckSplit(splitVisitor, startNode, numNodes, numWays); startNode += numNodes; // (2N) - 2 nodes: 2 ways _map.reset(new OsmMap()); numNodes = (splitVisitor.getMaxNumberOfNodes() * 2) - 2; numWays = _calcNumWays(numNodes, splitVisitor); _createWay(++wayID, startNode, startNode + numNodes - 1); _map->visitRw(splitVisitor); // Sanity checks on split ways = _map->getWays(); CPPUNIT_ASSERT_EQUAL( static_cast<size_t>(numWays), ways.size() ); _sanityCheckSplit(splitVisitor, startNode, numNodes, numWays); startNode += numNodes; // (2N) - 1 nodes: 2 ways _map.reset(new OsmMap()); numNodes = (splitVisitor.getMaxNumberOfNodes() * 2) - 1; numWays = _calcNumWays(numNodes, splitVisitor); _createWay(++wayID, startNode, startNode + numNodes - 1); _map->visitRw(splitVisitor); // Sanity checks on split ways = _map->getWays(); CPPUNIT_ASSERT_EQUAL( static_cast<size_t>(numWays), ways.size() ); _sanityCheckSplit(splitVisitor, startNode, numNodes, numWays); startNode += numNodes; // (2N) nodes: 2 ways _map.reset(new OsmMap()); numNodes = (splitVisitor.getMaxNumberOfNodes() * 2); numWays = _calcNumWays(numNodes, splitVisitor); _createWay(++wayID, startNode, startNode + numNodes - 1); _map->visitRw(splitVisitor); // Sanity checks on split ways = _map->getWays(); CPPUNIT_ASSERT_EQUAL( static_cast<size_t>(numWays), ways.size() ); _sanityCheckSplit(splitVisitor, startNode, numNodes, numWays); startNode += numNodes; // (2N) + 1 nodes: 3 ways _map.reset(new OsmMap()); numNodes = (splitVisitor.getMaxNumberOfNodes() * 2) + 1; numWays = _calcNumWays(numNodes, splitVisitor); _createWay(++wayID, startNode, startNode + numNodes - 1); _map->visitRw(splitVisitor); // Sanity checks on split ways = _map->getWays(); CPPUNIT_ASSERT_EQUAL( static_cast<size_t>(numWays), ways.size() ); _sanityCheckSplit(splitVisitor, startNode, numNodes, numWays); startNode += numNodes; // (2N) + 2 nodes: 3 ways _map.reset(new OsmMap()); numNodes = (splitVisitor.getMaxNumberOfNodes() * 2) + 2; numWays = _calcNumWays(numNodes, splitVisitor); _createWay(++wayID, startNode, startNode + numNodes - 1); _map->visitRw(splitVisitor); // Sanity checks on split ways = _map->getWays(); CPPUNIT_ASSERT_EQUAL( static_cast<size_t>(numWays), ways.size() ); _sanityCheckSplit(splitVisitor, startNode, numNodes, numWays); startNode += numNodes; // Picking 541N as 541 is large enough to be a good stress test, plus it's a prime number // and primes are good at exposing problems // (541N) - 2 nodes: 541 ways _map.reset(new OsmMap()); numNodes = (splitVisitor.getMaxNumberOfNodes() * 541) - 2; numWays = _calcNumWays(numNodes, splitVisitor); _createWay(++wayID, startNode, startNode + numNodes - 1); _map->visitRw(splitVisitor); // Sanity checks on split _sanityCheckSplit(splitVisitor, startNode, numNodes, numWays); startNode += numNodes; // (541N) - 1 nodes: 541 ways _map.reset(new OsmMap()); numNodes = (splitVisitor.getMaxNumberOfNodes() * 541) - 1; numWays = _calcNumWays(numNodes, splitVisitor); _createWay(++wayID, startNode, startNode + numNodes - 1); _map->visitRw(splitVisitor); // Sanity checks on split _sanityCheckSplit(splitVisitor, startNode, numNodes, numWays); startNode += numNodes; // (541N) nodes: 541 ways _map.reset(new OsmMap()); numNodes = (splitVisitor.getMaxNumberOfNodes() * 541); numWays = _calcNumWays(numNodes, splitVisitor); _createWay(++wayID, startNode, startNode + numNodes - 1); _map->visitRw(splitVisitor); // Sanity checks on split _sanityCheckSplit(splitVisitor, startNode, numNodes, numWays); startNode += numNodes; // (541N) + 1 nodes: 542 ways _map.reset(new OsmMap()); numNodes = (splitVisitor.getMaxNumberOfNodes() * 541) + 1; numWays = _calcNumWays(numNodes, splitVisitor); _createWay(++wayID, startNode, startNode + numNodes - 1); _map->visitRw(splitVisitor); // Sanity checks on split _sanityCheckSplit(splitVisitor, startNode, numNodes, numWays); startNode += numNodes; // (541N) + 2 nodes: 542 ways _map.reset(new OsmMap()); numNodes = (splitVisitor.getMaxNumberOfNodes() * 541) + 2; numWays = _calcNumWays(numNodes, splitVisitor); _createWay(++wayID, startNode, startNode + numNodes - 1); _map->visitRw(splitVisitor); // Sanity checks on split _sanityCheckSplit(splitVisitor, startNode, numNodes, numWays); startNode += numNodes; }