Skip to content

v0.2.47..v0.2.48 changeset MapCropperTest.cpp

Garret Voltz edited this page Sep 27, 2019 · 1 revision
diff --git a/hoot-core-test/src/test/cpp/hoot/core/ops/MapCropperTest.cpp b/hoot-core-test/src/test/cpp/hoot/core/ops/MapCropperTest.cpp
index 73f77ad..03a4d29 100644
--- a/hoot-core-test/src/test/cpp/hoot/core/ops/MapCropperTest.cpp
+++ b/hoot-core-test/src/test/cpp/hoot/core/ops/MapCropperTest.cpp
@@ -37,7 +37,9 @@
 #include <hoot/core/util/Log.h>
 #include <hoot/core/util/MapProjector.h>
 #include <hoot/core/util/Settings.h>
+#include <hoot/core/util/GeometryUtils.h>
 #include <hoot/core/io/OsmMapWriterFactory.h>
+#include <hoot/core/criterion/ElementIdCriterion.h>
 
 // CPP Unit
 #include <cppunit/extensions/HelperMacros.h>
@@ -71,6 +73,7 @@ class MapCropperTest : public HootTestFixture
   CPPUNIT_TEST(runKeepFeaturesOnlyCompletelyInBoundsTest);
   CPPUNIT_TEST(runDontSplitCrossingFeaturesTest);
   CPPUNIT_TEST(runInvertTest);
+  CPPUNIT_TEST(runInclusionTest);
   CPPUNIT_TEST_SUITE_END();
 
 public:
@@ -78,6 +81,7 @@ public:
   MapCropperTest() :
   HootTestFixture("test-files/ops/MapCropper", "test-output/ops/MapCropper")
   {
+    setResetType(ResetBasic);
   }
 
   OsmMapPtr genPoints(int seed)
@@ -117,7 +121,8 @@ public:
     }
 
     {
-      MapCropper uut(g, false);
+      MapCropper uut(g);
+      uut.setInvert(false);
       uut.apply(map);
 
       CPPUNIT_ASSERT_EQUAL(insideCount, (int)map->getNodes().size());
@@ -126,7 +131,8 @@ public:
     {
       OsmMapPtr map = genPoints(0);
 
-      MapCropper uut(g, true);
+      MapCropper uut(g);
+      uut.setInvert(true);
       uut.apply(map);
       CPPUNIT_ASSERT_EQUAL(1000 - insideCount, (int)map->getNodes().size());
     }
@@ -137,7 +143,8 @@ public:
     std::shared_ptr<Geometry> g(geos::io::WKTReader().read(
       "POLYGON ((-50 0, 0 50, 50 0, 0 -50, 0 0, -50 0))"));
 
-    MapCropper pre(g, false);
+    MapCropper pre(g);
+    pre.setInvert(false);
     OsmMapPtr mapPre = genPoints(0);
     pre.apply(mapPre);
 
@@ -180,78 +187,6 @@ public:
     settings.set("crop.bounds", "12,41.891,13.,42");
     cropper.setConfiguration(settings);
     HOOT_STR_EQUALS("Env[12:13,41.891:42]", cropper._envelope.toString());
-
-    cropper._envelope = Envelope();
-
-    settings.clear();
-    settings.set("crop.bounds", "12.462,41.891,-12.477,41.898");
-    QString exceptionMsg("");
-    try
-    {
-      cropper.setConfiguration(settings);
-    }
-    catch (const HootException& e)
-    {
-      exceptionMsg = e.what();
-    }
-    CPPUNIT_ASSERT(exceptionMsg.startsWith("Invalid envelope string"));
-    HOOT_STR_EQUALS("Env[0:-1,0:-1]", cropper._envelope.toString());
-
-    settings.clear();
-    settings.set("crop.bounds", "12.462,41.891,12.477,-41.898");
-    exceptionMsg = "";
-    try
-    {
-      cropper.setConfiguration(settings);
-    }
-    catch (const HootException& e)
-    {
-      exceptionMsg = e.what();
-    }
-    CPPUNIT_ASSERT(exceptionMsg.startsWith("Invalid envelope string"));
-    HOOT_STR_EQUALS("Env[0:-1,0:-1]", cropper._envelope.toString());
-
-    settings.clear();
-    settings.set("crop.bounds", "41.891,12.477,41.898");
-    exceptionMsg = "";
-    try
-    {
-      cropper.setConfiguration(settings);
-    }
-    catch (const HootException& e)
-    {
-      exceptionMsg = e.what();
-    }
-    CPPUNIT_ASSERT(exceptionMsg.startsWith("Invalid envelope string"));
-    HOOT_STR_EQUALS("Env[0:-1,0:-1]", cropper._envelope.toString());
-
-    settings.clear();
-    settings.set("crop.bounds", "12.462,asdf,12.477,41.898");
-    exceptionMsg = "";
-    try
-    {
-      cropper.setConfiguration(settings);
-    }
-    catch (const HootException& e)
-    {
-      exceptionMsg = e.what();
-    }
-    CPPUNIT_ASSERT(exceptionMsg.startsWith("Invalid envelope string"));
-    HOOT_STR_EQUALS("Env[0:-1,0:-1]", cropper._envelope.toString());
-
-    settings.clear();
-    settings.set("crop.bounds", "12.462,,12.477,41.898");
-    exceptionMsg = "";
-    try
-    {
-      cropper.setConfiguration(settings);
-    }
-    catch (const HootException& e)
-    {
-      exceptionMsg = e.what();
-    }
-    CPPUNIT_ASSERT(exceptionMsg.startsWith("Invalid envelope string"));
-    HOOT_STR_EQUALS("Env[0:-1,0:-1]", cropper._envelope.toString());
   }
 
   void runMultiPolygonTest()
