[geos-commits] r4006 - in trunk/tests/unit: . geom/Geometry

svn_geos at osgeo.org svn_geos at osgeo.org
Tue Sep 16 02:52:21 PDT 2014


Author: strk
Date: 2014-09-16 02:52:21 -0700 (Tue, 16 Sep 2014)
New Revision: 4006

Added:
   trunk/tests/unit/geom/Geometry/normalize.cpp
Modified:
   trunk/tests/unit/Makefile.am
Log:
Add tests for Geometry->normalize()

Modified: trunk/tests/unit/Makefile.am
===================================================================
--- trunk/tests/unit/Makefile.am	2014-09-16 08:50:44 UTC (rev 4005)
+++ trunk/tests/unit/Makefile.am	2014-09-16 09:52:21 UTC (rev 4006)
@@ -51,6 +51,7 @@
 	geom/Geometry/coversTest.cpp \
 	geom/Geometry/equalsTest.cpp \
 	geom/Geometry/isRectangleTest.cpp \
+	geom/Geometry/normalize.cpp \
 	geom/GeometryFactoryTest.cpp \
 	geom/IntersectionMatrixTest.cpp \
 	geom/LinearRingTest.cpp \

Added: trunk/tests/unit/geom/Geometry/normalize.cpp
===================================================================
--- trunk/tests/unit/geom/Geometry/normalize.cpp	                        (rev 0)
+++ trunk/tests/unit/geom/Geometry/normalize.cpp	2014-09-16 09:52:21 UTC (rev 4006)
@@ -0,0 +1,215 @@
+//
+// Test Suite for Geometry's normalize()
+
+// tut
+#include <tut.hpp>
+// geos
+#include <geos/geom/GeometryFactory.h>
+#include <geos/geom/Geometry.h>
+#include <geos/geom/Polygon.h>
+#include <geos/io/WKTReader.h>
+#include <geos/io/WKTWriter.h>
+// std
+#include <memory>
+#include <string>
+#include <iostream>
+
+namespace tut {
+
+//
+// Test Group
+//
+
+struct test_geometry_normalize_data
+{
+  typedef std::auto_ptr<geos::geom::Geometry> GeomAutoPtr;
+  geos::geom::GeometryFactory factory;
+  geos::io::WKTReader reader;
+  geos::io::WKTWriter writer;
+
+  test_geometry_normalize_data()
+      : reader(&factory), writer()
+  {
+    writer.setTrim(true);
+  }
+
+  void
+  runTest(const char *from, const char *exp)
+  {
+    GeomAutoPtr g1(reader.read(from));
+    ensure(g1.get());
+    GeomAutoPtr g2(g1->clone());
+    ensure(g2.get());
+    g2->normalize();
+
+    GeomAutoPtr ge(reader.read(exp));
+    bool eq = g2->equalsExact(ge.get());
+    if ( ! eq ) {
+      using namespace std;
+      cout << endl;
+      cout << "Expected: " << exp << endl;
+      cout << "Obtained: " << writer.write(g2.get()) << endl;
+    }
+    ensure( eq );
+
+    // Clone and re-normalize, check it doesn't change anymore
+    ge.reset( g2->clone() );
+    g2->normalize();
+    ensure( g2->equalsExact(ge.get()) );
+  }
+};
+
+typedef test_group<test_geometry_normalize_data> group;
+typedef group::object object;
+
+group test_geometry_normalize_data("geos::geom::Geometry::normalize");
+
+//
+// Test Cases
+//
+
+template<>
+template<>
+void object::test<1>()
+{
+  const char *inp = "POINT (0 100)";
+  const char *exp = inp; // point does not normalize to anything else
+  runTest(inp, exp);
+}
+
+template<>
+template<>
+void object::test<2>()
+{
+  const char *inp =
+    "LINESTRING(100 0,100 100,0 100,0 0)";
+  const char *exp =
+    "LINESTRING (0 0, 0 100, 100 100, 100 0)";
+  runTest(inp, exp);
+}
+
+template<>
+template<>
+void object::test<3>()
+{
+  const char *inp =
+    "POLYGON ("
+      "(0 0,100 0,100 100,0 100,0 0)," // CCW
+      "(10 10,20 10,20 20,10 20,10 10)," // CCW, leftmost
+      "(40 10,40 20,60 20,60 10,40 10)" // CW, rightmost
+    ")" ;
+  const char *exp =
+    "POLYGON("
+      "(0 0,0 100,100 100,100 0,0 0)," // CW
+      "(40 10,60 10,60 20,40 20,40 10)," // CCW, rightmost
+      "(10 10,20 10,20 20,10 20,10 10)" // CCW, leftmost
+    ")";
+
+  runTest(inp, exp);
+}
+
+template<>
+template<>
+void object::test<4>()
+{
+  const char *inp =
+    "MULTIPOINT ("
+      "0 100," // leftmost
+      "5 6"    // rightmost
+    ")";
+  const char *exp =
+    "MULTIPOINT ("
+      "5 6,"   // rightmost
+      "0 100"  // leftmost
+    ")";
+  runTest(inp, exp);
+}
+
+template<>
+template<>
+void object::test<5>()
+{
+  const char *inp =
+    "MULTILINESTRING("
+      "(15 25, 25 52),"               // rightmost vertex @ 25
+      "(0 0, 0 100, 100 100, 100 0)"  // rightmost vertex @ 100
+    ")";
+  const char *exp =
+    "MULTILINESTRING("
+      "(0 0, 0 100, 100 100, 100 0)," // rightmost vertex @ 100
+      "(15 25, 25 52)"                // rightmost vertex @ 25
+    ")";
+  runTest(inp, exp);
+}
+
+template<>
+template<>
+void object::test<6>()
+{
+  const char *inp =
+    "MULTIPOLYGON("
+      "((0 0, 0 1, 1 1, 1 0, 0 0))," // leftmost
+      "((2 0, 2 1, 3 1, 3 0, 2 0))"  // rightmost
+    ")";
+  const char *exp =
+    "MULTIPOLYGON("
+      "((2 0, 2 1, 3 1, 3 0, 2 0))," // rightmost
+      "((0 0, 0 1, 1 1, 1 0, 0 0))"  // leftmost
+    ")";
+  runTest(inp, exp);
+}
+
+template<>
+template<>
+void object::test<7>()
+{
+  const char *inp =
+    "GEOMETRYCOLLECTION("
+      "MULTIPOINT ("
+        "0 100," // leftmost
+        "5 6"    // rightmost
+      "),"
+      "POINT(10 4)," // more on the right than the multipoint
+      "MULTILINESTRING("
+        "(15 25, 25 52),"               // rightmost vertex @ 25
+        "(0 0, 0 100, 100 100, 100 0)"  // rightmost vertex @ 100
+      "),"
+      "LINESTRING(100 0,100 100,0 100,0 0),"
+      "MULTIPOLYGON("
+        "((0 0, 0 1, 1 1, 1 0, 0 0))," // leftmost
+        "((2 0, 2 1, 3 1, 3 0, 2 0))"  // rightmost
+      "),"
+      "POLYGON ("
+        "(0 0,100 0,100 100,0 100,0 0)," // CCW
+        "(10 10,20 10,20 20,10 20,10 10)," // CCW, leftmost
+        "(40 10,40 20,60 20,60 10,40 10)" // CW, rightmost
+      ")"
+    ")";
+  const char *exp =
+    "GEOMETRYCOLLECTION("
+      "MULTIPOLYGON("
+        "((2 0, 2 1, 3 1, 3 0, 2 0))," // rightmost
+        "((0 0, 0 1, 1 1, 1 0, 0 0))"  // leftmost
+      "),"
+      "POLYGON("
+        "(0 0,0 100,100 100,100 0,0 0)," // CW
+        "(40 10,60 10,60 20,40 20,40 10)," // CCW, rightmost
+        "(10 10,20 10,20 20,10 20,10 10)" // CCW, leftmost
+      "),"
+      "MULTILINESTRING("
+        "(0 0, 0 100, 100 100, 100 0)," // rightmost vertex @ 100
+        "(15 25, 25 52)"                // rightmost vertex @ 25
+      "),"
+      "LINESTRING (0 0, 0 100, 100 100, 100 0),"
+      "MULTIPOINT ("
+        "5 6,"   // rightmost
+        "0 100"  // leftmost
+      "),"
+      "POINT(10 4)" // more on the right than the multipoint
+    ")";
+  runTest(inp, exp);
+}
+
+
+} // namespace tut
+



More information about the geos-commits mailing list