@@ -298,15 +233,16 @@ public:
     }
   }
 
-  // getting into id ordering issues with these tests, so using an element count check instead
-  // of a map diff
-
   void runKeepFeaturesOnlyCompletelyInBoundsTest()
   {
+    const QString testFileNameBase = "runKeepFeaturesOnlyCompletelyInBoundsTest";
+    QString testFileName;
     OsmMapPtr map;
-    geos::geom::Envelope bounds(-104.9007,-104.8994,38.8540,38.8994);
+    geos::geom::Envelope bounds(-104.9007, -104.8994, 38.8540, 38.8552);
+    OsmMapWriterFactory::write(
+      GeometryUtils::createMapFromBounds(bounds),
+      _outputPath + "/" + testFileNameBase + "-bounds.osm");
     MapCropper uut(bounds);
-    //QString testFileName;
 
     // regular crop output
     map.reset(new OsmMap());
@@ -315,14 +251,10 @@ public:
     uut.setKeepEntireFeaturesCrossingBounds(false);
     uut.setKeepOnlyFeaturesInsideBounds(false);
     uut.apply(map);
-//    LOG_WARN("runKeepFeaturesOnlyCompletelyInBoundsTest-1");
-//    LOG_VARW(map->getNodes().size());
-//    LOG_VARW(map->getWays().size());
-//    MapProjector::projectToWgs84(map);
-//    testFileName = "runKeepFeaturesOnlyCompletelyInBoundsTest-1.osm";
-//    OsmMapWriterFactory::write(map, _outputPath + "/" + testFileName)
-    CPPUNIT_ASSERT_EQUAL(11, (int)map->getNodes().size());
-    CPPUNIT_ASSERT_EQUAL(4, (int)map->getWays().size());;
+    MapProjector::projectToWgs84(map);
+    testFileName = testFileNameBase + "-1.osm";
+    OsmMapWriterFactory::write(map, _outputPath + "/" + testFileName);
+    HOOT_FILE_EQUALS(_inputPath + "/" + testFileName, _outputPath + "/" + testFileName);
 
     // only one way remains since it was the only one completely inside the bounds
     map.reset(new OsmMap());
@@ -331,16 +263,26 @@ public:
     uut.setKeepEntireFeaturesCrossingBounds(false);
     uut.setKeepOnlyFeaturesInsideBounds(true);
     uut.apply(map);
-//    LOG_WARN("runKeepFeaturesOnlyCompletelyInBoundsTest-2");
-//    LOG_VARW(map->getNodes().size());
-//    LOG_VARW(map->getWays().size());
-//    MapProjector::projectToWgs84(map);
-//    testFileName = "runKeepFeaturesOnlyCompletelyInBoundsTest-2.osm";
-//    OsmMapWriterFactory::write(map, _outputPath + "/" + testFileName);
-    CPPUNIT_ASSERT_EQUAL(7, (int)map->getNodes().size());
-    CPPUNIT_ASSERT_EQUAL(1, (int)map->getWays().size());
-
-    // setting invert to true negates the keep the keep only features inside bounds setting;
+    MapProjector::projectToWgs84(map);
+    testFileName = testFileNameBase + "-2.osm";
+    OsmMapWriterFactory::write(map, _outputPath + "/" + testFileName);
+    HOOT_FILE_EQUALS(_inputPath + "/" + testFileName, _outputPath + "/" + testFileName);
+
+    // illegal configuration
+    uut.setInvert(false);
+    uut.setKeepEntireFeaturesCrossingBounds(true);
+    QString exceptionMsg("");
+    try
+    {
+       uut.setKeepOnlyFeaturesInsideBounds(true);
+    }
+    catch (const HootException& e)
+    {
+      exceptionMsg = e.what();
+    }
+    CPPUNIT_ASSERT(exceptionMsg.contains("Incompatible crop options"));
+
+    // setting invert to true negates the keep only features inside bounds setting;
     // so output looks like regular inverted crop output
     map.reset(new OsmMap());
     OsmMapReaderFactory::read(map, "test-files/ToyTestA.osm");
@@ -348,22 +290,22 @@ public:
     uut.setKeepEntireFeaturesCrossingBounds(false);
     uut.setKeepOnlyFeaturesInsideBounds(true);
     uut.apply(map);
-//    LOG_WARN("runKeepFeaturesOnlyCompletelyInBoundsTest-3");
-//    LOG_VARW(map->getNodes().size());
-//    LOG_VARW(map->getWays().size());
-//    MapProjector::projectToWgs84(map);
-//    testFileName = "runKeepFeaturesOnlyCompletelyInBoundsTest-3.osm";
-//    OsmMapWriterFactory::write(map, _outputPath + "/" + testFileName);
-    CPPUNIT_ASSERT_EQUAL(33, (int)map->getNodes().size());
-    CPPUNIT_ASSERT_EQUAL(4, (int)map->getWays().size());
+    MapProjector::projectToWgs84(map);
+    testFileName = testFileNameBase + "-3.osm";
+    OsmMapWriterFactory::write(map, _outputPath + "/" + testFileName);
+    HOOT_FILE_EQUALS(_inputPath + "/" + testFileName, _outputPath + "/" + testFileName);
   }
 
   void runDontSplitCrossingFeaturesTest()
   {
+    const QString testFileNameBase = "runDontSplitCrossingFeaturesTest";
+    QString testFileName;
     OsmMapPtr map;
-    geos::geom::Envelope bounds(-104.9007,-104.8994,38.8540,38.8994);
+    geos::geom::Envelope bounds(-104.9007, -104.8994, 38.8540, 38.8552);
+    OsmMapWriterFactory::write(
+      GeometryUtils::createMapFromBounds(bounds),
+      _outputPath + "/" + testFileNameBase + "-bounds.osm");
     MapCropper uut(bounds);
-    //QString testFileName;
 
     // regular crop output
     map.reset(new OsmMap());
@@ -372,14 +314,10 @@ public:
     uut.setKeepOnlyFeaturesInsideBounds(false);
     uut.setKeepEntireFeaturesCrossingBounds(false);
     uut.apply(map);
-//    LOG_WARN("runDontSplitCrossingFeaturesTest-1");
-//    LOG_VARW(map->getNodes().size());
-//    LOG_VARW(map->getWays().size());
-//    MapProjector::projectToWgs84(map);
-//    testFileName = "runDontSplitCrossingFeaturesTest-1.osm";
-//    OsmMapWriterFactory::write(map, _outputPath + "/" + testFileName);
-    CPPUNIT_ASSERT_EQUAL(11, (int)map->getNodes().size());
-    CPPUNIT_ASSERT_EQUAL(4, (int)map->getWays().size());
+    MapProjector::projectToWgs84(map);
+    testFileName = testFileNameBase + "-1.osm";
+    OsmMapWriterFactory::write(map, _outputPath + "/" + testFileName);
+    HOOT_FILE_EQUALS(_inputPath + "/" + testFileName, _outputPath + "/" + testFileName);
 
     // should end up with all features
     map.reset(new OsmMap());
@@ -388,31 +326,24 @@ public:
     uut.setKeepOnlyFeaturesInsideBounds(false);
     uut.setKeepEntireFeaturesCrossingBounds(true);
     uut.apply(map);
-//    LOG_WARN("runDontSplitCrossingFeaturesTest-2");
-//    LOG_VARW(map->getNodes().size());
-//    LOG_VARW(map->getWays().size());
-//    MapProjector::projectToWgs84(map);
-//    testFileName = "runDontSplitCrossingFeaturesTest-2.osm";
-//    OsmMapWriterFactory::write(map, _outputPath + "/" + testFileName);
-    CPPUNIT_ASSERT_EQUAL(36, (int)map->getNodes().size());
-    CPPUNIT_ASSERT_EQUAL(4, (int)map->getWays().size());
-
-    // setting keep only features inside bounds to true overrides the keep entire features
-    // crossing bounds setting and de-activates it; so should end up with a single way
-    map.reset(new OsmMap());
-    OsmMapReaderFactory::read(map, "test-files/ToyTestA.osm");
+    MapProjector::projectToWgs84(map);
+    testFileName = testFileNameBase + "-2.osm";
+    OsmMapWriterFactory::write(map, _outputPath + "/" + testFileName);
+    HOOT_FILE_EQUALS(_inputPath + "/" + testFileName, _outputPath + "/" + testFileName);
+
+    // illegal configuration
     uut.setInvert(false);
     uut.setKeepOnlyFeaturesInsideBounds(true);
-    uut.setKeepEntireFeaturesCrossingBounds(true);
-    uut.apply(map);
-//    LOG_WARN("runDontSplitCrossingFeaturesTest-3");
-//    LOG_VARW(map->getNodes().size());
-//    LOG_VARW(map->getWays().size());
-//    MapProjector::projectToWgs84(map);
-//    testFileName = "runDontSplitCrossingFeaturesTest-3.osm";
-//    OsmMapWriterFactory::write(map, _outputPath + "/" + testFileName);
-    CPPUNIT_ASSERT_EQUAL(7, (int)map->getNodes().size());
-    CPPUNIT_ASSERT_EQUAL(1, (int)map->getWays().size());
+    QString exceptionMsg("");
+    try
+    {
+       uut.setKeepEntireFeaturesCrossingBounds(true);
+    }
+    catch (const HootException& e)
+    {
+      exceptionMsg = e.what();
+    }
+    CPPUNIT_ASSERT(exceptionMsg.contains("Incompatible crop options"));
 
     // setting invert to true negates the keep entire features crossing bounds setting; so output
     // looks like regular inverted crop output
@@ -422,22 +353,22 @@ public:
     uut.setKeepOnlyFeaturesInsideBounds(false);
     uut.setKeepEntireFeaturesCrossingBounds(true);
     uut.apply(map);
-//    LOG_WARN("runDontSplitCrossingFeaturesTest-4");
-//    LOG_VARW(map->getNodes().size());
-//    LOG_VARW(map->getWays().size());
-//    MapProjector::projectToWgs84(map);
-//    testFileName = "runDontSplitCrossingFeaturesTest-4.osm";
-//    OsmMapWriterFactory::write(map, _outputPath + "/" + testFileName);
-    CPPUNIT_ASSERT_EQUAL(33, (int)map->getNodes().size());
-    CPPUNIT_ASSERT_EQUAL(4, (int)map->getWays().size());
+    MapProjector::projectToWgs84(map);
+    testFileName = testFileNameBase + "-4.osm";
+    OsmMapWriterFactory::write(map, _outputPath + "/" + testFileName);
+    HOOT_FILE_EQUALS(_inputPath + "/" + testFileName, _outputPath + "/" + testFileName);
   }
 
   void runInvertTest()
   {
+    const QString testFileNameBase = "runInvertTest";
+    QString testFileName;
     OsmMapPtr map;
-    geos::geom::Envelope bounds(-104.9007,-104.8994,38.8540,38.8994);
+    geos::geom::Envelope bounds(-104.9007, -104.8994, 38.8540, 38.8552);
+    OsmMapWriterFactory::write(
+      GeometryUtils::createMapFromBounds(bounds),
+      _outputPath + "/" + testFileNameBase + "-bounds.osm");
     MapCropper uut(bounds);
-    //QString testFileName;
 
     // should end up with everything inside of the bounds
     map.reset(new OsmMap());
@@ -446,14 +377,10 @@ public:
     uut.setKeepOnlyFeaturesInsideBounds(false);
     uut.setKeepEntireFeaturesCrossingBounds(false);
     uut.apply(map);
-//    LOG_WARN("runInvertTest-1");
-//    LOG_VARW(map->getNodes().size());
-//    LOG_VARW(map->getWays().size());
-//    MapProjector::projectToWgs84(map);
-//    testFileName = "runInvertTest-1.osm";
-//    OsmMapWriterFactory::write(map, _outputPath + "/" + testFileName);
-    CPPUNIT_ASSERT_EQUAL(11, (int)map->getNodes().size());
-    CPPUNIT_ASSERT_EQUAL(4, (int)map->getWays().size());
+    MapProjector::projectToWgs84(map);
+    testFileName = testFileNameBase + "-1.osm";
+    OsmMapWriterFactory::write(map, _outputPath + "/" + testFileName);
+    HOOT_FILE_EQUALS(_inputPath + "/" + testFileName, _outputPath + "/" + testFileName);
 
     // should end up with everything outside of the bounds
     map.reset(new OsmMap());
@@ -462,14 +389,39 @@ public:
     uut.setKeepOnlyFeaturesInsideBounds(false);
     uut.setKeepEntireFeaturesCrossingBounds(false);
     uut.apply(map);
-//    LOG_WARN("runInvertTest-2");
-//    LOG_VARW(map->getNodes().size());
-//    LOG_VARW(map->getWays().size());
-//    MapProjector::projectToWgs84(map);
-//    testFileName = "runInvertTest-2.osm";
-//    OsmMapWriterFactory::write(map, _outputPath + "/" + testFileName);
-    CPPUNIT_ASSERT_EQUAL(33, (int)map->getNodes().size());
-    CPPUNIT_ASSERT_EQUAL(4, (int)map->getWays().size());
+    MapProjector::projectToWgs84(map);
+    testFileName = testFileNameBase + "-2.osm";
+    OsmMapWriterFactory::write(map, _outputPath + "/" + testFileName);
+    HOOT_FILE_EQUALS(_inputPath + "/" + testFileName, _outputPath + "/" + testFileName);
+  }
+
+  void runInclusionTest()
+  {
+    const QString testFileNameBase = "runInclusionTest";
+    QString testFileName;
+    OsmMapPtr map;
+    geos::geom::Envelope bounds(38.91362, 38.915478, 15.37365, 15.37506);
+    OsmMapWriterFactory::write(
+      GeometryUtils::createMapFromBounds(bounds),
+      _outputPath + "/" + testFileNameBase + "-bounds.osm");
+
+    MapCropper uut(bounds);
+    map.reset(new OsmMap());
+    OsmMapReaderFactory::read(
+      map, "test-files/ops/ImmediatelyConnectedOutOfBoundsWayTagger/in.osm", true);
+    uut.setInvert(false);
+    uut.setKeepEntireFeaturesCrossingBounds(false);
+    uut.setKeepOnlyFeaturesInsideBounds(false);
+    // Exclude one way outside of the bounds from being cropped out of the map. The whole way and
+    // its nodes should be retained.
+    uut.setInclusionCriterion(
+      ElementCriterionPtr(new ElementIdCriterion(ElementId(ElementType::Way, 1687))));
+    uut.apply(map);
+
+    MapProjector::projectToWgs84(map);
+    testFileName = testFileNameBase + ".osm";
+    OsmMapWriterFactory::write(map, _outputPath + "/" + testFileName, false, true);
+    HOOT_FILE_EQUALS(_inputPath + "/" + testFileName, _outputPath + "/" + testFileName);
   }
 };
 
Clone this wiki locally