[geos-commits] [SCM] GEOS branch master updated. 264168eeb0f921f0edfc9acab6f12ee5357a15ae

git at osgeo.org git at osgeo.org
Mon Aug 17 10:58:01 PDT 2020


This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "GEOS".

The branch, master has been updated
       via  264168eeb0f921f0edfc9acab6f12ee5357a15ae (commit)
      from  1d34d2c497786920f69521c77e50620f2efb34a6 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit 264168eeb0f921f0edfc9acab6f12ee5357a15ae
Author: Sandro Santilli <strk at kbt.io>
Date:   Mon Aug 17 19:28:07 2020 +0200

    Synchronize overlay tests with JTS, fix EMPTY handling
    
    TestFunction*.xml were renamed to TestOverlay*.xml in JTS, we
    do the same in this commit.
    
    Moreover, some more tests were added in JTS, we add them here
    too. The test for EMPTY geoms were failing, so this commit also
    ports proper update of EMPTY handling in GEOS, work which was
    started in 2018 with commit 6ef28f282e6a336302267b249fcac6cc59
    but evidently wasn't fully completed.

diff --git a/include/geos/operation/overlay/OverlayOp.h b/include/geos/operation/overlay/OverlayOp.h
index 3028100..a2f5f6a 100644
--- a/include/geos/operation/overlay/OverlayOp.h
+++ b/include/geos/operation/overlay/OverlayOp.h
@@ -175,6 +175,23 @@ public:
      * a geometry in the list.
      */
 
+    /**
+    * Creates an empty result geometry of the appropriate dimension,
+    * based on the given overlay operation and the dimensions of the inputs.
+    * The created geometry is always an atomic geometry,
+    * not a collection.
+    *
+    * The empty result is constructed using the following rules:
+    *
+    * * #opINTERSECTION  result has the dimension of the lowest input dimension
+    * * #opUNION - result has the dimension of the highest input dimension
+    * * #opDIFFERENCE - result has the dimension of the left-hand input
+    * * #opSYMDIFFERENCE - result has the dimension of the highest input dimension
+    */
+    static std::unique_ptr<geom::Geometry> createEmptyResult(
+        OverlayOp::OpCode overlayOpCode, const geom::Geometry* a,
+        const geom::Geometry* b, const geom::GeometryFactory* geomFact);
+
 protected:
 
     /** \brief
@@ -341,23 +358,6 @@ private:
             const geom::Geometry* g0, const geom::Geometry* g1);
 
     /**
-    * Creates an empty result geometry of the appropriate dimension,
-    * based on the given overlay operation and the dimensions of the inputs.
-    * The created geometry is always an atomic geometry,
-    * not a collection.
-    *
-    * The empty result is constructed using the following rules:
-    *
-    * * #opINTERSECTION  result has the dimension of the lowest input dimension
-    * * #opUNION - result has the dimension of the highest input dimension
-    * * #opDIFFERENCE - result has the dimension of the left-hand input
-    * * #opSYMDIFFERENCE - result has the dimension of the highest input dimension
-    */
-    static std::unique_ptr<geom::Geometry> createEmptyResult(
-        OverlayOp::OpCode overlayOpCode, const geom::Geometry* a,
-        const geom::Geometry* b, const geom::GeometryFactory* geomFact);
-
-    /**
      * Build a Geometry containing all Geometries in the given vectors.
      * Takes element's ownership, vector control is left to caller.
      */
diff --git a/src/geom/Geometry.cpp b/src/geom/Geometry.cpp
index 93dcfaa..6701897 100644
--- a/src/geom/Geometry.cpp
+++ b/src/geom/Geometry.cpp
@@ -530,7 +530,7 @@ Geometry::intersection(const Geometry* other) const
 
     // special case: if one input is empty ==> empty
     if(isEmpty() || other->isEmpty()) {
-        return std::unique_ptr<Geometry>(getFactory()->createGeometryCollection());
+        return OverlayOp::createEmptyResult(OverlayOp::opINTERSECTION, this, other, getFactory());
     }
 
 #ifdef USE_RECTANGLE_INTERSECTION
@@ -561,12 +561,14 @@ Geometry::intersection(const Geometry* other) const
 std::unique_ptr<Geometry>
 Geometry::Union(const Geometry* other) const
 {
-    // special case: if one input is empty ==> other input
-    if(isEmpty()) {
-        return other->clone();
-    }
-    if(other->isEmpty()) {
-        return clone();
+    // handle empty geometry cases
+    if(isEmpty() || other->isEmpty() ) {
+      if(isEmpty() && other->isEmpty() ) {
+        return OverlayOp::createEmptyResult(OverlayOp::opUNION, this, other, getFactory());
+      }
+      // special case: if one input is empty ==> other input
+      if(isEmpty()) return other->clone();
+      if(other->isEmpty()) return clone();
     }
 
 #ifdef SHORTCIRCUIT_PREDICATES
@@ -632,7 +634,7 @@ Geometry::difference(const Geometry* other) const
 {
     // special case: if A.isEmpty ==> empty; if B.isEmpty ==> A
     if(isEmpty()) {
-        return std::unique_ptr<Geometry>(getFactory()->createGeometryCollection());
+        return OverlayOp::createEmptyResult(OverlayOp::opDIFFERENCE, this, other, getFactory());
     }
     if(other->isEmpty()) {
         return clone();
@@ -648,12 +650,14 @@ Geometry::difference(const Geometry* other) const
 std::unique_ptr<Geometry>
 Geometry::symDifference(const Geometry* other) const
 {
-    // special case: if either input is empty ==> other input
-    if(isEmpty()) {
-        return other->clone();
-    }
-    if(other->isEmpty()) {
-        return clone();
+    // handle empty geometry cases
+    if(isEmpty() || other->isEmpty() ) {
+      if(isEmpty() && other->isEmpty() ) {
+        return OverlayOp::createEmptyResult(OverlayOp::opSYMDIFFERENCE, this, other, getFactory());
+      }
+      // special case: if either input is empty ==> other input
+      if(isEmpty()) return other->clone();
+      if(other->isEmpty()) return clone();
     }
 
     // if envelopes are disjoint return a MULTI geom or
diff --git a/tests/unit/capi/GEOSIntersectionTest.cpp b/tests/unit/capi/GEOSIntersectionTest.cpp
index 6638426..9dcd61c 100644
--- a/tests/unit/capi/GEOSIntersectionTest.cpp
+++ b/tests/unit/capi/GEOSIntersectionTest.cpp
@@ -104,7 +104,7 @@ void object::test<1>
 
     geom3_ = GEOSIntersection(geom1_, geom2_);
     ensure(nullptr != geom3_);
-    ensure_equals(toWKT(geom3_), std::string("GEOMETRYCOLLECTION EMPTY"));
+    ensure_equals(toWKT(geom3_), std::string("POLYGON EMPTY"));
 }
 
 template<>
diff --git a/tests/xmltester/Makefile.am b/tests/xmltester/Makefile.am
index 958e71b..f533018 100644
--- a/tests/xmltester/Makefile.am
+++ b/tests/xmltester/Makefile.am
@@ -23,16 +23,6 @@ SAFE_XMLTESTS= \
 	$(srcdir)/tests/general/TestDistance.xml \
 	$(srcdir)/tests/general/TestDensify.xml \
 	$(srcdir)/tests/general/TestEqualsExact.xml \
-	$(srcdir)/tests/general/TestFunctionAA.xml \
-	$(srcdir)/tests/general/TestFunctionAAPrec.xml \
-	$(srcdir)/tests/general/TestFunctionLA.xml \
-	$(srcdir)/tests/general/TestFunctionLAPrec.xml \
-	$(srcdir)/tests/general/TestFunctionLL.xml \
-	$(srcdir)/tests/general/TestFunctionLLPrec.xml \
-	$(srcdir)/tests/general/TestFunctionPA.xml \
-	$(srcdir)/tests/general/TestFunctionPL.xml \
-	$(srcdir)/tests/general/TestFunctionPLPrec.xml \
-	$(srcdir)/tests/general/TestFunctionPP.xml \
 	$(srcdir)/tests/general/TestInteriorPoint.xml \
 	$(srcdir)/tests/general/TestIntersectsPL.xml \
 	$(srcdir)/tests/general/TestMinimumClearance.xml \
@@ -43,6 +33,17 @@ SAFE_XMLTESTS= \
 	$(srcdir)/tests/general/TestNGOverlayLPrec.xml \
 	$(srcdir)/tests/general/TestNGOverlayP.xml \
 	$(srcdir)/tests/general/TestNGOverlayPPrec.xml \
+	$(srcdir)/tests/general/TestOverlayAA.xml \
+	$(srcdir)/tests/general/TestOverlayPLPrec.xml \
+	$(srcdir)/tests/general/TestOverlayLLPrec.xml \
+	$(srcdir)/tests/general/TestOverlayLL.xml \
+	$(srcdir)/tests/general/TestOverlayLA.xml \
+	$(srcdir)/tests/general/TestOverlayAAPrec.xml \
+	$(srcdir)/tests/general/TestOverlayPL.xml \
+	$(srcdir)/tests/general/TestOverlayPA.xml \
+	$(srcdir)/tests/general/TestOverlayEmpty.xml \
+	$(srcdir)/tests/general/TestOverlayPP.xml \
+	$(srcdir)/tests/general/TestOverlayLAPrec.xml \
 	$(srcdir)/tests/general/TestPreparedIntersectsPL.xml \
 	$(srcdir)/tests/general/TestPreparedPointPredicate.xml \
 	$(srcdir)/tests/general/TestPreparedPolygonPredicate.xml \
diff --git a/tests/xmltester/tests/general/TestFunctionLA.xml b/tests/xmltester/tests/general/TestFunctionLA.xml
deleted file mode 100644
index 091f7b7..0000000
--- a/tests/xmltester/tests/general/TestFunctionLA.xml
+++ /dev/null
@@ -1,384 +0,0 @@
-<run>
-
-<case>
-  <desc>mLmA - A and B complex, disjoint</desc>
-  <a>
-    MULTIPOLYGON(
-      (
-        (60 320, 60 80, 300 80, 60 320),
-        (80 280, 80 100, 260 100, 80 280)),
-      (
-        (120 160, 140 160, 140 140, 120 160)))
-  </a>
-  <b>
-    MULTILINESTRING(
-      (100 240, 100 180, 160 180, 160 120, 220 120),
-      (40 360, 40 60, 340 60, 40 360, 40 20),
-      (120 120, 120 140, 100 140, 100 120, 140 120))
-  </b>
-<test>
-  <op name="convexhull" pattern="FFFFFFFFF" arg1="A">
-    POLYGON(
-      (60 80, 60 320, 300 80, 60 80))
-  </op>
-</test>
-<test>
-  <op name="getboundary" pattern="FFFFFFFFF" arg1="A">
-    MULTILINESTRING(
-      (60 320, 60 80, 300 80, 60 320),
-      (80 280, 80 100, 260 100, 80 280),
-      (120 160, 140 160, 140 140, 120 160))
-  </op>
-</test>
-<test>
-  <op name="symdifference" pattern="FFFFFFFFF" arg1="A" arg2="B">
-    GEOMETRYCOLLECTION(
-      LINESTRING(100 240, 100 180, 160 180, 160 120, 220 120),
-      LINESTRING(40 360, 40 60),
-      LINESTRING(40 60, 340 60, 40 360),
-      LINESTRING(40 60, 40 20),
-      LINESTRING(120 120, 120 140, 100 140, 100 120, 120 120),
-      LINESTRING(120 120, 140 120),
-      POLYGON(
-        (60 320, 300 80, 60 80, 60 320),
-        (80 280, 80 100, 260 100, 80 280)),
-      POLYGON(
-        (120 160, 140 160, 140 140, 120 160)))
-  </op>
-</test>
-<test>
-  <op name="difference" pattern="FFFFFFFFF" arg1="A" arg2="B">
-    MULTIPOLYGON(
-      (
-        (60 320, 300 80, 60 80, 60 320),
-        (80 280, 80 100, 260 100, 80 280)),
-      (
-        (120 160, 140 160, 140 140, 120 160)))
-  </op>
-</test>
-<test>
-  <op name="union" pattern="FFFFFFFFF" arg1="A" arg2="B">
-    GEOMETRYCOLLECTION(
-      LINESTRING(100 240, 100 180, 160 180, 160 120, 220 120),
-      LINESTRING(40 360, 40 60),
-      LINESTRING(40 60, 340 60, 40 360),
-      LINESTRING(40 60, 40 20),
-      LINESTRING(120 120, 120 140, 100 140, 100 120, 120 120),
-      LINESTRING(120 120, 140 120),
-      POLYGON(
-        (60 320, 300 80, 60 80, 60 320),
-        (80 280, 80 100, 260 100, 80 280)),
-      POLYGON(
-        (120 160, 140 160, 140 140, 120 160)))
-  </op>
-</test>
-<test>
-  <op name="intersection" pattern="FFFFFFFFF" arg1="A" arg2="B">
-    LINESTRING EMPTY
-  </op>
-</test>
-</case>
-
-<case>
-  <desc>mLmA - A and B complex, overlapping and touching #1</desc>
-  <a>
-    MULTIPOLYGON(
-      (
-        (60 260, 60 120, 220 120, 220 260, 60 260),
-        (80 240, 80 140, 200 140, 200 240, 80 240)),
-      (
-        (100 220, 100 160, 180 160, 180 220, 100 220),
-        (120 200, 120 180, 160 180, 160 200, 120 200)))
-  </a>
-  <b>
-    MULTILINESTRING(
-      (40 260, 240 260, 240 240, 40 240, 40 220, 240 220),
-      (120 300, 120 80, 140 80, 140 300, 140 80, 120 80, 120 320))
-  </b>
-  <test>
-    <op name="getboundary" arg1="A">
-      MULTILINESTRING(
-        (60 260, 60 120, 220 120, 220 260, 60 260),
-        (80 240, 80 140, 200 140, 200 240, 80 240),
-        (100 220, 100 160, 180 160, 180 220, 100 220),
-        (120 200, 120 180, 160 180, 160 200, 120 200))
-          </op>
-  </test>
-  <test>
-    <op name="convexhull" arg1="A">
-      POLYGON(
-        (60 120, 60 260, 220 260, 220 120, 60 120))
-          </op>
-  </test>
-  <test>
-    <op name="intersection" arg1="A" arg2="B">
-      MULTILINESTRING(
-        (220 260, 140 260),
-        (140 260, 120 260),
-        (120 260, 60 260),
-        (200 240, 140 240),
-        (140 240, 120 240),
-        (120 240, 80 240),
-        (180 220, 140 220),
-        (140 220, 120 220),
-        (120 220, 100 220),
-        (120 200, 120 180),
-        (220 240, 200 240),
-        (80 240, 60 240),
-        (60 220, 80 220),
-        (200 220, 220 220),
-        (120 260, 120 240),
-        (120 220, 120 200),
-        (120 180, 120 160),
-        (120 140, 120 120),
-        (140 120, 140 140),
-        (140 160, 140 180),
-        (140 200, 140 220),
-        (140 240, 140 260))
-          </op>
-  </test>
-  <test>
-    <op name="union" arg1="A" arg2="B">
-      GEOMETRYCOLLECTION(
-        LINESTRING(40 260, 60 260),
-        LINESTRING(220 260, 240 260, 240 240, 220 240),
-        LINESTRING(60 240, 40 240, 40 220, 60 220),
-        LINESTRING(80 220, 100 220),
-        LINESTRING(180 220, 200 220),
-        LINESTRING(220 220, 240 220),
-        LINESTRING(120 300, 120 260),
-        LINESTRING(120 240, 120 220),
-        LINESTRING(120 160, 120 140),
-        LINESTRING(120 120, 120 80),
-        LINESTRING(120 80, 140 80),
-        LINESTRING(140 80, 140 120),
-        LINESTRING(140 140, 140 160),
-        LINESTRING(140 180, 140 200),
-        LINESTRING(140 220, 140 240),
-        LINESTRING(140 260, 140 300),
-        LINESTRING(120 300, 120 320),
-        POLYGON(
-          (60 240, 60 260, 120 260, 140 260, 220 260, 220 240, 220 220, 220 120, 140 120,
-          120 120, 60 120, 60 220, 60 240),
-          (80 240, 80 220, 80 140, 120 140, 140 140, 200 140, 200 220, 200 240, 140 240,
-          120 240, 80 240)),
-        POLYGON(
-          (120 160, 100 160, 100 220, 120 220, 140 220, 180 220, 180 160, 140 160, 120 160),
-          (120 200, 120 180, 140 180, 160 180, 160 200, 140 200, 120 200)))
-          </op>
-  </test>
-  <test>
-    <op name="difference" arg1="A" arg2="B">
-      MULTIPOLYGON(
-        (
-          (60 240, 60 260, 120 260, 140 260, 220 260, 220 240, 220 220, 220 120, 140 120,
-          120 120, 60 120, 60 220, 60 240),
-          (80 240, 80 220, 80 140, 120 140, 140 140, 200 140, 200 220, 200 240, 140 240,
-          120 240, 80 240)),
-        (
-          (120 160, 100 160, 100 220, 120 220, 140 220, 180 220, 180 160, 140 160, 120 160),
-          (120 200, 120 180, 140 180, 160 180, 160 200, 140 200, 120 200)))
-          </op>
-  </test>
-  <test>
-    <op name="symdifference" arg1="A" arg2="B">
-      GEOMETRYCOLLECTION(
-        LINESTRING(40 260, 60 260),
-        LINESTRING(220 260, 240 260, 240 240, 220 240),
-        LINESTRING(60 240, 40 240, 40 220, 60 220),
-        LINESTRING(80 220, 100 220),
-        LINESTRING(180 220, 200 220),
-        LINESTRING(220 220, 240 220),
-        LINESTRING(120 300, 120 260),
-        LINESTRING(120 240, 120 220),
-        LINESTRING(120 160, 120 140),
-        LINESTRING(120 120, 120 80),
-        LINESTRING(120 80, 140 80),
-        LINESTRING(140 80, 140 120),
-        LINESTRING(140 140, 140 160),
-        LINESTRING(140 180, 140 200),
-        LINESTRING(140 220, 140 240),
-        LINESTRING(140 260, 140 300),
-        LINESTRING(120 300, 120 320),
-        POLYGON(
-          (60 240, 60 260, 120 260, 140 260, 220 260, 220 240, 220 220, 220 120, 140 120,
-          120 120, 60 120, 60 220, 60 240),
-          (80 240, 80 220, 80 140, 120 140, 140 140, 200 140, 200 220, 200 240, 140 240,
-          120 240, 80 240)),
-        POLYGON(
-          (120 160, 100 160, 100 220, 120 220, 140 220, 180 220, 180 160, 140 160, 120 160),
-          (120 200, 120 180, 140 180, 160 180, 160 200, 140 200, 120 200)))
-          </op>
-  </test>
-</case><case>
-  <desc>mLmA - A and B complex, overlapping and touching #2</desc>
-  <a>
-    MULTIPOLYGON(
-      (
-        (60 320, 60 120, 280 120, 280 320, 60 320),
-        (120 260, 120 180, 240 180, 240 260, 120 260)),
-      (
-        (280 400, 320 400, 320 360, 280 360, 280 400)),
-      (
-        (300 240, 300 220, 320 220, 320 240, 300 240)))
-  </a>
-  <b>
-    MULTILINESTRING(
-      (80 300, 80 160, 260 160, 260 300, 80 300, 80 140),
-      (220 360, 220 240, 300 240, 300 360))
-  </b>
-<test>
-  <op name="convexhull" pattern="FFFFFFFFF" arg1="A">
-    POLYGON(
-      (60 120, 60 320, 280 400, 320 400, 320 220, 280 120, 60 120))
-  </op>
-</test>
-<test>
-  <op name="getboundary" pattern="FFFFFFFFF" arg1="A">
-    MULTILINESTRING(
-      (60 320, 60 120, 280 120, 280 320, 60 320),
-      (120 260, 120 180, 240 180, 240 260, 120 260),
-      (280 400, 320 400, 320 360, 280 360, 280 400),
-      (300 240, 300 220, 320 220, 320 240, 300 240))
-  </op>
-</test>
-<test>
-  <op name="symdifference" pattern="FFFFFFFFF" arg1="A" arg2="B">
-    GEOMETRYCOLLECTION(
-      LINESTRING(220 360, 220 320),
-      LINESTRING(220 260, 220 240, 240 240),
-      LINESTRING(280 240, 300 240),
-      LINESTRING(300 240, 300 360),
-      POLYGON(
-        (280 240, 280 120, 60 120, 60 320, 220 320, 280 320, 280 240),
-        (120 260, 120 180, 240 180, 240 240, 240 260, 220 260, 120 260)),
-      POLYGON(
-        (280 400, 320 400, 320 360, 300 360, 280 360, 280 400)),
-      POLYGON(
-        (300 240, 320 240, 320 220, 300 220, 300 240)))
-  </op>
-</test>
-<test>
-  <op name="difference" pattern="FFFFFFFFF" arg1="A" arg2="B">
-    MULTIPOLYGON(
-      (
-        (280 240, 280 120, 60 120, 60 320, 220 320, 280 320, 280 240),
-        (120 260, 120 180, 240 180, 240 240, 240 260, 220 260, 120 260)),
-      (
-        (280 400, 320 400, 320 360, 300 360, 280 360, 280 400)),
-      (
-        (300 240, 320 240, 320 220, 300 220, 300 240)))
-  </op>
-</test>
-<test>
-  <op name="union" pattern="FFFFFFFFF" arg1="A" arg2="B">
-    GEOMETRYCOLLECTION(
-      LINESTRING(220 360, 220 320),
-      LINESTRING(220 260, 220 240, 240 240),
-      LINESTRING(280 240, 300 240),
-      LINESTRING(300 240, 300 360),
-      POLYGON(
-        (280 240, 280 120, 60 120, 60 320, 220 320, 280 320, 280 240),
-        (120 260, 120 180, 240 180, 240 240, 240 260, 220 260, 120 260)),
-      POLYGON(
-        (280 400, 320 400, 320 360, 300 360, 280 360, 280 400)),
-      POLYGON(
-        (300 240, 320 240, 320 220, 300 220, 300 240)))
-  </op>
-</test>
-<test>
-  <op name="intersection" pattern="FFFFFFFFF" arg1="A" arg2="B">
-    GEOMETRYCOLLECTION(
-      POINT(300 240),
-      POINT(300 360),
-      LINESTRING(80 300, 80 160),
-      LINESTRING(80 160, 260 160, 260 240),
-      LINESTRING(260 240, 260 300, 220 300),
-      LINESTRING(220 300, 80 300),
-      LINESTRING(80 160, 80 140),
-      LINESTRING(220 320, 220 300),
-      LINESTRING(220 300, 220 260),
-      LINESTRING(240 240, 260 240),
-      LINESTRING(260 240, 280 240))
-  </op>
-</test>
-</case>
-
-<case>
-  <desc>mLmA - A and B complex, overlapping and touching #3</desc>
-  <a>
-    MULTIPOLYGON(
-      (
-        (120 180, 60 80, 180 80, 120 180)),
-      (
-        (100 240, 140 240, 120 220, 100 240)))
-  </a>
-  <b>
-    MULTILINESTRING(
-      (180 260, 120 180, 60 260, 180 260),
-      (60 300, 60 40),
-      (100 100, 140 100))
-  </b>
-<test>
-  <op name="convexhull" pattern="FFFFFFFFF" arg1="A">
-    POLYGON(
-      (60 80, 100 240, 140 240, 180 80, 60 80))
-  </op>
-</test>
-<test>
-  <op name="getboundary" pattern="FFFFFFFFF" arg1="A">
-    MULTILINESTRING(
-      (120 180, 60 80, 180 80, 120 180),
-      (100 240, 140 240, 120 220, 100 240))
-  </op>
-</test>
-<test>
-  <op name="symdifference" pattern="FFFFFFFFF" arg1="A" arg2="B">
-    GEOMETRYCOLLECTION(
-      LINESTRING(180 260, 120 180),
-      LINESTRING(120 180, 60 260),
-      LINESTRING(60 260, 180 260),
-      LINESTRING(60 300, 60 260),
-      LINESTRING(60 260, 60 80),
-      LINESTRING(60 80, 60 40),
-      POLYGON(
-        (60 80, 120 180, 180 80, 60 80)),
-      POLYGON(
-        (100 240, 140 240, 120 220, 100 240)))
-  </op>
-</test>
-<test>
-  <op name="difference" pattern="FFFFFFFFF" arg1="A" arg2="B">
-    MULTIPOLYGON(
-      (
-        (60 80, 120 180, 180 80, 60 80)),
-      (
-        (100 240, 140 240, 120 220, 100 240)))
-  </op>
-</test>
-<test>
-  <op name="union" pattern="FFFFFFFFF" arg1="A" arg2="B">
-    GEOMETRYCOLLECTION(
-      LINESTRING(180 260, 120 180),
-      LINESTRING(120 180, 60 260),
-      LINESTRING(60 260, 180 260),
-      LINESTRING(60 300, 60 260),
-      LINESTRING(60 260, 60 80),
-      LINESTRING(60 80, 60 40),
-      POLYGON(
-        (60 80, 120 180, 180 80, 60 80)),
-      POLYGON(
-        (100 240, 140 240, 120 220, 100 240)))
-  </op>
-</test>
-<test>
-  <op name="intersection" pattern="FFFFFFFFF" arg1="A" arg2="B">
-    GEOMETRYCOLLECTION(
-      POINT(60 80),
-      POINT(120 180),
-      LINESTRING(100 100, 140 100))
-  </op>
-</test>
-</case>
-
-</run>
diff --git a/tests/xmltester/tests/general/TestFunctionLLPrec.xml b/tests/xmltester/tests/general/TestFunctionLLPrec.xml
deleted file mode 100644
index b5ab934..0000000
--- a/tests/xmltester/tests/general/TestFunctionLLPrec.xml
+++ /dev/null
@@ -1,120 +0,0 @@
-<run>
-  <precisionModel scale="1.0" offsetx="0.0" offsety="0.0"/>
-
-<case>
-  <desc>LL - narrow V</desc>
-  <a>
-    LINESTRING(0 10, 620 10, 0 11)
-  </a>
-  <b>
-    LINESTRING(400 60, 400 10)
-  </b>
-<test>
-  <op name="intersection" arg1="A" arg2="B">
-    POINT(400 10)
-  </op>
-</test>
-<test>
-  <op name="union" arg1="A" arg2="B">
-    MULTILINESTRING(
-      (0 10, 400 10),
-      (400 10, 620 10, 400 10),
-      (400 10, 0 11),
-      (400 60, 400 10))
-  </op>
-</test>
-</case>
-
-
-<case>
-  <desc>LL - A and B intersect frequently</desc>
-  <a>
-    LINESTRING(220 240, 200 220, 60 320, 40 300, 180 200, 160 180, 20 280)
-  </a>
-  <b>
-    LINESTRING(220 240, 140 160, 120 180, 220 280, 200 300, 100 200)
-  </b>
-<test>
-  <op name="getboundary" arg1="A">
-    MULTIPOINT((220 240), (20 280))
-  </op>
-</test>
-<test>
-  <op name="convexhull" arg1="A">
-    POLYGON(
-      (160 180, 20 280, 60 320, 220 240, 160 180))
-  </op>
-</test>
-<test>
-  <op name="intersection" arg1="A" arg2="B">
-    GEOMETRYCOLLECTION(
-      POINT(113 213),
-      POINT(133 233),
-      POINT(137 197),
-      POINT(153 253),
-      POINT(157 217),
-      POINT(177 237),
-      LINESTRING(180 200, 160 180),
-      LINESTRING(220 240, 200 220))
-  </op>
-</test>
-<test>
-  <op name="union" arg1="A" arg2="B">
-    MULTILINESTRING(
-      (113 213, 20 280),
-      (133 233, 113 213),
-      (113 213, 100 200),
-      (137 197, 113 213),
-      (153 253, 133 233),
-      (153 253, 60 320, 40 300, 133 233),
-      (133 233, 157 217),
-      (137 197, 157 217),
-      (160 180, 140 160, 120 180, 137 197),
-      (160 180, 137 197),
-      (177 237, 220 280, 200 300, 153 253),
-      (177 237, 153 253),
-      (157 217, 177 237),
-      (157 217, 180 200),
-      (180 200, 160 180),
-      (200 220, 177 237),
-      (200 220, 180 200),
-      (220 240, 200 220))
-  </op>
-</test>
-<test>
-  <op name="difference" arg1="A" arg2="B">
-    MULTILINESTRING(
-      (200 220, 177 237),
-      (177 237, 153 253),
-      (153 253, 60 320, 40 300, 133 233),
-      (133 233, 157 217),
-      (157 217, 180 200),
-      (160 180, 137 197),
-      (137 197, 113 213),
-      (113 213, 20 280))
-  </op>
-</test>
-<test>
-  <op name="symdifference" arg1="A" arg2="B">
-    MULTILINESTRING(
-      (200 220, 177 237),
-      (177 237, 153 253),
-      (153 253, 60 320, 40 300, 133 233),
-      (133 233, 157 217),
-      (157 217, 180 200),
-      (160 180, 137 197),
-      (137 197, 113 213),
-      (113 213, 20 280),
-      (200 220, 180 200),
-      (160 180, 140 160, 120 180, 137 197),
-      (137 197, 157 217),
-      (157 217, 177 237),
-      (177 237, 220 280, 200 300, 153 253),
-      (153 253, 133 233),
-      (133 233, 113 213),
-      (113 213, 100 200))
-  </op>
-</test>
-</case>
-
-</run>
diff --git a/tests/xmltester/tests/general/TestFunctionAA.xml b/tests/xmltester/tests/general/TestOverlayAA.xml
similarity index 65%
rename from tests/xmltester/tests/general/TestFunctionAA.xml
rename to tests/xmltester/tests/general/TestOverlayAA.xml
index 3dd5ebf..2f4a5d9 100644
--- a/tests/xmltester/tests/general/TestFunctionAA.xml
+++ b/tests/xmltester/tests/general/TestOverlayAA.xml
@@ -32,7 +32,7 @@
   <op name="symdifference" arg1="A" arg2="B">
     MULTIPOLYGON(
       (
-        (10 10, 10 100, 50 100, 50 50, 100 50, 100 10, 10 10)),
+        (10 10, 10 100, 50 100, 50 50, 100 50, 100 10, 10 10)), 
       (
         (50 100, 50 200, 200 200, 200 50, 100 50, 100 100, 50 100)))
   </op>
@@ -43,7 +43,7 @@
   <desc>AA - A with hole intersecting B</desc>
   <a>
     POLYGON(
-      (20 20, 20 160, 160 160, 160 20, 20 20),
+      (20 20, 20 160, 160 160, 160 20, 20 20), 
       (140 140, 40 140, 40 40, 140 40, 140 140))
   </a>
   <b>
@@ -59,14 +59,14 @@
 <test>
   <op name="union" arg1="A" arg2="B">
     POLYGON(
-      (20 20, 20 160, 80 160, 80 240, 220 240, 220 100, 160 100, 160 20, 20 20),
+      (20 20, 20 160, 80 160, 80 240, 220 240, 220 100, 160 100, 160 20, 20 20), 
       (80 100, 80 140, 40 140, 40 40, 140 40, 140 100, 80 100))
   </op>
 </test>
 <test>
   <op name="difference" arg1="A" arg2="B">
     POLYGON(
-      (20 20, 20 160, 80 160, 80 140, 40 140, 40 40, 140 40, 140 100, 160 100,
+      (20 20, 20 160, 80 160, 80 140, 40 140, 40 40, 140 40, 140 100, 160 100, 
       160 20, 20 20))
   </op>
 </test>
@@ -74,10 +74,10 @@
   <op name="symdifference" arg1="A" arg2="B">
     MULTIPOLYGON(
       (
-        (20 20, 20 160, 80 160, 80 140, 40 140, 40 40, 140 40, 140 100, 160 100,
-        160 20, 20 20)),
+        (20 20, 20 160, 80 160, 80 140, 40 140, 40 40, 140 40, 140 100, 160 100, 
+        160 20, 20 20)), 
       (
-        (80 100, 80 140, 140 140, 140 100, 80 100)),
+        (80 100, 80 140, 140 140, 140 100, 80 100)), 
       (
         (80 160, 80 240, 220 240, 220 100, 160 100, 160 160, 80 160)))
   </op>
@@ -116,7 +116,7 @@
   <op name="symdifference" arg1="A" arg2="B">
     MULTIPOLYGON(
       (
-        (20 340, 330 380, 50 40, 28 260, 140 220, 210 320, 140 270, 27 270, 20 340)),
+        (20 340, 330 380, 50 40, 28 260, 140 220, 210 320, 140 270, 27 270, 20 340)), 
       (
         (27 270, 28 260, 0 270, 27 270)))
   </op>
@@ -134,8 +134,8 @@
 <test>
   <op name="intersection" arg1="A" arg2="B">
     GEOMETRYCOLLECTION(
-      POINT(110 260),
-      LINESTRING(110 0, 110 60),
+      POINT(110 260), 
+      LINESTRING(110 0, 110 60), 
       POLYGON(
         (110 100, 40 140, 110 180, 180 140, 110 100)))
   </op>
@@ -143,24 +143,24 @@
 <test>
   <op name="union" arg1="A" arg2="B">
     POLYGON(
-      (110 0, 0 0, 0 260, 110 260, 220 260, 220 0, 110 0),
-      (110 260, 40 220, 110 180, 180 220, 110 260),
+      (110 0, 0 0, 0 260, 110 260, 220 260, 220 0, 110 0), 
+      (110 260, 40 220, 110 180, 180 220, 110 260), 
       (110 100, 40 60, 110 60, 180 60, 110 100))
   </op>
 </test>
 <test>
   <op name="difference" arg1="A" arg2="B">
     POLYGON(
-      (110 0, 0 0, 0 260, 110 260, 40 220, 110 180, 40 140, 110 100, 40 60,
+      (110 0, 0 0, 0 260, 110 260, 40 220, 110 180, 40 140, 110 100, 40 60, 
       110 60, 110 0))
   </op>
 </test>
 <test>
   <op name="symdifference" arg1="A" arg2="B">
     POLYGON(
-      (110 0, 0 0, 0 260, 110 260, 220 260, 220 0, 110 0),
-      (110 260, 40 220, 110 180, 180 220, 110 260),
-      (110 180, 40 140, 110 100, 180 140, 110 180),
+      (110 0, 0 0, 0 260, 110 260, 220 260, 220 0, 110 0), 
+      (110 260, 40 220, 110 180, 180 220, 110 260), 
+      (110 180, 40 140, 110 100, 180 140, 110 180), 
       (110 100, 40 60, 110 60, 180 60, 110 100))
   </op>
 </test>
@@ -170,19 +170,19 @@
   <desc>AA - simple polygons with two touching holes in their symDifference</desc>
   <a>
     POLYGON(
-      (0 0, 120 0, 120 50, 50 50, 120 100, 50 150, 120 150, 120 190, 0 190,
+      (0 0, 120 0, 120 50, 50 50, 120 100, 50 150, 120 150, 120 190, 0 190, 
       0 0))
   </a>
   <b>
     POLYGON(
-      (230 0, 120 0, 120 50, 190 50, 120 100, 190 150, 120 150, 120 190, 230 190,
+      (230 0, 120 0, 120 50, 190 50, 120 100, 190 150, 120 150, 120 190, 230 190, 
       230 0))
   </b>
 <test>
   <op name="symdifference" arg1="A" arg2="B">
     POLYGON(
-      (120 0, 0 0, 0 190, 120 190, 230 190, 230 0, 120 0),
-      (120 100, 50 50, 120 50, 190 50, 120 100),
+      (120 0, 0 0, 0 190, 120 190, 230 190, 230 0, 120 0), 
+      (120 100, 50 50, 120 50, 190 50, 120 100), 
       (120 100, 190 150, 120 150, 50 150, 120 100))
   </op>
 </test>
@@ -197,21 +197,21 @@
   <b>
     MULTIPOLYGON(
       (
-        (40 20, 0 0, 20 40, 60 60, 40 20)),
+        (40 20, 0 0, 20 40, 60 60, 40 20)), 
       (
-        (60 90, 60 60, 90 60, 90 90, 60 90)),
+        (60 90, 60 60, 90 60, 90 90, 60 90)), 
       (
-        (70 120, 90 90, 100 120, 70 120)),
+        (70 120, 90 90, 100 120, 70 120)), 
       (
         (120 70, 90 90, 120 100, 120 70)))
   </b>
 <test>
   <op name="symdifference" arg1="A" arg2="B">
     POLYGON(
-      (0 0, 0 230, 210 230, 210 0, 0 0),
-      (0 0, 40 20, 60 60, 20 40, 0 0),
-      (60 60, 90 60, 90 90, 60 90, 60 60),
-      (90 90, 120 70, 120 100, 90 90),
+      (0 0, 0 230, 210 230, 210 0, 0 0), 
+      (0 0, 40 20, 60 60, 20 40, 0 0), 
+      (60 60, 90 60, 90 90, 60 90, 60 60), 
+      (90 90, 120 70, 120 100, 90 90), 
       (90 90, 100 120, 70 120, 90 90))
   </op>
 </test>
@@ -226,7 +226,7 @@
   <b>
     MULTIPOLYGON(
       (
-        (40 20, 0 0, 20 40, 60 60, 40 20)),
+        (40 20, 0 0, 20 40, 60 60, 40 20)), 
       (
         (60 100, 60 60, 100 60, 100 100, 60 100)))
   </b>
@@ -234,7 +234,7 @@
   <op name="intersection" arg1="A" arg2="B">
     MULTIPOLYGON(
       (
-        (40 20, 0 0, 20 40, 60 60, 40 20)),
+        (40 20, 0 0, 20 40, 60 60, 40 20)), 
       (
         (60 60, 60 100, 100 100, 100 60, 60 60)))
   </op>
@@ -242,8 +242,8 @@
 <test>
   <op name="symdifference" arg1="A" arg2="B">
     POLYGON(
-      (0 0, 0 300, 340 300, 340 0, 0 0),
-      (0 0, 40 20, 60 60, 20 40, 0 0),
+      (0 0, 0 300, 340 300, 340 0, 0 0), 
+      (0 0, 40 20, 60 60, 20 40, 0 0), 
       (60 60, 100 60, 100 100, 60 100, 60 60))
   </op>
 </test>
@@ -258,7 +258,7 @@
   <b>
     MULTIPOLYGON(
       (
-        (60 20, 0 20, 60 60, 60 20)),
+        (60 20, 0 20, 60 60, 60 20)), 
       (
         (60 100, 60 60, 100 60, 100 100, 60 100)))
   </b>
@@ -266,7 +266,7 @@
   <op name="intersection" arg1="A" arg2="B">
     MULTIPOLYGON(
       (
-        (60 20, 0 20, 60 60, 60 20)),
+        (60 20, 0 20, 60 60, 60 20)), 
       (
         (60 60, 60 100, 100 100, 100 60, 60 60)))
   </op>
@@ -280,34 +280,33 @@
 <test>
   <op name="difference" arg1="A" arg2="B">
     POLYGON(
-      (0 20, 0 120, 120 120, 120 0, 0 0, 0 20),
-      (0 20, 60 20, 60 60, 0 20),
+      (0 20, 0 120, 120 120, 120 0, 0 0, 0 20), 
+      (0 20, 60 20, 60 60, 0 20), 
       (60 60, 100 60, 100 100, 60 100, 60 60))
   </op>
 </test>
 <test>
   <op name="symdifference" arg1="A" arg2="B">
     POLYGON(
-      (0 20, 0 120, 120 120, 120 0, 0 0, 0 20),
-      (0 20, 60 20, 60 60, 0 20),
+      (0 20, 0 120, 120 120, 120 0, 0 0, 0 20), 
+      (0 20, 60 20, 60 60, 0 20), 
       (60 60, 100 60, 100 100, 60 100, 60 60))
   </op>
 </test>
 </case>
 
-
 <case>
   <desc>AA - simple polygons with hole touching shell</desc>
   <a>
     POLYGON ((20 0, 20 160, 200 160, 200 0, 20 0))
   </a>
   <b>
-    POLYGON ((220 80, 0 80, 0 240, 220 240, 220 80),
+    POLYGON ((220 80, 0 80, 0 240, 220 240, 220 80), 
   	(100 80, 120 120, 80 120, 100 80))
   </b>
 <test>
   <op name="intersection" arg1="A" arg2="B">
-    POLYGON ((20 80, 20 160, 200 160, 200 80, 100 80, 20 80),
+    POLYGON ((20 80, 20 160, 200 160, 200 80, 100 80, 20 80), 
   (100 80, 120 120, 80 120, 100 80))
   </op>
 </test>
@@ -318,14 +317,14 @@
 </test>
 <test>
   <op name="difference" arg1="A" arg2="B">
-    MULTIPOLYGON (((20 0, 20 80, 100 80, 200 80, 200 0, 20 0)),
+    MULTIPOLYGON (((20 0, 20 80, 100 80, 200 80, 200 0, 20 0)), 
   ((100 80, 80 120, 120 120, 100 80)))
   </op>
 </test>
 <test>
   <op name="symdifference" arg1="A" arg2="B">
-    MULTIPOLYGON (((20 0, 20 80, 100 80, 200 80, 200 0, 20 0)),
-  ((200 80, 200 160, 20 160, 20 80, 0 80, 0 240, 220 240, 220 80, 200 80)),
+    MULTIPOLYGON (((20 0, 20 80, 100 80, 200 80, 200 0, 20 0)), 
+  ((200 80, 200 160, 20 160, 20 80, 0 80, 0 240, 220 240, 220 80, 200 80)), 
   ((100 80, 80 120, 120 120, 100 80)))
   </op>
 </test>
@@ -336,54 +335,39 @@
   <a>
     MULTIPOLYGON(
       (
-        (120 340, 120 200, 140 200, 140 280, 160 280, 160 200, 180 200, 180 280, 200 280,
-        200 200, 220 200, 220 340, 120 340)),
+        (120 340, 120 200, 140 200, 140 280, 160 280, 160 200, 180 200, 180 280, 200 280, 
+        200 200, 220 200, 220 340, 120 340)), 
       (
-        (360 200, 220 200, 220 180, 300 180, 300 160, 220 160, 220 140, 300 140, 300 120,
+        (360 200, 220 200, 220 180, 300 180, 300 160, 220 160, 220 140, 300 140, 300 120, 
         220 120, 220 100, 360 100, 360 200)))
   </a>
   <b>
     MULTIPOLYGON(
       (
-        (100 220, 100 200, 300 200, 300 220, 100 220)),
+        (100 220, 100 200, 300 200, 300 220, 100 220)), 
       (
-        (280 180, 280 160, 300 160, 300 180, 280 180)),
+        (280 180, 280 160, 300 160, 300 180, 280 180)), 
       (
-        (220 140, 220 120, 240 120, 240 140, 220 140)),
+        (220 140, 220 120, 240 120, 240 140, 220 140)), 
       (
         (180 220, 160 240, 200 240, 180 220)))
   </b>
 <test>
-  <op name="getboundary" arg1="A">
-    MULTILINESTRING(
-      (120 340, 120 200, 140 200, 140 280, 160 280, 160 200, 180 200, 180 280, 200 280,
-      200 200, 220 200, 220 340, 120 340),
-      (360 200, 220 200, 220 180, 300 180, 300 160, 220 160, 220 140, 300 140, 300 120,
-      220 120, 220 100, 360 100, 360 200))
-  </op>
-</test>
-<test>
-  <op name="convexhull" arg1="A">
-    POLYGON(
-      (220 100, 120 200, 120 340, 220 340, 360 200, 360 100, 220 100))
-  </op>
-</test>
-<test>
   <op name="intersection" arg1="A" arg2="B">
     GEOMETRYCOLLECTION(
-      POINT(200 240),
-      LINESTRING(300 200, 220 200),
-      LINESTRING(280 180, 300 180),
-      LINESTRING(300 180, 300 160),
-      LINESTRING(300 160, 280 160),
-      LINESTRING(220 140, 240 140),
-      LINESTRING(240 120, 220 120),
+      POINT(200 240), 
+      LINESTRING(300 200, 220 200), 
+      LINESTRING(280 180, 300 180), 
+      LINESTRING(300 180, 300 160), 
+      LINESTRING(300 160, 280 160), 
+      LINESTRING(220 140, 240 140), 
+      LINESTRING(240 120, 220 120), 
       POLYGON(
-        (120 200, 120 220, 140 220, 140 200, 120 200)),
+        (120 200, 120 220, 140 220, 140 200, 120 200)), 
       POLYGON(
-        (160 200, 160 220, 180 220, 180 200, 160 200)),
+        (160 200, 160 220, 180 220, 180 200, 160 200)), 
       POLYGON(
-        (180 240, 180 220, 160 240, 180 240)),
+        (180 240, 180 220, 160 240, 180 240)), 
       POLYGON(
         (200 200, 200 220, 220 220, 220 200, 200 200)))
   </op>
@@ -391,12 +375,12 @@
 <test>
   <op name="union" arg1="A" arg2="B">
     POLYGON(
-      (120 220, 120 340, 220 340, 220 220, 300 220, 300 200, 360 200, 360 100, 220 100,
-      220 120, 220 140, 220 160, 280 160, 280 180, 220 180, 220 200, 200 200, 180 200, 160 200,
-      140 200, 120 200, 100 200, 100 220, 120 220),
-      (200 240, 200 280, 180 280, 180 240, 200 240),
-      (200 240, 180 220, 200 220, 200 240),
-      (160 240, 160 280, 140 280, 140 220, 160 220, 160 240),
+      (120 220, 120 340, 220 340, 220 220, 300 220, 300 200, 360 200, 360 100, 220 100, 
+      220 120, 220 140, 220 160, 280 160, 280 180, 220 180, 220 200, 200 200, 180 200, 160 200, 
+      140 200, 120 200, 100 200, 100 220, 120 220), 
+      (200 240, 200 280, 180 280, 180 240, 200 240), 
+      (200 240, 180 220, 200 220, 200 240), 
+      (160 240, 160 280, 140 280, 140 220, 160 220, 160 240), 
       (240 120, 300 120, 300 140, 240 140, 240 120))
   </op>
 </test>
@@ -404,12 +388,12 @@
   <op name="difference" arg1="A" arg2="B">
     MULTIPOLYGON(
       (
-        (120 220, 120 340, 220 340, 220 220, 200 220, 200 240, 200 280, 180 280, 180 240,
-        160 240, 160 280, 140 280, 140 220, 120 220)),
+        (120 220, 120 340, 220 340, 220 220, 200 220, 200 240, 200 280, 180 280, 180 240, 
+        160 240, 160 280, 140 280, 140 220, 120 220)), 
       (
-        (160 220, 160 240, 180 220, 160 220)),
+        (160 220, 160 240, 180 220, 160 220)), 
       (
-        (300 200, 360 200, 360 100, 220 100, 220 120, 240 120, 300 120, 300 140, 240 140,
+        (300 200, 360 200, 360 100, 220 100, 220 120, 240 120, 300 120, 300 140, 240 140, 
         220 140, 220 160, 280 160, 300 160, 300 180, 280 180, 220 180, 220 200, 300 200)))
   </op>
 </test>
@@ -417,21 +401,21 @@
   <op name="symdifference" arg1="A" arg2="B">
     MULTIPOLYGON(
       (
-        (120 220, 120 340, 220 340, 220 220, 200 220, 200 240, 200 280, 180 280, 180 240,
-        160 240, 160 280, 140 280, 140 220, 120 220)),
+        (120 220, 120 340, 220 340, 220 220, 200 220, 200 240, 200 280, 180 280, 180 240, 
+        160 240, 160 280, 140 280, 140 220, 120 220)), 
       (
-        (120 220, 120 200, 100 200, 100 220, 120 220)),
+        (120 220, 120 200, 100 200, 100 220, 120 220)), 
       (
-        (140 200, 140 220, 160 220, 160 200, 140 200)),
+        (140 200, 140 220, 160 220, 160 200, 140 200)), 
       (
-        (160 220, 160 240, 180 220, 160 220)),
+        (160 220, 160 240, 180 220, 160 220)), 
       (
-        (180 200, 180 220, 200 220, 200 200, 180 200)),
+        (180 200, 180 220, 200 220, 200 200, 180 200)), 
       (
-        (180 220, 180 240, 200 240, 180 220)),
+        (180 220, 180 240, 200 240, 180 220)), 
       (
-        (220 200, 220 220, 300 220, 300 200, 360 200, 360 100, 220 100, 220 120, 220 140,
-        220 160, 280 160, 280 180, 220 180, 220 200),
+        (220 200, 220 220, 300 220, 300 200, 360 200, 360 100, 220 100, 220 120, 220 140, 
+        220 160, 280 160, 280 180, 220 180, 220 200), 
         (240 120, 300 120, 300 140, 240 140, 240 120)))
   </op>
 </test>
@@ -442,62 +426,46 @@
   <a>
     MULTIPOLYGON(
       (
-        (100 200, 100 180, 120 180, 120 200, 100 200)),
+        (100 200, 100 180, 120 180, 120 200, 100 200)), 
       (
-        (60 240, 60 140, 220 140, 220 160, 160 160, 160 180, 200 180, 200 200, 160 200,
-        160 220, 220 220, 220 240, 60 240),
-        (80 220, 80 160, 140 160, 140 220, 80 220)),
+        (60 240, 60 140, 220 140, 220 160, 160 160, 160 180, 200 180, 200 200, 160 200, 
+        160 220, 220 220, 220 240, 60 240), 
+        (80 220, 80 160, 140 160, 140 220, 80 220)), 
       (
         (280 220, 240 180, 260 160, 300 200, 280 220)))
   </a>
   <b>
     MULTIPOLYGON(
       (
-        (80 220, 80 160, 140 160, 140 220, 80 220),
-        (100 200, 100 180, 120 180, 120 200, 100 200)),
+        (80 220, 80 160, 140 160, 140 220, 80 220), 
+        (100 200, 100 180, 120 180, 120 200, 100 200)), 
       (
-        (220 240, 220 220, 160 220, 160 200, 220 200, 220 180, 160 180, 160 160, 220 160,
-        220 140, 320 140, 320 240, 220 240),
+        (220 240, 220 220, 160 220, 160 200, 220 200, 220 180, 160 180, 160 160, 220 160, 
+        220 140, 320 140, 320 240, 220 240), 
         (240 220, 240 160, 300 160, 300 220, 240 220)))
   </b>
 <test>
-  <op name="getboundary" arg1="A">
-    MULTILINESTRING(
-      (100 200, 100 180, 120 180, 120 200, 100 200),
-      (60 240, 60 140, 220 140, 220 160, 160 160, 160 180, 200 180, 200 200, 160 200,
-      160 220, 220 220, 220 240, 60 240),
-      (80 220, 80 160, 140 160, 140 220, 80 220),
-      (280 220, 240 180, 260 160, 300 200, 280 220))
-  </op>
-</test>
-<test>
-  <op name="convexhull" arg1="A">
-    POLYGON(
-      (60 140, 60 240, 220 240, 280 220, 300 200, 260 160, 220 140, 60 140))
-  </op>
-</test>
-<test>
   <op name="intersection" arg1="A" arg2="B">
     GEOMETRYCOLLECTION(
-      POINT(240 180),
-      POINT(260 160),
-      POINT(280 220),
-      POINT(300 200),
-      LINESTRING(100 200, 100 180),
-      LINESTRING(100 180, 120 180),
-      LINESTRING(120 180, 120 200),
-      LINESTRING(120 200, 100 200),
-      LINESTRING(220 140, 220 160),
-      LINESTRING(220 160, 160 160),
-      LINESTRING(160 160, 160 180),
-      LINESTRING(160 180, 200 180),
-      LINESTRING(200 200, 160 200),
-      LINESTRING(160 200, 160 220),
-      LINESTRING(160 220, 220 220),
-      LINESTRING(220 220, 220 240),
-      LINESTRING(80 220, 80 160),
-      LINESTRING(80 160, 140 160),
-      LINESTRING(140 160, 140 220),
+      POINT(240 180), 
+      POINT(260 160), 
+      POINT(280 220), 
+      POINT(300 200), 
+      LINESTRING(100 200, 100 180), 
+      LINESTRING(100 180, 120 180), 
+      LINESTRING(120 180, 120 200), 
+      LINESTRING(120 200, 100 200), 
+      LINESTRING(220 140, 220 160), 
+      LINESTRING(220 160, 160 160), 
+      LINESTRING(160 160, 160 180), 
+      LINESTRING(160 180, 200 180), 
+      LINESTRING(200 200, 160 200), 
+      LINESTRING(160 200, 160 220), 
+      LINESTRING(160 220, 220 220), 
+      LINESTRING(220 220, 220 240), 
+      LINESTRING(80 220, 80 160), 
+      LINESTRING(80 160, 140 160), 
+      LINESTRING(140 160, 140 220), 
       LINESTRING(140 220, 80 220))
   </op>
 </test>
@@ -505,9 +473,9 @@
   <op name="union" arg1="A" arg2="B">
     MULTIPOLYGON(
       (
-        (220 140, 60 140, 60 240, 220 240, 320 240, 320 140, 220 140),
-        (200 200, 200 180, 220 180, 220 200, 200 200),
-        (240 220, 240 180, 240 160, 260 160, 300 160, 300 200, 300 220, 280 220, 240 220)),
+        (220 140, 60 140, 60 240, 220 240, 320 240, 320 140, 220 140), 
+        (200 200, 200 180, 220 180, 220 200, 200 200), 
+        (240 220, 240 180, 240 160, 260 160, 300 160, 300 200, 300 220, 280 220, 240 220)), 
       (
         (240 180, 280 220, 300 200, 260 160, 240 180)))
   </op>
@@ -516,11 +484,11 @@
   <op name="difference" arg1="A" arg2="B">
     MULTIPOLYGON(
       (
-        (100 180, 100 200, 120 200, 120 180, 100 180)),
+        (100 180, 100 200, 120 200, 120 180, 100 180)), 
       (
-        (220 140, 60 140, 60 240, 220 240, 220 220, 160 220, 160 200, 200 200, 200 180,
-        160 180, 160 160, 220 160, 220 140),
-        (80 220, 80 160, 140 160, 140 220, 80 220)),
+        (220 140, 60 140, 60 240, 220 240, 220 220, 160 220, 160 200, 200 200, 200 180, 
+        160 180, 160 160, 220 160, 220 140), 
+        (80 220, 80 160, 140 160, 140 220, 80 220)), 
       (
         (240 180, 280 220, 300 200, 260 160, 240 180)))
   </op>
@@ -529,9 +497,9 @@
   <op name="symdifference" arg1="A" arg2="B">
     MULTIPOLYGON(
       (
-        (220 140, 60 140, 60 240, 220 240, 320 240, 320 140, 220 140),
-        (200 200, 200 180, 220 180, 220 200, 200 200),
-        (240 220, 240 180, 240 160, 260 160, 300 160, 300 200, 300 220, 280 220, 240 220)),
+        (220 140, 60 140, 60 240, 220 240, 320 240, 320 140, 220 140), 
+        (200 200, 200 180, 220 180, 220 200, 200 200), 
+        (240 220, 240 180, 240 160, 260 160, 300 160, 300 200, 300 220, 280 220, 240 220)), 
       (
         (240 180, 280 220, 300 200, 260 160, 240 180)))
   </op>
@@ -546,24 +514,13 @@
   </a>
   <b>
     POLYGON(
-      (160 160, 100 160, 100 100, 160 100, 160 160),
+      (160 160, 100 160, 100 100, 160 100, 160 160), 
       (140 140, 120 140, 120 120, 140 120, 140 140))
   </b>
 <test>
-  <op name="getboundary" arg1="A">
-    LINESTRING(60 160, 140 160, 140 60, 60 60, 60 160)
-  </op>
-</test>
-<test>
-  <op name="convexhull" arg1="A">
-    POLYGON(
-      (60 60, 60 160, 140 160, 140 60, 60 60))
-  </op>
-</test>
-<test>
   <op name="intersection" arg1="A" arg2="B">
     GEOMETRYCOLLECTION(
-      LINESTRING(140 140, 140 120),
+      LINESTRING(140 140, 140 120), 
       POLYGON(
         (100 160, 140 160, 140 140, 120 140, 120 120, 140 120, 140 100, 100 100, 100 160)))
   </op>
@@ -578,7 +535,7 @@
   <op name="difference" arg1="A" arg2="B">
     MULTIPOLYGON(
       (
-        (60 160, 100 160, 100 100, 140 100, 140 60, 60 60, 60 160)),
+        (60 160, 100 160, 100 100, 140 100, 140 60, 60 60, 60 160)), 
       (
         (140 140, 140 120, 120 120, 120 140, 140 140)))
   </op>
@@ -587,7 +544,7 @@
   <op name="symdifference" arg1="A" arg2="B">
     MULTIPOLYGON(
       (
-        (60 160, 100 160, 100 100, 140 100, 140 60, 60 60, 60 160)),
+        (60 160, 100 160, 100 100, 140 100, 140 60, 60 60, 60 160)), 
       (
         (140 140, 140 160, 160 160, 160 100, 140 100, 140 120, 120 120, 120 140, 140 140)))
   </op>
diff --git a/tests/xmltester/tests/general/TestFunctionAAPrec.xml b/tests/xmltester/tests/general/TestOverlayAAPrec.xml
similarity index 74%
rename from tests/xmltester/tests/general/TestFunctionAAPrec.xml
rename to tests/xmltester/tests/general/TestOverlayAAPrec.xml
index daf49fd..928aef1 100644
--- a/tests/xmltester/tests/general/TestFunctionAAPrec.xml
+++ b/tests/xmltester/tests/general/TestOverlayAAPrec.xml
@@ -12,11 +12,6 @@
       (90 0, 200 0, 200 200, 90 200, 90 0))
   </b>
 <test>
-  <op name="relate" arg3="212101212" arg1="A" arg2="B">
-    true
-  </op>
-</test>
-<test>
   <op name="intersection" arg1="A" arg2="B">
     LINESTRING(90 10, 100 10)
   </op>
@@ -25,7 +20,7 @@
   <op name="union" arg1="A" arg2="B">
     MULTIPOLYGON(
       (
-        (90 10, 10 10, 10 11, 90 10)),
+        (90 10, 10 10, 10 11, 90 10)), 
       (
         (90 10, 90 200, 200 200, 200 0, 90 0, 90 10)))
   </op>
@@ -40,7 +35,7 @@
   <op name="symdifference" arg1="A" arg2="B">
     MULTIPOLYGON(
       (
-        (90 10, 10 10, 10 11, 90 10)),
+        (90 10, 10 10, 10 11, 90 10)), 
       (
         (90 10, 90 200, 200 200, 200 0, 90 0, 90 10)))
   </op>
@@ -58,11 +53,6 @@
       (20 20, 0 20, 0 0, 20 0, 20 20))
   </b>
 <test>
-  <op name="relate" arg3="212101212" arg1="A" arg2="B">
-    true
-  </op>
-</test>
-<test>
   <op name="intersection" arg1="A" arg2="B">
     LINESTRING(20 10, 10 10)
   </op>
@@ -78,11 +68,6 @@
     POLYGON((60 40, 40 40, 40 20, 60 20, 60 40))
   </b>
 <test>
-  <op name="relate" arg3="212101212" arg1="A" arg2="B">
-    true
-  </op>
-</test>
-<test>
   <op name="intersection" arg1="A" arg2="B">
     POLYGON(
       (50 40, 50 20, 40 20, 40 30, 40 40, 50 40))
@@ -91,7 +76,7 @@
 <test>
   <op name="union" arg1="A" arg2="B">
     POLYGON(
-      (50 20, 50 10, 10 10, 10 30, 40 30, 10 31, 10 50, 50 50, 50 40,
+      (50 20, 50 10, 10 10, 10 30, 40 30, 10 31, 10 50, 50 50, 50 40, 
       60 40, 60 20, 50 20))
   </op>
 </test>
@@ -99,7 +84,7 @@
   <op name="difference" arg1="A" arg2="B">
     MULTIPOLYGON(
       (
-        (50 20, 50 10, 10 10, 10 30, 40 30, 40 20, 50 20)),
+        (50 20, 50 10, 10 10, 10 30, 40 30, 40 20, 50 20)), 
       (
         (40 30, 10 31, 10 50, 50 50, 50 40, 40 40, 40 30)))
   </op>
@@ -108,9 +93,9 @@
   <op name="symdifference" arg1="A" arg2="B">
     MULTIPOLYGON(
       (
-        (50 20, 50 10, 10 10, 10 30, 40 30, 40 20, 50 20)),
+        (50 20, 50 10, 10 10, 10 30, 40 30, 40 20, 50 20)), 
       (
-        (50 20, 50 40, 60 40, 60 20, 50 20)),
+        (50 20, 50 40, 60 40, 60 20, 50 20)), 
       (
         (40 30, 10 31, 10 50, 50 50, 50 40, 40 40, 40 30)))
   </op>
@@ -121,7 +106,7 @@
   <desc>AA - hole close to shell</desc>
   <a>
     POLYGON(
-      (10 100, 10 10, 100 10, 100 100, 10 100),
+      (10 100, 10 10, 100 10, 100 100, 10 100), 
       (90 90, 11 90, 10 10, 90 11, 90 90))
   </a>
   <b>
@@ -129,14 +114,9 @@
       (0 30, 0 0, 30 0, 30 30, 0 30))
   </b>
 <test>
-  <op name="relate" arg3="212101212" arg1="A" arg2="B">
-    true
-  </op>
-</test>
-<test>
   <op name="intersection" arg1="A" arg2="B">
     MULTILINESTRING(
-      (10 30, 10 10),
+      (10 30, 10 10), 
       (10 10, 30 10))
   </op>
 </test>
@@ -144,7 +124,7 @@
   <op name="union" arg1="A" arg2="B">
     MULTIPOLYGON(
       (
-        (10 30, 10 100, 100 100, 100 10, 30 10, 90 11, 90 90, 11 90, 10 30)),
+        (10 30, 10 100, 100 100, 100 10, 30 10, 90 11, 90 90, 11 90, 10 30)), 
       (
         (30 10, 30 0, 0 0, 0 30, 10 30, 30 30, 30 10)))
   </op>
@@ -159,7 +139,7 @@
   <op name="symdifference" arg1="A" arg2="B">
     MULTIPOLYGON(
       (
-        (10 30, 10 100, 100 100, 100 10, 30 10, 90 11, 90 90, 11 90, 10 30)),
+        (10 30, 10 100, 100 100, 100 10, 30 10, 90 11, 90 90, 11 90, 10 30)), 
       (
         (30 10, 30 0, 0 0, 0 30, 10 30, 30 30, 30 10)))
   </op>
@@ -171,7 +151,7 @@
   <a>
     MULTIPOLYGON(
       (
-        (0 0, 100 0, 100 20, 0 20, 0 0)),
+        (0 0, 100 0, 100 20, 0 20, 0 0)), 
       (
         (0 40, 0 21, 100 20, 100 40, 0 40)))
   </a>
@@ -180,14 +160,9 @@
       (110 30, 90 30, 90 10, 110 10, 110 30))
   </b>
 <test>
-  <op name="relate" arg3="212101212" arg1="A" arg2="B">
-    true
-  </op>
-</test>
-<test>
   <op name="intersection" arg1="A" arg2="B">
     GEOMETRYCOLLECTION(
-      LINESTRING(100 20, 90 20),
+      LINESTRING(100 20, 90 20), 
       POLYGON(
         (100 20, 100 10, 90 10, 90 20, 90 30, 100 30, 100 20)))
   </op>
@@ -195,7 +170,7 @@
 <test>
   <op name="union" arg1="A" arg2="B">
     POLYGON(
-      (100 10, 100 0, 0 0, 0 20, 90 20, 0 21, 0 40, 100 40, 100 30,
+      (100 10, 100 0, 0 0, 0 20, 90 20, 0 21, 0 40, 100 40, 100 30, 
       110 30, 110 10, 100 10))
   </op>
 </test>
@@ -203,7 +178,7 @@
   <op name="difference" arg1="A" arg2="B">
     MULTIPOLYGON(
       (
-        (100 10, 100 0, 0 0, 0 20, 90 20, 90 10, 100 10)),
+        (100 10, 100 0, 0 0, 0 20, 90 20, 90 10, 100 10)), 
       (
         (90 20, 0 21, 0 40, 100 40, 100 30, 90 30, 90 20)))
   </op>
@@ -212,9 +187,9 @@
   <op name="symdifference" arg1="A" arg2="B">
     MULTIPOLYGON(
       (
-        (100 10, 100 0, 0 0, 0 20, 90 20, 90 10, 100 10)),
+        (100 10, 100 0, 0 0, 0 20, 90 20, 90 10, 100 10)), 
       (
-        (100 10, 100 20, 100 30, 110 30, 110 10, 100 10)),
+        (100 10, 100 20, 100 30, 110 30, 110 10, 100 10)), 
       (
         (90 20, 0 21, 0 40, 100 40, 100 30, 90 30, 90 20)))
   </op>
@@ -232,11 +207,6 @@
       (20 20, 0 20, 0 0, 20 0, 20 20))
   </b>
 <test>
-  <op name="relate" arg3="212101212" arg1="A" arg2="B">
-    true
-  </op>
-</test>
-<test>
   <op name="intersection" arg1="A" arg2="B">
     LINESTRING(20 10, 0 10)
   </op>
@@ -245,7 +215,7 @@
   <op name="union" arg1="A" arg2="B">
     MULTIPOLYGON(
       (
-        (100 10, 20 10, 100 11, 100 10)),
+        (100 10, 20 10, 100 11, 100 10)), 
       (
         (0 10, 0 20, 20 20, 20 10, 20 0, 0 0, 0 10)))
   </op>
@@ -260,7 +230,7 @@
   <op name="symdifference" arg1="A" arg2="B">
     MULTIPOLYGON(
       (
-        (100 10, 20 10, 100 11, 100 10)),
+        (100 10, 20 10, 100 11, 100 10)), 
       (
         (0 10, 0 20, 20 20, 20 10, 20 0, 0 0, 0 10)))
   </op>
@@ -278,11 +248,6 @@
       (20 20, 0 20, 0 0, 20 0, 20 20))
   </b>
 <test>
-  <op name="relate" arg3="212101212" arg1="A" arg2="B">
-    true
-  </op>
-</test>
-<test>
   <op name="intersection" arg1="A" arg2="B">
     LINESTRING(20 10, 0 10)
   </op>
@@ -291,7 +256,7 @@
   <op name="union" arg1="A" arg2="B">
     MULTIPOLYGON(
       (
-        (100 10, 20 10, 90 11, 90 20, 100 20, 100 10)),
+        (100 10, 20 10, 90 11, 90 20, 100 20, 100 10)), 
       (
         (0 10, 0 20, 20 20, 20 10, 20 0, 0 0, 0 10)))
   </op>
@@ -302,7 +267,7 @@
   <desc>AA - hole close to shell, B coincident with A</desc>
   <a>
     POLYGON(
-      (10 100, 10 10, 100 10, 100 100, 10 100),
+      (10 100, 10 10, 100 10, 100 100, 10 100), 
       (90 90, 11 90, 10 10, 90 11, 90 90))
   </a>
   <b>
@@ -310,14 +275,9 @@
       (10 30, 10 0, 30 10, 30 30, 10 30))
   </b>
 <test>
-  <op name="relate" arg3="212111212" arg1="A" arg2="B">
-    true
-  </op>
-</test>
-<test>
   <op name="intersection" arg1="A" arg2="B">
     MULTILINESTRING(
-      (10 30, 10 10),
+      (10 30, 10 10), 
       (10 10, 30 10))
   </op>
 </test>
@@ -325,7 +285,7 @@
   <op name="union" arg1="A" arg2="B">
     MULTIPOLYGON(
       (
-        (10 30, 10 100, 100 100, 100 10, 30 10, 90 11, 90 90, 11 90, 10 30)),
+        (10 30, 10 100, 100 100, 100 10, 30 10, 90 11, 90 90, 11 90, 10 30)), 
       (
         (10 10, 10 30, 30 30, 30 10, 10 0, 10 10)))
   </op>
@@ -340,7 +300,7 @@
   <op name="symdifference" arg1="A" arg2="B">
     MULTIPOLYGON(
       (
-        (10 30, 10 100, 100 100, 100 10, 30 10, 90 11, 90 90, 11 90, 10 30)),
+        (10 30, 10 100, 100 100, 100 10, 30 10, 90 11, 90 90, 11 90, 10 30)), 
       (
         (10 10, 10 30, 30 30, 30 10, 10 0, 10 10)))
   </op>
@@ -351,7 +311,7 @@
   <desc>AA - A hole close to shell, B coincident with A</desc>
   <a>
     POLYGON(
-      (10 100, 10 10, 100 10, 100 100, 10 100),
+      (10 100, 10 10, 100 10, 100 100, 10 100), 
       (90 90, 11 90, 10 10, 90 11, 90 90))
   </a>
   <b>
@@ -359,14 +319,9 @@
       (10 30, 10 10, 30 10, 30 30, 10 30))
   </b>
 <test>
-  <op name="relate" arg3="212111212" arg1="A" arg2="B">
-    true
-  </op>
-</test>
-<test>
   <op name="intersection" arg1="A" arg2="B">
     MULTILINESTRING(
-      (10 30, 10 10),
+      (10 30, 10 10), 
       (10 10, 30 10))
   </op>
 </test>
@@ -374,7 +329,7 @@
   <op name="union" arg1="A" arg2="B">
     MULTIPOLYGON(
       (
-        (10 30, 10 100, 100 100, 100 10, 30 10, 90 11, 90 90, 11 90, 10 30)),
+        (10 30, 10 100, 100 100, 100 10, 30 10, 90 11, 90 90, 11 90, 10 30)), 
       (
         (10 10, 10 30, 30 30, 30 10, 10 10)))
   </op>
@@ -389,7 +344,7 @@
   <op name="symdifference" arg1="A" arg2="B">
     MULTIPOLYGON(
       (
-        (10 30, 10 100, 100 100, 100 10, 30 10, 90 11, 90 90, 11 90, 10 30)),
+        (10 30, 10 100, 100 100, 100 10, 30 10, 90 11, 90 90, 11 90, 10 30)), 
       (
         (10 10, 10 30, 30 30, 30 10, 10 10)))
   </op>
@@ -404,18 +359,13 @@
   </a>
   <b>
     POLYGON(
-      (10 100, 10 10, 100 10, 100 100, 10 100),
+      (10 100, 10 10, 100 10, 100 100, 10 100), 
       (90 90, 11 90, 10 10, 90 11, 90 90))
   </b>
 <test>
-  <op name="relate" arg3="212111212" arg1="A" arg2="B">
-    true
-  </op>
-</test>
-<test>
   <op name="intersection" arg1="A" arg2="B">
     MULTILINESTRING(
-      (10 30, 10 10),
+      (10 30, 10 10), 
       (10 10, 30 10))
   </op>
 </test>
@@ -423,7 +373,7 @@
   <op name="union" arg1="A" arg2="B">
     MULTIPOLYGON(
       (
-        (10 30, 10 100, 100 100, 100 10, 30 10, 90 11, 90 90, 11 90, 10 30)),
+        (10 30, 10 100, 100 100, 100 10, 30 10, 90 11, 90 90, 11 90, 10 30)), 
       (
         (10 10, 10 30, 30 30, 30 10, 10 10)))
   </op>
@@ -438,7 +388,7 @@
   <op name="symdifference" arg1="A" arg2="B">
     MULTIPOLYGON(
       (
-        (10 30, 10 100, 100 100, 100 10, 30 10, 90 11, 90 90, 11 90, 10 30)),
+        (10 30, 10 100, 100 100, 100 10, 30 10, 90 11, 90 90, 11 90, 10 30)), 
       (
         (10 10, 10 30, 30 30, 30 10, 10 10)))
   </op>
@@ -456,11 +406,6 @@
       (280 60, 139 60, 280 70, 280 60))
   </b>
 <test>
-  <op name="relate" arg3="212101212" arg1="A" arg2="B">
-    true
-  </op>
-</test>
-<test>
   <op name="intersection" arg1="A" arg2="B">
     POINT(139 60)
   </op>
@@ -469,7 +414,7 @@
   <op name="union" arg1="A" arg2="B">
     MULTIPOLYGON(
       (
-        (139 60, 200 0, 0 0, 0 198, 139 60)),
+        (139 60, 200 0, 0 0, 0 198, 139 60)), 
       (
         (280 60, 139 60, 280 70, 280 60)))
   </op>
@@ -484,7 +429,7 @@
   <op name="symdifference" arg1="A" arg2="B">
     MULTIPOLYGON(
       (
-        (139 60, 200 0, 0 0, 0 198, 139 60)),
+        (139 60, 200 0, 0 0, 0 198, 139 60)), 
       (
         (280 60, 139 60, 280 70, 280 60)))
   </op>
@@ -513,13 +458,13 @@
   <a>
     MULTIPOLYGON(
       (
-        (1 4, 1 1, 2 1, 2 4, 1 4)),
+        (1 4, 1 1, 2 1, 2 4, 1 4)), 
       (
-        (3 4, 3 1, 4 1, 4 4, 3 4)),
+        (3 4, 3 1, 4 1, 4 4, 3 4)), 
       (
-        (5 4, 5 1, 6 1, 6 4, 5 4)),
+        (5 4, 5 1, 6 1, 6 4, 5 4)), 
       (
-        (7 4, 7 1, 8 1, 8 4, 7 4)),
+        (7 4, 7 1, 8 1, 8 4, 7 4)), 
       (
         (9 4, 9 1, 10 1, 10 4, 9 4)))
   </a>
@@ -528,20 +473,14 @@
       (0 2, 11 3, 11 2, 0 2))
   </b>
 <test>
-  <op name="convexhull" arg1="A">
-    POLYGON(
-      (1 1, 1 4, 10 4, 10 1, 1 1))
-  </op>
-</test>
-<test>
   <op name="intersection" arg1="A" arg2="B">
     GEOMETRYCOLLECTION(
-      LINESTRING(1 2, 2 2),
-      LINESTRING(3 2, 4 2),
+      LINESTRING(1 2, 2 2), 
+      LINESTRING(3 2, 4 2), 
       POLYGON(
-        (6 3, 6 2, 5 2, 6 3)),
+        (6 3, 6 2, 5 2, 6 3)), 
       POLYGON(
-        (7 2, 7 3, 8 3, 8 2, 7 2)),
+        (7 2, 7 3, 8 3, 8 2, 7 2)), 
       POLYGON(
         (9 2, 9 3, 10 3, 10 2, 9 2)))
   </op>
@@ -549,35 +488,35 @@
 <test>
   <op name="union" arg1="A" arg2="B">
 GEOMETRYCOLLECTION(
-  LINESTRING(0 2, 1 2),
-  LINESTRING(2 2, 3 2),
-  LINESTRING(4 2, 5 2),
+  LINESTRING(0 2, 1 2), 
+  LINESTRING(2 2, 3 2), 
+  LINESTRING(4 2, 5 2), 
   POLYGON(
-    (1 2, 1 4, 2 4, 2 2, 2 1, 1 1, 1 2)),
+    (1 2, 1 4, 2 4, 2 2, 2 1, 1 1, 1 2)), 
   POLYGON(
-    (3 2, 3 4, 4 4, 4 2, 4 1, 3 1, 3 2)),
+    (3 2, 3 4, 4 4, 4 2, 4 1, 3 1, 3 2)), 
   POLYGON(
-    (5 2, 5 4, 6 4, 6 3, 7 3, 7 4, 8 4, 8 3, 9 3,
-    9 4, 10 4, 10 3, 11 3, 11 2, 10 2, 10 1, 9 1, 9 2, 8 2,
+    (5 2, 5 4, 6 4, 6 3, 7 3, 7 4, 8 4, 8 3, 9 3, 
+    9 4, 10 4, 10 3, 11 3, 11 2, 10 2, 10 1, 9 1, 9 2, 8 2, 
     8 1, 7 1, 7 2, 6 2, 6 1, 5 1, 5 2)))  </op>
 </test>
 <test>
   <op name="difference" arg1="A" arg2="B">
     MULTIPOLYGON(
       (
-        (1 2, 1 4, 2 4, 2 2, 2 1, 1 1, 1 2)),
+        (1 2, 1 4, 2 4, 2 2, 2 1, 1 1, 1 2)), 
       (
-        (3 2, 3 4, 4 4, 4 2, 4 1, 3 1, 3 2)),
+        (3 2, 3 4, 4 4, 4 2, 4 1, 3 1, 3 2)), 
       (
-        (5 2, 5 4, 6 4, 6 3, 5 2)),
+        (5 2, 5 4, 6 4, 6 3, 5 2)), 
       (
-        (6 2, 6 1, 5 1, 5 2, 6 2)),
+        (6 2, 6 1, 5 1, 5 2, 6 2)), 
       (
-        (7 3, 7 4, 8 4, 8 3, 7 3)),
+        (7 3, 7 4, 8 4, 8 3, 7 3)), 
       (
-        (8 2, 8 1, 7 1, 7 2, 8 2)),
+        (8 2, 8 1, 7 1, 7 2, 8 2)), 
       (
-        (9 3, 9 4, 10 4, 10 3, 9 3)),
+        (9 3, 9 4, 10 4, 10 3, 9 3)), 
       (
         (10 2, 10 1, 9 1, 9 2, 10 2)))
   </op>
@@ -585,29 +524,29 @@ GEOMETRYCOLLECTION(
 <test>
   <op name="symdifference" arg1="A" arg2="B">
 GEOMETRYCOLLECTION(
-  LINESTRING(0 2, 1 2),
-  LINESTRING(2 2, 3 2),
-  LINESTRING(4 2, 5 2),
+  LINESTRING(0 2, 1 2), 
+  LINESTRING(2 2, 3 2), 
+  LINESTRING(4 2, 5 2), 
   POLYGON(
-    (1 2, 1 4, 2 4, 2 2, 2 1, 1 1, 1 2)),
+    (1 2, 1 4, 2 4, 2 2, 2 1, 1 1, 1 2)), 
   POLYGON(
-    (3 2, 3 4, 4 4, 4 2, 4 1, 3 1, 3 2)),
+    (3 2, 3 4, 4 4, 4 2, 4 1, 3 1, 3 2)), 
   POLYGON(
-    (5 2, 5 4, 6 4, 6 3, 5 2)),
+    (5 2, 5 4, 6 4, 6 3, 5 2)), 
   POLYGON(
-    (6 2, 6 1, 5 1, 5 2, 6 2)),
+    (6 2, 6 1, 5 1, 5 2, 6 2)), 
   POLYGON(
-    (6 2, 6 3, 7 3, 7 2, 6 2)),
+    (6 2, 6 3, 7 3, 7 2, 6 2)), 
   POLYGON(
-    (7 3, 7 4, 8 4, 8 3, 7 3)),
+    (7 3, 7 4, 8 4, 8 3, 7 3)), 
   POLYGON(
-    (8 2, 8 1, 7 1, 7 2, 8 2)),
+    (8 2, 8 1, 7 1, 7 2, 8 2)), 
   POLYGON(
-    (8 2, 8 3, 9 3, 9 2, 8 2)),
+    (8 2, 8 3, 9 3, 9 2, 8 2)), 
   POLYGON(
-    (9 3, 9 4, 10 4, 10 3, 9 3)),
+    (9 3, 9 4, 10 4, 10 3, 9 3)), 
   POLYGON(
-    (10 2, 10 1, 9 1, 9 2, 10 2)),
+    (10 2, 10 1, 9 1, 9 2, 10 2)), 
   POLYGON(
     (10 2, 10 3, 11 3, 11 2, 10 2)))
   </op>
@@ -618,7 +557,7 @@ GEOMETRYCOLLECTION(
   <desc>AA - Polygon with hole with outward sliver, cut by polygon</desc>
   <a>
     POLYGON(
-      (20 40, 20 200, 180 200, 180 40, 20 40),
+      (20 40, 20 200, 180 200, 180 40, 20 40), 
       (180 120, 120 120, 120 160, 60 120, 120 80, 120 119, 180 120))
   </a>
   <b>
@@ -626,15 +565,9 @@ GEOMETRYCOLLECTION(
       (200 160, 160 160, 160 80, 200 80, 200 160))
   </b>
 <test>
-  <op name="convexhull" arg1="A">
-    POLYGON(
-      (20 40, 20 200, 180 200, 180 40, 20 40))
-  </op>
-</test>
-<test>
   <op name="intersection" arg1="A" arg2="B">
     GEOMETRYCOLLECTION(
-      LINESTRING(180 120, 160 120),
+      LINESTRING(180 120, 160 120), 
       POLYGON(
         (180 160, 180 120, 180 80, 160 80, 160 120, 160 160, 180 160)))
   </op>
@@ -642,15 +575,15 @@ GEOMETRYCOLLECTION(
 <test>
   <op name="union" arg1="A" arg2="B">
     POLYGON(
-      (20 40, 20 200, 180 200, 180 160, 200 160, 200 80, 180 80, 180 40, 20 40),
+      (20 40, 20 200, 180 200, 180 160, 200 160, 200 80, 180 80, 180 40, 20 40), 
       (160 120, 120 120, 120 160, 60 120, 120 80, 120 119, 160 120))
   </op>
 </test>
 <test>
   <op name="difference" arg1="A" arg2="B">
     POLYGON(
-      (20 40, 20 200, 180 200, 180 160, 160 160, 160 120, 160 80, 180 80, 180 40,
-      20 40),
+      (20 40, 20 200, 180 200, 180 160, 160 160, 160 120, 160 80, 180 80, 180 40, 
+      20 40), 
       (160 120, 120 120, 120 160, 60 120, 120 80, 120 119, 160 120))
   </op>
 </test>
@@ -658,9 +591,9 @@ GEOMETRYCOLLECTION(
   <op name="symdifference" arg1="A" arg2="B">
     MULTIPOLYGON(
       (
-        (20 40, 20 200, 180 200, 180 160, 160 160, 160 120, 160 80, 180 80, 180 40,
-        20 40),
-        (160 120, 120 120, 120 160, 60 120, 120 80, 120 119, 160 120)),
+        (20 40, 20 200, 180 200, 180 160, 160 160, 160 120, 160 80, 180 80, 180 40, 
+        20 40), 
+        (160 120, 120 120, 120 160, 60 120, 120 80, 120 119, 160 120)), 
       (
         (180 120, 180 160, 200 160, 200 80, 180 80, 180 120)))
   </op>
@@ -671,43 +604,37 @@ GEOMETRYCOLLECTION(
   <desc>AA - Polygon with hole with outward sliver, cut by line</desc>
   <a>
     POLYGON(
-      (20 40, 20 200, 180 200, 180 40, 20 40),
+      (20 40, 20 200, 180 200, 180 40, 20 40), 
       (180 120, 120 120, 120 160, 60 120, 120 80, 120 119, 180 120))
   </a>
   <b>
     LINESTRING(160 140, 160 100)
   </b>
 <test>
-  <op name="convexhull" arg1="A">
-    POLYGON(
-      (20 40, 20 200, 180 200, 180 40, 20 40))
-  </op>
-</test>
-<test>
   <op name="intersection" arg1="A" arg2="B">
     MULTILINESTRING(
-      (160 140, 160 120),
+      (160 140, 160 120), 
       (160 120, 160 100))
   </op>
 </test>
 <test>
   <op name="union" arg1="A" arg2="B">
     POLYGON(
-      (20 40, 20 200, 180 200, 180 120, 180 40, 20 40),
+      (20 40, 20 200, 180 200, 180 120, 180 40, 20 40), 
       (160 120, 120 120, 120 160, 60 120, 120 80, 120 119, 160 120))
   </op>
 </test>
 <test>
   <op name="difference" arg1="A" arg2="B">
     POLYGON(
-      (20 40, 20 200, 180 200, 180 120, 180 40, 20 40),
+      (20 40, 20 200, 180 200, 180 120, 180 40, 20 40), 
       (160 120, 120 120, 120 160, 60 120, 120 80, 120 119, 160 120))
   </op>
 </test>
 <test>
   <op name="symdifference" arg1="A" arg2="B">
     POLYGON(
-      (20 40, 20 200, 180 200, 180 120, 180 40, 20 40),
+      (20 40, 20 200, 180 200, 180 120, 180 40, 20 40), 
       (160 120, 120 120, 120 160, 60 120, 120 80, 120 119, 160 120))
   </op>
 </test>
@@ -717,7 +644,7 @@ GEOMETRYCOLLECTION(
   <desc>AA - Polygon with inward sliver touching hole, cut by polygon</desc>
   <a>
     POLYGON(
-      (20 40, 20 200, 180 200, 180 120, 140 120, 180 119, 180 40, 20 40),
+      (20 40, 20 200, 180 200, 180 120, 140 120, 180 119, 180 40, 20 40), 
       (140 160, 80 120, 140 80, 140 160))
   </a>
   <b>
@@ -725,16 +652,10 @@ GEOMETRYCOLLECTION(
       (200 160, 150 160, 150 80, 200 80, 200 160))
   </b>
 <test>
-  <op name="convexhull" arg1="A">
-    POLYGON(
-      (20 40, 20 200, 180 200, 180 40, 20 40))
-  </op>
-</test>
-<test>
   <op name="intersection" arg1="A" arg2="B">
     MULTIPOLYGON(
       (
-        (180 160, 180 120, 150 120, 150 160, 180 160)),
+        (180 160, 180 120, 150 120, 150 160, 180 160)), 
       (
         (150 120, 180 119, 180 80, 150 80, 150 120)))
   </op>
@@ -742,15 +663,15 @@ GEOMETRYCOLLECTION(
 <test>
   <op name="union" arg1="A" arg2="B">
     POLYGON(
-      (20 40, 20 200, 180 200, 180 160, 200 160, 200 80, 180 80, 180 40, 20 40),
+      (20 40, 20 200, 180 200, 180 160, 200 160, 200 80, 180 80, 180 40, 20 40), 
       (140 160, 80 120, 140 80, 140 120, 140 160))
   </op>
 </test>
 <test>
   <op name="difference" arg1="A" arg2="B">
     POLYGON(
-      (20 40, 20 200, 180 200, 180 160, 150 160, 150 120, 150 80, 180 80, 180 40,
-      20 40),
+      (20 40, 20 200, 180 200, 180 160, 150 160, 150 120, 150 80, 180 80, 180 40, 
+      20 40), 
       (140 160, 80 120, 140 80, 140 120, 140 160))
   </op>
 </test>
@@ -758,9 +679,9 @@ GEOMETRYCOLLECTION(
   <op name="symdifference" arg1="A" arg2="B">
     MULTIPOLYGON(
       (
-        (20 40, 20 200, 180 200, 180 160, 150 160, 150 120, 150 80, 180 80, 180 40,
-        20 40),
-        (140 160, 80 120, 140 80, 140 120, 140 160)),
+        (20 40, 20 200, 180 200, 180 160, 150 160, 150 120, 150 80, 180 80, 180 40, 
+        20 40), 
+        (140 160, 80 120, 140 80, 140 120, 140 160)), 
       (
         (150 120, 180 120, 180 160, 200 160, 200 80, 180 80, 180 119, 150 120)))
   </op>
@@ -778,17 +699,6 @@ GEOMETRYCOLLECTION(
       (78 39, 574 76, 576 60, 78 39))
   </b>
 <test>
-  <op name="getboundary" arg1="A">
-    LINESTRING(83 33, 62 402, 68 402, 83 33)
-  </op>
-</test>
-<test>
-  <op name="convexhull" arg1="A">
-    POLYGON(
-      (83 33, 62 402, 68 402, 83 33))
-  </op>
-</test>
-<test>
   <op name="intersection" arg1="A" arg2="B">
     POINT(83 39)
   </op>
@@ -796,10 +706,10 @@ GEOMETRYCOLLECTION(
 <test>
   <op name="union" arg1="A" arg2="B">
     GEOMETRYCOLLECTION(
-      LINESTRING(78 39, 83 39),
-      LINESTRING(83 33, 83 39),
+      LINESTRING(78 39, 83 39), 
+      LINESTRING(83 33, 83 39), 
       POLYGON(
-        (83 39, 62 402, 68 402, 83 39)),
+        (83 39, 62 402, 68 402, 83 39)), 
       POLYGON(
         (83 39, 574 76, 576 60, 83 39)))
   </op>
@@ -807,7 +717,7 @@ GEOMETRYCOLLECTION(
 <test>
   <op name="difference" arg1="A" arg2="B">
     GEOMETRYCOLLECTION(
-      LINESTRING(83 33, 83 39),
+      LINESTRING(83 33, 83 39), 
       POLYGON(
         (83 39, 62 402, 68 402, 83 39)))
   </op>
@@ -815,33 +725,32 @@ GEOMETRYCOLLECTION(
 <test>
   <op name="symdifference" arg1="A" arg2="B">
     GEOMETRYCOLLECTION(
-      LINESTRING(78 39, 83 39),
-      LINESTRING(83 33, 83 39),
+      LINESTRING(78 39, 83 39), 
+      LINESTRING(83 33, 83 39), 
       POLYGON(
-        (83 39, 62 402, 68 402, 83 39)),
+        (83 39, 62 402, 68 402, 83 39)), 
       POLYGON(
         (83 39, 574 76, 576 60, 83 39)))
   </op>
 </test>
 </case>
 
-
 <case>
   <desc>AA - simple polygons with holes</desc>
   <a>
     POLYGON(
-      (160 330, 60 260, 20 150, 60 40, 190 20, 270 130, 260 250, 160 330),
+      (160 330, 60 260, 20 150, 60 40, 190 20, 270 130, 260 250, 160 330), 
       (140 240, 80 190, 90 100, 160 70, 210 130, 210 210, 140 240))
   </a>
   <b>
     POLYGON(
-      (300 330, 190 270, 150 170, 150 110, 250 30, 380 50, 380 250, 300 330),
+      (300 330, 190 270, 150 170, 150 110, 250 30, 380 50, 380 250, 300 330), 
       (290 240, 240 200, 240 110, 290 80, 330 170, 290 240))
   </b>
 <test>
   <op name="intersection" arg1="A" arg2="B">
     POLYGON(
-      (251 104, 217 57, 176 89, 210 130, 210 210, 172 226, 190 270, 217 285, 260 250,
+      (251 104, 217 57, 176 89, 210 130, 210 210, 172 226, 190 270, 217 285, 260 250, 
       263 218, 240 200, 240 110, 251 104))
   </op>
 </test>
@@ -849,13 +758,13 @@ GEOMETRYCOLLECTION(
   <op name="symdifference" arg1="A" arg2="B">
     MULTIPOLYGON(
       (
-        (217 57, 190 20, 60 40, 20 150, 60 260, 160 330, 217 285, 190 270, 172 226,
-        140 240, 80 190, 90 100, 160 70, 176 89, 217 57)),
+        (217 57, 190 20, 60 40, 20 150, 60 260, 160 330, 217 285, 190 270, 172 226, 
+        140 240, 80 190, 90 100, 160 70, 176 89, 217 57)), 
       (
-        (217 57, 251 104, 290 80, 330 170, 290 240, 263 218, 260 250, 217 285, 300 330,
-        380 250, 380 50, 250 30, 217 57)),
+        (217 57, 251 104, 290 80, 330 170, 290 240, 263 218, 260 250, 217 285, 300 330, 
+        380 250, 380 50, 250 30, 217 57)), 
       (
-        (263 218, 270 130, 251 104, 240 110, 240 200, 263 218)),
+        (263 218, 270 130, 251 104, 240 110, 240 200, 263 218)), 
       (
         (172 226, 210 210, 210 130, 176 89, 150 110, 150 170, 172 226)))
   </op>
diff --git a/tests/xmltester/tests/general/TestOverlayEmpty.xml b/tests/xmltester/tests/general/TestOverlayEmpty.xml
new file mode 100644
index 0000000..9dd9896
--- /dev/null
+++ b/tests/xmltester/tests/general/TestOverlayEmpty.xml
@@ -0,0 +1,1021 @@
+<run>
+  <desc>  Test type of empty results from overlay operations  </desc>
+
+
+<case>
+  <a> POINT EMPTY </a>
+  <b> POINT EMPTY </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  POINT EMPTY   </op> </test>
+<test> <op name='union'         arg1='A' arg2='B'>  POINT EMPTY   </op> </test>
+<test> <op name='difference'    arg1='A' arg2='B'>  POINT EMPTY   </op> </test>
+<test> <op name='symDifference' arg1='A' arg2='B'>  POINT EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> POINT EMPTY </a>
+  <b> LINESTRING EMPTY </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  POINT EMPTY   </op> </test>
+<test> <op name='union'         arg1='A' arg2='B'>  LINESTRING EMPTY   </op> </test>
+<test> <op name='difference'    arg1='A' arg2='B'>  POINT EMPTY   </op> </test>
+<test> <op name='symDifference' arg1='A' arg2='B'>  LINESTRING EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> POINT EMPTY </a>
+  <b> POLYGON EMPTY </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  POINT EMPTY   </op> </test>
+<test> <op name='union'         arg1='A' arg2='B'>  POLYGON EMPTY   </op> </test>
+<test> <op name='difference'    arg1='A' arg2='B'>  POINT EMPTY   </op> </test>
+<test> <op name='symDifference' arg1='A' arg2='B'>  POLYGON EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> POINT EMPTY </a>
+  <b> POINT (1 1) </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  POINT EMPTY   </op> </test>
+<test> <op name='difference'    arg1='A' arg2='B'>  POINT EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> POINT EMPTY </a>
+  <b> LINESTRING (5 5, 6 6) </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  POINT EMPTY   </op> </test>
+<test> <op name='difference'    arg1='A' arg2='B'>  POINT EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> POINT EMPTY </a>
+  <b> POLYGON ((20 20, 20 30, 30 30, 30 20, 20 20)) </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  POINT EMPTY   </op> </test>
+<test> <op name='difference'    arg1='A' arg2='B'>  POINT EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> POINT EMPTY </a>
+  <b> MULTIPOINT EMPTY </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  POINT EMPTY   </op> </test>
+<test> <op name='union'         arg1='A' arg2='B'>  POINT EMPTY   </op> </test>
+<test> <op name='difference'    arg1='A' arg2='B'>  POINT EMPTY   </op> </test>
+<test> <op name='symDifference' arg1='A' arg2='B'>  POINT EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> POINT EMPTY </a>
+  <b> MULTILINESTRING EMPTY </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  POINT EMPTY   </op> </test>
+<test> <op name='union'         arg1='A' arg2='B'>  LINESTRING EMPTY   </op> </test>
+<test> <op name='difference'    arg1='A' arg2='B'>  POINT EMPTY   </op> </test>
+<test> <op name='symDifference' arg1='A' arg2='B'>  LINESTRING EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> POINT EMPTY </a>
+  <b> MULTIPOLYGON EMPTY </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  POINT EMPTY   </op> </test>
+<test> <op name='union'         arg1='A' arg2='B'>  POLYGON EMPTY   </op> </test>
+<test> <op name='difference'    arg1='A' arg2='B'>  POINT EMPTY   </op> </test>
+<test> <op name='symDifference' arg1='A' arg2='B'>  POLYGON EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> POINT EMPTY </a>
+  <b> MULTIPOINT ((2 2), (3 3)) </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  POINT EMPTY   </op> </test>
+<test> <op name='difference'    arg1='A' arg2='B'>  POINT EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> POINT EMPTY </a>
+  <b> MULTILINESTRING ((7 7, 8 8), (9 9, 10 10)) </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  POINT EMPTY   </op> </test>
+<test> <op name='difference'    arg1='A' arg2='B'>  POINT EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> POINT EMPTY </a>
+  <b> MULTIPOLYGON (((50 50, 50 60, 60 60, 60 50, 50 50)), ((70 70, 70 80, 80 80, 80 70, 70 70))) </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  POINT EMPTY   </op> </test>
+<test> <op name='difference'    arg1='A' arg2='B'>  POINT EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> LINESTRING EMPTY </a>
+  <b> POINT EMPTY </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  POINT EMPTY   </op> </test>
+<test> <op name='union'         arg1='A' arg2='B'>  LINESTRING EMPTY   </op> </test>
+<test> <op name='difference'    arg1='A' arg2='B'>  LINESTRING EMPTY   </op> </test>
+<test> <op name='symDifference' arg1='A' arg2='B'>  LINESTRING EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> LINESTRING EMPTY </a>
+  <b> LINESTRING EMPTY </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  LINESTRING EMPTY   </op> </test>
+<test> <op name='union'         arg1='A' arg2='B'>  LINESTRING EMPTY   </op> </test>
+<test> <op name='difference'    arg1='A' arg2='B'>  LINESTRING EMPTY   </op> </test>
+<test> <op name='symDifference' arg1='A' arg2='B'>  LINESTRING EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> LINESTRING EMPTY </a>
+  <b> POLYGON EMPTY </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  LINESTRING EMPTY   </op> </test>
+<test> <op name='union'         arg1='A' arg2='B'>  POLYGON EMPTY   </op> </test>
+<test> <op name='difference'    arg1='A' arg2='B'>  LINESTRING EMPTY   </op> </test>
+<test> <op name='symDifference' arg1='A' arg2='B'>  POLYGON EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> LINESTRING EMPTY </a>
+  <b> POINT (1 1) </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  POINT EMPTY   </op> </test>
+<test> <op name='difference'    arg1='A' arg2='B'>  LINESTRING EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> LINESTRING EMPTY </a>
+  <b> LINESTRING (5 5, 6 6) </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  LINESTRING EMPTY   </op> </test>
+<test> <op name='difference'    arg1='A' arg2='B'>  LINESTRING EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> LINESTRING EMPTY </a>
+  <b> POLYGON ((20 20, 20 30, 30 30, 30 20, 20 20)) </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  LINESTRING EMPTY   </op> </test>
+<test> <op name='difference'    arg1='A' arg2='B'>  LINESTRING EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> LINESTRING EMPTY </a>
+  <b> MULTIPOINT EMPTY </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  POINT EMPTY   </op> </test>
+<test> <op name='union'         arg1='A' arg2='B'>  LINESTRING EMPTY   </op> </test>
+<test> <op name='difference'    arg1='A' arg2='B'>  LINESTRING EMPTY   </op> </test>
+<test> <op name='symDifference' arg1='A' arg2='B'>  LINESTRING EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> LINESTRING EMPTY </a>
+  <b> MULTILINESTRING EMPTY </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  LINESTRING EMPTY   </op> </test>
+<test> <op name='union'         arg1='A' arg2='B'>  LINESTRING EMPTY   </op> </test>
+<test> <op name='difference'    arg1='A' arg2='B'>  LINESTRING EMPTY   </op> </test>
+<test> <op name='symDifference' arg1='A' arg2='B'>  LINESTRING EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> LINESTRING EMPTY </a>
+  <b> MULTIPOLYGON EMPTY </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  LINESTRING EMPTY   </op> </test>
+<test> <op name='union'         arg1='A' arg2='B'>  POLYGON EMPTY   </op> </test>
+<test> <op name='difference'    arg1='A' arg2='B'>  LINESTRING EMPTY   </op> </test>
+<test> <op name='symDifference' arg1='A' arg2='B'>  POLYGON EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> LINESTRING EMPTY </a>
+  <b> MULTIPOINT ((2 2), (3 3)) </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  POINT EMPTY   </op> </test>
+<test> <op name='difference'    arg1='A' arg2='B'>  LINESTRING EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> LINESTRING EMPTY </a>
+  <b> MULTILINESTRING ((7 7, 8 8), (9 9, 10 10)) </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  LINESTRING EMPTY   </op> </test>
+<test> <op name='difference'    arg1='A' arg2='B'>  LINESTRING EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> LINESTRING EMPTY </a>
+  <b> MULTIPOLYGON (((50 50, 50 60, 60 60, 60 50, 50 50)), ((70 70, 70 80, 80 80, 80 70, 70 70))) </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  LINESTRING EMPTY   </op> </test>
+<test> <op name='difference'    arg1='A' arg2='B'>  LINESTRING EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> POLYGON EMPTY </a>
+  <b> POINT EMPTY </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  POINT EMPTY   </op> </test>
+<test> <op name='union'         arg1='A' arg2='B'>  POLYGON EMPTY   </op> </test>
+<test> <op name='difference'    arg1='A' arg2='B'>  POLYGON EMPTY   </op> </test>
+<test> <op name='symDifference' arg1='A' arg2='B'>  POLYGON EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> POLYGON EMPTY </a>
+  <b> LINESTRING EMPTY </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  LINESTRING EMPTY   </op> </test>
+<test> <op name='union'         arg1='A' arg2='B'>  POLYGON EMPTY   </op> </test>
+<test> <op name='difference'    arg1='A' arg2='B'>  POLYGON EMPTY   </op> </test>
+<test> <op name='symDifference' arg1='A' arg2='B'>  POLYGON EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> POLYGON EMPTY </a>
+  <b> POLYGON EMPTY </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  POLYGON EMPTY   </op> </test>
+<test> <op name='union'         arg1='A' arg2='B'>  POLYGON EMPTY   </op> </test>
+<test> <op name='difference'    arg1='A' arg2='B'>  POLYGON EMPTY   </op> </test>
+<test> <op name='symDifference' arg1='A' arg2='B'>  POLYGON EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> POLYGON EMPTY </a>
+  <b> POINT (1 1) </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  POINT EMPTY   </op> </test>
+<test> <op name='difference'    arg1='A' arg2='B'>  POLYGON EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> POLYGON EMPTY </a>
+  <b> LINESTRING (5 5, 6 6) </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  LINESTRING EMPTY   </op> </test>
+<test> <op name='difference'    arg1='A' arg2='B'>  POLYGON EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> POLYGON EMPTY </a>
+  <b> POLYGON ((20 20, 20 30, 30 30, 30 20, 20 20)) </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  POLYGON EMPTY   </op> </test>
+<test> <op name='difference'    arg1='A' arg2='B'>  POLYGON EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> POLYGON EMPTY </a>
+  <b> MULTIPOINT EMPTY </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  POINT EMPTY   </op> </test>
+<test> <op name='union'         arg1='A' arg2='B'>  POLYGON EMPTY   </op> </test>
+<test> <op name='difference'    arg1='A' arg2='B'>  POLYGON EMPTY   </op> </test>
+<test> <op name='symDifference' arg1='A' arg2='B'>  POLYGON EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> POLYGON EMPTY </a>
+  <b> MULTILINESTRING EMPTY </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  LINESTRING EMPTY   </op> </test>
+<test> <op name='union'         arg1='A' arg2='B'>  POLYGON EMPTY   </op> </test>
+<test> <op name='difference'    arg1='A' arg2='B'>  POLYGON EMPTY   </op> </test>
+<test> <op name='symDifference' arg1='A' arg2='B'>  POLYGON EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> POLYGON EMPTY </a>
+  <b> MULTIPOLYGON EMPTY </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  POLYGON EMPTY   </op> </test>
+<test> <op name='union'         arg1='A' arg2='B'>  POLYGON EMPTY   </op> </test>
+<test> <op name='difference'    arg1='A' arg2='B'>  POLYGON EMPTY   </op> </test>
+<test> <op name='symDifference' arg1='A' arg2='B'>  POLYGON EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> POLYGON EMPTY </a>
+  <b> MULTIPOINT ((2 2), (3 3)) </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  POINT EMPTY   </op> </test>
+<test> <op name='difference'    arg1='A' arg2='B'>  POLYGON EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> POLYGON EMPTY </a>
+  <b> MULTILINESTRING ((7 7, 8 8), (9 9, 10 10)) </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  LINESTRING EMPTY   </op> </test>
+<test> <op name='difference'    arg1='A' arg2='B'>  POLYGON EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> POLYGON EMPTY </a>
+  <b> MULTIPOLYGON (((50 50, 50 60, 60 60, 60 50, 50 50)), ((70 70, 70 80, 80 80, 80 70, 70 70))) </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  POLYGON EMPTY   </op> </test>
+<test> <op name='difference'    arg1='A' arg2='B'>  POLYGON EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> POINT (1 1) </a>
+  <b> POINT EMPTY </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  POINT EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> POINT (1 1) </a>
+  <b> LINESTRING EMPTY </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  POINT EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> POINT (1 1) </a>
+  <b> POLYGON EMPTY </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  POINT EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> POINT (1 1) </a>
+  <b> POINT (1 1) </b>
+<test> <op name='difference'    arg1='A' arg2='B'>  POINT EMPTY   </op> </test>
+<test> <op name='symDifference' arg1='A' arg2='B'>  POINT EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> POINT (1 1) </a>
+  <b> LINESTRING (5 5, 6 6) </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  POINT EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> POINT (1 1) </a>
+  <b> POLYGON ((20 20, 20 30, 30 30, 30 20, 20 20)) </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  POINT EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> POINT (1 1) </a>
+  <b> MULTIPOINT EMPTY </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  POINT EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> POINT (1 1) </a>
+  <b> MULTILINESTRING EMPTY </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  POINT EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> POINT (1 1) </a>
+  <b> MULTIPOLYGON EMPTY </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  POINT EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> POINT (1 1) </a>
+  <b> MULTIPOINT ((2 2), (3 3)) </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  POINT EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> POINT (1 1) </a>
+  <b> MULTILINESTRING ((7 7, 8 8), (9 9, 10 10)) </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  POINT EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> POINT (1 1) </a>
+  <b> MULTIPOLYGON (((50 50, 50 60, 60 60, 60 50, 50 50)), ((70 70, 70 80, 80 80, 80 70, 70 70))) </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  POINT EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> LINESTRING (5 5, 6 6) </a>
+  <b> POINT EMPTY </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  POINT EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> LINESTRING (5 5, 6 6) </a>
+  <b> LINESTRING EMPTY </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  LINESTRING EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> LINESTRING (5 5, 6 6) </a>
+  <b> POLYGON EMPTY </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  LINESTRING EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> LINESTRING (5 5, 6 6) </a>
+  <b> POINT (1 1) </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  POINT EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> LINESTRING (5 5, 6 6) </a>
+  <b> LINESTRING (5 5, 6 6) </b>
+<test> <op name='difference'    arg1='A' arg2='B'>  LINESTRING EMPTY   </op> </test>
+<test> <op name='symDifference' arg1='A' arg2='B'>  LINESTRING EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> LINESTRING (5 5, 6 6) </a>
+  <b> POLYGON ((20 20, 20 30, 30 30, 30 20, 20 20)) </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  LINESTRING EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> LINESTRING (5 5, 6 6) </a>
+  <b> MULTIPOINT EMPTY </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  POINT EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> LINESTRING (5 5, 6 6) </a>
+  <b> MULTILINESTRING EMPTY </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  LINESTRING EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> LINESTRING (5 5, 6 6) </a>
+  <b> MULTIPOLYGON EMPTY </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  LINESTRING EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> LINESTRING (5 5, 6 6) </a>
+  <b> MULTIPOINT ((2 2), (3 3)) </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  POINT EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> LINESTRING (5 5, 6 6) </a>
+  <b> MULTILINESTRING ((7 7, 8 8), (9 9, 10 10)) </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  LINESTRING EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> LINESTRING (5 5, 6 6) </a>
+  <b> MULTIPOLYGON (((50 50, 50 60, 60 60, 60 50, 50 50)), ((70 70, 70 80, 80 80, 80 70, 70 70))) </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  LINESTRING EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> POLYGON ((20 20, 20 30, 30 30, 30 20, 20 20)) </a>
+  <b> POINT EMPTY </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  POINT EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> POLYGON ((20 20, 20 30, 30 30, 30 20, 20 20)) </a>
+  <b> LINESTRING EMPTY </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  LINESTRING EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> POLYGON ((20 20, 20 30, 30 30, 30 20, 20 20)) </a>
+  <b> POLYGON EMPTY </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  POLYGON EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> POLYGON ((20 20, 20 30, 30 30, 30 20, 20 20)) </a>
+  <b> POINT (1 1) </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  POINT EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> POLYGON ((20 20, 20 30, 30 30, 30 20, 20 20)) </a>
+  <b> LINESTRING (5 5, 6 6) </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  LINESTRING EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> POLYGON ((20 20, 20 30, 30 30, 30 20, 20 20)) </a>
+  <b> POLYGON ((20 20, 20 30, 30 30, 30 20, 20 20)) </b>
+<test> <op name='difference'    arg1='A' arg2='B'>  POLYGON EMPTY   </op> </test>
+<test> <op name='symDifference' arg1='A' arg2='B'>  POLYGON EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> POLYGON ((20 20, 20 30, 30 30, 30 20, 20 20)) </a>
+  <b> MULTIPOINT EMPTY </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  POINT EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> POLYGON ((20 20, 20 30, 30 30, 30 20, 20 20)) </a>
+  <b> MULTILINESTRING EMPTY </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  LINESTRING EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> POLYGON ((20 20, 20 30, 30 30, 30 20, 20 20)) </a>
+  <b> MULTIPOLYGON EMPTY </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  POLYGON EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> POLYGON ((20 20, 20 30, 30 30, 30 20, 20 20)) </a>
+  <b> MULTIPOINT ((2 2), (3 3)) </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  POINT EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> POLYGON ((20 20, 20 30, 30 30, 30 20, 20 20)) </a>
+  <b> MULTILINESTRING ((7 7, 8 8), (9 9, 10 10)) </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  LINESTRING EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> POLYGON ((20 20, 20 30, 30 30, 30 20, 20 20)) </a>
+  <b> MULTIPOLYGON (((50 50, 50 60, 60 60, 60 50, 50 50)), ((70 70, 70 80, 80 80, 80 70, 70 70))) </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  POLYGON EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> MULTIPOINT EMPTY </a>
+  <b> POINT EMPTY </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  POINT EMPTY   </op> </test>
+<test> <op name='union'         arg1='A' arg2='B'>  POINT EMPTY   </op> </test>
+<test> <op name='difference'    arg1='A' arg2='B'>  POINT EMPTY   </op> </test>
+<test> <op name='symDifference' arg1='A' arg2='B'>  POINT EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> MULTIPOINT EMPTY </a>
+  <b> LINESTRING EMPTY </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  POINT EMPTY   </op> </test>
+<test> <op name='union'         arg1='A' arg2='B'>  LINESTRING EMPTY   </op> </test>
+<test> <op name='difference'    arg1='A' arg2='B'>  POINT EMPTY   </op> </test>
+<test> <op name='symDifference' arg1='A' arg2='B'>  LINESTRING EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> MULTIPOINT EMPTY </a>
+  <b> POLYGON EMPTY </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  POINT EMPTY   </op> </test>
+<test> <op name='union'         arg1='A' arg2='B'>  POLYGON EMPTY   </op> </test>
+<test> <op name='difference'    arg1='A' arg2='B'>  POINT EMPTY   </op> </test>
+<test> <op name='symDifference' arg1='A' arg2='B'>  POLYGON EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> MULTIPOINT EMPTY </a>
+  <b> POINT (1 1) </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  POINT EMPTY   </op> </test>
+<test> <op name='difference'    arg1='A' arg2='B'>  POINT EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> MULTIPOINT EMPTY </a>
+  <b> LINESTRING (5 5, 6 6) </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  POINT EMPTY   </op> </test>
+<test> <op name='difference'    arg1='A' arg2='B'>  POINT EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> MULTIPOINT EMPTY </a>
+  <b> POLYGON ((20 20, 20 30, 30 30, 30 20, 20 20)) </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  POINT EMPTY   </op> </test>
+<test> <op name='difference'    arg1='A' arg2='B'>  POINT EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> MULTIPOINT EMPTY </a>
+  <b> MULTIPOINT EMPTY </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  POINT EMPTY   </op> </test>
+<test> <op name='union'         arg1='A' arg2='B'>  POINT EMPTY   </op> </test>
+<test> <op name='difference'    arg1='A' arg2='B'>  POINT EMPTY   </op> </test>
+<test> <op name='symDifference' arg1='A' arg2='B'>  POINT EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> MULTIPOINT EMPTY </a>
+  <b> MULTILINESTRING EMPTY </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  POINT EMPTY   </op> </test>
+<test> <op name='union'         arg1='A' arg2='B'>  LINESTRING EMPTY   </op> </test>
+<test> <op name='difference'    arg1='A' arg2='B'>  POINT EMPTY   </op> </test>
+<test> <op name='symDifference' arg1='A' arg2='B'>  LINESTRING EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> MULTIPOINT EMPTY </a>
+  <b> MULTIPOLYGON EMPTY </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  POINT EMPTY   </op> </test>
+<test> <op name='union'         arg1='A' arg2='B'>  POLYGON EMPTY   </op> </test>
+<test> <op name='difference'    arg1='A' arg2='B'>  POINT EMPTY   </op> </test>
+<test> <op name='symDifference' arg1='A' arg2='B'>  POLYGON EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> MULTIPOINT EMPTY </a>
+  <b> MULTIPOINT ((2 2), (3 3)) </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  POINT EMPTY   </op> </test>
+<test> <op name='difference'    arg1='A' arg2='B'>  POINT EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> MULTIPOINT EMPTY </a>
+  <b> MULTILINESTRING ((7 7, 8 8), (9 9, 10 10)) </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  POINT EMPTY   </op> </test>
+<test> <op name='difference'    arg1='A' arg2='B'>  POINT EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> MULTIPOINT EMPTY </a>
+  <b> MULTIPOLYGON (((50 50, 50 60, 60 60, 60 50, 50 50)), ((70 70, 70 80, 80 80, 80 70, 70 70))) </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  POINT EMPTY   </op> </test>
+<test> <op name='difference'    arg1='A' arg2='B'>  POINT EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> MULTILINESTRING EMPTY </a>
+  <b> POINT EMPTY </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  POINT EMPTY   </op> </test>
+<test> <op name='union'         arg1='A' arg2='B'>  LINESTRING EMPTY   </op> </test>
+<test> <op name='difference'    arg1='A' arg2='B'>  LINESTRING EMPTY   </op> </test>
+<test> <op name='symDifference' arg1='A' arg2='B'>  LINESTRING EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> MULTILINESTRING EMPTY </a>
+  <b> LINESTRING EMPTY </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  LINESTRING EMPTY   </op> </test>
+<test> <op name='union'         arg1='A' arg2='B'>  LINESTRING EMPTY   </op> </test>
+<test> <op name='difference'    arg1='A' arg2='B'>  LINESTRING EMPTY   </op> </test>
+<test> <op name='symDifference' arg1='A' arg2='B'>  LINESTRING EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> MULTILINESTRING EMPTY </a>
+  <b> POLYGON EMPTY </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  LINESTRING EMPTY   </op> </test>
+<test> <op name='union'         arg1='A' arg2='B'>  POLYGON EMPTY   </op> </test>
+<test> <op name='difference'    arg1='A' arg2='B'>  LINESTRING EMPTY   </op> </test>
+<test> <op name='symDifference' arg1='A' arg2='B'>  POLYGON EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> MULTILINESTRING EMPTY </a>
+  <b> POINT (1 1) </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  POINT EMPTY   </op> </test>
+<test> <op name='difference'    arg1='A' arg2='B'>  LINESTRING EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> MULTILINESTRING EMPTY </a>
+  <b> LINESTRING (5 5, 6 6) </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  LINESTRING EMPTY   </op> </test>
+<test> <op name='difference'    arg1='A' arg2='B'>  LINESTRING EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> MULTILINESTRING EMPTY </a>
+  <b> POLYGON ((20 20, 20 30, 30 30, 30 20, 20 20)) </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  LINESTRING EMPTY   </op> </test>
+<test> <op name='difference'    arg1='A' arg2='B'>  LINESTRING EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> MULTILINESTRING EMPTY </a>
+  <b> MULTIPOINT EMPTY </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  POINT EMPTY   </op> </test>
+<test> <op name='union'         arg1='A' arg2='B'>  LINESTRING EMPTY   </op> </test>
+<test> <op name='difference'    arg1='A' arg2='B'>  LINESTRING EMPTY   </op> </test>
+<test> <op name='symDifference' arg1='A' arg2='B'>  LINESTRING EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> MULTILINESTRING EMPTY </a>
+  <b> MULTILINESTRING EMPTY </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  LINESTRING EMPTY   </op> </test>
+<test> <op name='union'         arg1='A' arg2='B'>  LINESTRING EMPTY   </op> </test>
+<test> <op name='difference'    arg1='A' arg2='B'>  LINESTRING EMPTY   </op> </test>
+<test> <op name='symDifference' arg1='A' arg2='B'>  LINESTRING EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> MULTILINESTRING EMPTY </a>
+  <b> MULTIPOLYGON EMPTY </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  LINESTRING EMPTY   </op> </test>
+<test> <op name='union'         arg1='A' arg2='B'>  POLYGON EMPTY   </op> </test>
+<test> <op name='difference'    arg1='A' arg2='B'>  LINESTRING EMPTY   </op> </test>
+<test> <op name='symDifference' arg1='A' arg2='B'>  POLYGON EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> MULTILINESTRING EMPTY </a>
+  <b> MULTIPOINT ((2 2), (3 3)) </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  POINT EMPTY   </op> </test>
+<test> <op name='difference'    arg1='A' arg2='B'>  LINESTRING EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> MULTILINESTRING EMPTY </a>
+  <b> MULTILINESTRING ((7 7, 8 8), (9 9, 10 10)) </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  LINESTRING EMPTY   </op> </test>
+<test> <op name='difference'    arg1='A' arg2='B'>  LINESTRING EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> MULTILINESTRING EMPTY </a>
+  <b> MULTIPOLYGON (((50 50, 50 60, 60 60, 60 50, 50 50)), ((70 70, 70 80, 80 80, 80 70, 70 70))) </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  LINESTRING EMPTY   </op> </test>
+<test> <op name='difference'    arg1='A' arg2='B'>  LINESTRING EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> MULTIPOLYGON EMPTY </a>
+  <b> POINT EMPTY </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  POINT EMPTY   </op> </test>
+<test> <op name='union'         arg1='A' arg2='B'>  POLYGON EMPTY   </op> </test>
+<test> <op name='difference'    arg1='A' arg2='B'>  POLYGON EMPTY   </op> </test>
+<test> <op name='symDifference' arg1='A' arg2='B'>  POLYGON EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> MULTIPOLYGON EMPTY </a>
+  <b> LINESTRING EMPTY </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  LINESTRING EMPTY   </op> </test>
+<test> <op name='union'         arg1='A' arg2='B'>  POLYGON EMPTY   </op> </test>
+<test> <op name='difference'    arg1='A' arg2='B'>  POLYGON EMPTY   </op> </test>
+<test> <op name='symDifference' arg1='A' arg2='B'>  POLYGON EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> MULTIPOLYGON EMPTY </a>
+  <b> POLYGON EMPTY </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  POLYGON EMPTY   </op> </test>
+<test> <op name='union'         arg1='A' arg2='B'>  POLYGON EMPTY   </op> </test>
+<test> <op name='difference'    arg1='A' arg2='B'>  POLYGON EMPTY   </op> </test>
+<test> <op name='symDifference' arg1='A' arg2='B'>  POLYGON EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> MULTIPOLYGON EMPTY </a>
+  <b> POINT (1 1) </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  POINT EMPTY   </op> </test>
+<test> <op name='difference'    arg1='A' arg2='B'>  POLYGON EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> MULTIPOLYGON EMPTY </a>
+  <b> LINESTRING (5 5, 6 6) </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  LINESTRING EMPTY   </op> </test>
+<test> <op name='difference'    arg1='A' arg2='B'>  POLYGON EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> MULTIPOLYGON EMPTY </a>
+  <b> POLYGON ((20 20, 20 30, 30 30, 30 20, 20 20)) </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  POLYGON EMPTY   </op> </test>
+<test> <op name='difference'    arg1='A' arg2='B'>  POLYGON EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> MULTIPOLYGON EMPTY </a>
+  <b> MULTIPOINT EMPTY </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  POINT EMPTY   </op> </test>
+<test> <op name='union'         arg1='A' arg2='B'>  POLYGON EMPTY   </op> </test>
+<test> <op name='difference'    arg1='A' arg2='B'>  POLYGON EMPTY   </op> </test>
+<test> <op name='symDifference' arg1='A' arg2='B'>  POLYGON EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> MULTIPOLYGON EMPTY </a>
+  <b> MULTILINESTRING EMPTY </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  LINESTRING EMPTY   </op> </test>
+<test> <op name='union'         arg1='A' arg2='B'>  POLYGON EMPTY   </op> </test>
+<test> <op name='difference'    arg1='A' arg2='B'>  POLYGON EMPTY   </op> </test>
+<test> <op name='symDifference' arg1='A' arg2='B'>  POLYGON EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> MULTIPOLYGON EMPTY </a>
+  <b> MULTIPOLYGON EMPTY </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  POLYGON EMPTY   </op> </test>
+<test> <op name='union'         arg1='A' arg2='B'>  POLYGON EMPTY   </op> </test>
+<test> <op name='difference'    arg1='A' arg2='B'>  POLYGON EMPTY   </op> </test>
+<test> <op name='symDifference' arg1='A' arg2='B'>  POLYGON EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> MULTIPOLYGON EMPTY </a>
+  <b> MULTIPOINT ((2 2), (3 3)) </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  POINT EMPTY   </op> </test>
+<test> <op name='difference'    arg1='A' arg2='B'>  POLYGON EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> MULTIPOLYGON EMPTY </a>
+  <b> MULTILINESTRING ((7 7, 8 8), (9 9, 10 10)) </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  LINESTRING EMPTY   </op> </test>
+<test> <op name='difference'    arg1='A' arg2='B'>  POLYGON EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> MULTIPOLYGON EMPTY </a>
+  <b> MULTIPOLYGON (((50 50, 50 60, 60 60, 60 50, 50 50)), ((70 70, 70 80, 80 80, 80 70, 70 70))) </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  POLYGON EMPTY   </op> </test>
+<test> <op name='difference'    arg1='A' arg2='B'>  POLYGON EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> MULTIPOINT ((2 2), (3 3)) </a>
+  <b> POINT EMPTY </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  POINT EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> MULTIPOINT ((2 2), (3 3)) </a>
+  <b> LINESTRING EMPTY </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  POINT EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> MULTIPOINT ((2 2), (3 3)) </a>
+  <b> POLYGON EMPTY </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  POINT EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> MULTIPOINT ((2 2), (3 3)) </a>
+  <b> POINT (1 1) </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  POINT EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> MULTIPOINT ((2 2), (3 3)) </a>
+  <b> LINESTRING (5 5, 6 6) </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  POINT EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> MULTIPOINT ((2 2), (3 3)) </a>
+  <b> POLYGON ((20 20, 20 30, 30 30, 30 20, 20 20)) </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  POINT EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> MULTIPOINT ((2 2), (3 3)) </a>
+  <b> MULTIPOINT EMPTY </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  POINT EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> MULTIPOINT ((2 2), (3 3)) </a>
+  <b> MULTILINESTRING EMPTY </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  POINT EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> MULTIPOINT ((2 2), (3 3)) </a>
+  <b> MULTIPOLYGON EMPTY </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  POINT EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> MULTIPOINT ((2 2), (3 3)) </a>
+  <b> MULTIPOINT ((2 2), (3 3)) </b>
+<test> <op name='difference'    arg1='A' arg2='B'>  POINT EMPTY   </op> </test>
+<test> <op name='symDifference' arg1='A' arg2='B'>  POINT EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> MULTIPOINT ((2 2), (3 3)) </a>
+  <b> MULTILINESTRING ((7 7, 8 8), (9 9, 10 10)) </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  POINT EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> MULTIPOINT ((2 2), (3 3)) </a>
+  <b> MULTIPOLYGON (((50 50, 50 60, 60 60, 60 50, 50 50)), ((70 70, 70 80, 80 80, 80 70, 70 70))) </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  POINT EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> MULTILINESTRING ((7 7, 8 8), (9 9, 10 10)) </a>
+  <b> POINT EMPTY </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  POINT EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> MULTILINESTRING ((7 7, 8 8), (9 9, 10 10)) </a>
+  <b> LINESTRING EMPTY </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  LINESTRING EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> MULTILINESTRING ((7 7, 8 8), (9 9, 10 10)) </a>
+  <b> POLYGON EMPTY </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  LINESTRING EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> MULTILINESTRING ((7 7, 8 8), (9 9, 10 10)) </a>
+  <b> POINT (1 1) </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  POINT EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> MULTILINESTRING ((7 7, 8 8), (9 9, 10 10)) </a>
+  <b> LINESTRING (5 5, 6 6) </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  LINESTRING EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> MULTILINESTRING ((7 7, 8 8), (9 9, 10 10)) </a>
+  <b> POLYGON ((20 20, 20 30, 30 30, 30 20, 20 20)) </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  LINESTRING EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> MULTILINESTRING ((7 7, 8 8), (9 9, 10 10)) </a>
+  <b> MULTIPOINT EMPTY </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  POINT EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> MULTILINESTRING ((7 7, 8 8), (9 9, 10 10)) </a>
+  <b> MULTILINESTRING EMPTY </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  LINESTRING EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> MULTILINESTRING ((7 7, 8 8), (9 9, 10 10)) </a>
+  <b> MULTIPOLYGON EMPTY </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  LINESTRING EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> MULTILINESTRING ((7 7, 8 8), (9 9, 10 10)) </a>
+  <b> MULTIPOINT ((2 2), (3 3)) </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  POINT EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> MULTILINESTRING ((7 7, 8 8), (9 9, 10 10)) </a>
+  <b> MULTILINESTRING ((7 7, 8 8), (9 9, 10 10)) </b>
+<test> <op name='difference'    arg1='A' arg2='B'>  LINESTRING EMPTY   </op> </test>
+<test> <op name='symDifference' arg1='A' arg2='B'>  LINESTRING EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> MULTILINESTRING ((7 7, 8 8), (9 9, 10 10)) </a>
+  <b> MULTIPOLYGON (((50 50, 50 60, 60 60, 60 50, 50 50)), ((70 70, 70 80, 80 80, 80 70, 70 70))) </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  LINESTRING EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> MULTIPOLYGON (((50 50, 50 60, 60 60, 60 50, 50 50)), ((70 70, 70 80, 80 80, 80 70, 70 70))) </a>
+  <b> POINT EMPTY </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  POINT EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> MULTIPOLYGON (((50 50, 50 60, 60 60, 60 50, 50 50)), ((70 70, 70 80, 80 80, 80 70, 70 70))) </a>
+  <b> LINESTRING EMPTY </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  LINESTRING EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> MULTIPOLYGON (((50 50, 50 60, 60 60, 60 50, 50 50)), ((70 70, 70 80, 80 80, 80 70, 70 70))) </a>
+  <b> POLYGON EMPTY </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  POLYGON EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> MULTIPOLYGON (((50 50, 50 60, 60 60, 60 50, 50 50)), ((70 70, 70 80, 80 80, 80 70, 70 70))) </a>
+  <b> POINT (1 1) </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  POINT EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> MULTIPOLYGON (((50 50, 50 60, 60 60, 60 50, 50 50)), ((70 70, 70 80, 80 80, 80 70, 70 70))) </a>
+  <b> LINESTRING (5 5, 6 6) </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  LINESTRING EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> MULTIPOLYGON (((50 50, 50 60, 60 60, 60 50, 50 50)), ((70 70, 70 80, 80 80, 80 70, 70 70))) </a>
+  <b> POLYGON ((20 20, 20 30, 30 30, 30 20, 20 20)) </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  POLYGON EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> MULTIPOLYGON (((50 50, 50 60, 60 60, 60 50, 50 50)), ((70 70, 70 80, 80 80, 80 70, 70 70))) </a>
+  <b> MULTIPOINT EMPTY </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  POINT EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> MULTIPOLYGON (((50 50, 50 60, 60 60, 60 50, 50 50)), ((70 70, 70 80, 80 80, 80 70, 70 70))) </a>
+  <b> MULTILINESTRING EMPTY </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  LINESTRING EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> MULTIPOLYGON (((50 50, 50 60, 60 60, 60 50, 50 50)), ((70 70, 70 80, 80 80, 80 70, 70 70))) </a>
+  <b> MULTIPOLYGON EMPTY </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  POLYGON EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> MULTIPOLYGON (((50 50, 50 60, 60 60, 60 50, 50 50)), ((70 70, 70 80, 80 80, 80 70, 70 70))) </a>
+  <b> MULTIPOINT ((2 2), (3 3)) </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  POINT EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> MULTIPOLYGON (((50 50, 50 60, 60 60, 60 50, 50 50)), ((70 70, 70 80, 80 80, 80 70, 70 70))) </a>
+  <b> MULTILINESTRING ((7 7, 8 8), (9 9, 10 10)) </b>
+<test> <op name='intersection'  arg1='A' arg2='B'>  LINESTRING EMPTY   </op> </test>
+</case>
+
+<case>
+  <a> MULTIPOLYGON (((50 50, 50 60, 60 60, 60 50, 50 50)), ((70 70, 70 80, 80 80, 80 70, 70 70))) </a>
+  <b> MULTIPOLYGON (((50 50, 50 60, 60 60, 60 50, 50 50)), ((70 70, 70 80, 80 80, 80 70, 70 70))) </b>
+<test> <op name='difference'    arg1='A' arg2='B'>  POLYGON EMPTY   </op> </test>
+<test> <op name='symDifference' arg1='A' arg2='B'>  POLYGON EMPTY   </op> </test>
+</case>
+
+
+</run>
+
diff --git a/tests/xmltester/tests/general/TestOverlayLA.xml b/tests/xmltester/tests/general/TestOverlayLA.xml
new file mode 100644
index 0000000..f9444fb
--- /dev/null
+++ b/tests/xmltester/tests/general/TestOverlayLA.xml
@@ -0,0 +1,329 @@
+<run>
+
+<case>
+  <desc>mLmA - A and B complex, disjoint</desc>
+  <a>
+    MULTIPOLYGON(
+      (
+        (60 320, 60 80, 300 80, 60 320), 
+        (80 280, 80 100, 260 100, 80 280)), 
+      (
+        (120 160, 140 160, 140 140, 120 160)))
+  </a>
+  <b>
+    MULTILINESTRING(
+      (100 240, 100 180, 160 180, 160 120, 220 120), 
+      (40 360, 40 60, 340 60, 40 360, 40 20), 
+      (120 120, 120 140, 100 140, 100 120, 140 120))
+  </b>
+<test>
+  <op name="symdifference" pattern="FFFFFFFFF" arg1="A" arg2="B">
+    GEOMETRYCOLLECTION(
+      LINESTRING(100 240, 100 180, 160 180, 160 120, 220 120), 
+      LINESTRING(40 360, 40 60), 
+      LINESTRING(40 60, 340 60, 40 360), 
+      LINESTRING(40 60, 40 20), 
+      LINESTRING(120 120, 120 140, 100 140, 100 120, 120 120), 
+      LINESTRING(120 120, 140 120), 
+      POLYGON(
+        (60 320, 300 80, 60 80, 60 320), 
+        (80 280, 80 100, 260 100, 80 280)), 
+      POLYGON(
+        (120 160, 140 160, 140 140, 120 160)))
+  </op>
+</test>
+<test>
+  <op name="difference" pattern="FFFFFFFFF" arg1="A" arg2="B">
+    MULTIPOLYGON(
+      (
+        (60 320, 300 80, 60 80, 60 320), 
+        (80 280, 80 100, 260 100, 80 280)), 
+      (
+        (120 160, 140 160, 140 140, 120 160)))
+  </op>
+</test>
+<test>
+  <op name="union" pattern="FFFFFFFFF" arg1="A" arg2="B">
+    GEOMETRYCOLLECTION(
+      LINESTRING(100 240, 100 180, 160 180, 160 120, 220 120), 
+      LINESTRING(40 360, 40 60), 
+      LINESTRING(40 60, 340 60, 40 360), 
+      LINESTRING(40 60, 40 20), 
+      LINESTRING(120 120, 120 140, 100 140, 100 120, 120 120), 
+      LINESTRING(120 120, 140 120), 
+      POLYGON(
+        (60 320, 300 80, 60 80, 60 320), 
+        (80 280, 80 100, 260 100, 80 280)), 
+      POLYGON(
+        (120 160, 140 160, 140 140, 120 160)))
+  </op>
+</test>
+<test>
+  <op name="intersection" pattern="FFFFFFFFF" arg1="A" arg2="B">
+    LINESTRING EMPTY
+  </op>
+</test>
+</case>
+
+<case>
+  <desc>mLmA - A and B complex, overlapping and touching #1</desc>
+  <a>
+    MULTIPOLYGON(
+      (
+        (60 260, 60 120, 220 120, 220 260, 60 260), 
+        (80 240, 80 140, 200 140, 200 240, 80 240)), 
+      (
+        (100 220, 100 160, 180 160, 180 220, 100 220), 
+        (120 200, 120 180, 160 180, 160 200, 120 200)))
+  </a>
+  <b>
+    MULTILINESTRING(
+      (40 260, 240 260, 240 240, 40 240, 40 220, 240 220), 
+      (120 300, 120 80, 140 80, 140 300, 140 80, 120 80, 120 320))
+  </b>
+  <test>
+    <op name="intersection" arg1="A" arg2="B">
+      MULTILINESTRING(
+        (220 260, 140 260), 
+        (140 260, 120 260), 
+        (120 260, 60 260), 
+        (200 240, 140 240), 
+        (140 240, 120 240), 
+        (120 240, 80 240), 
+        (180 220, 140 220), 
+        (140 220, 120 220), 
+        (120 220, 100 220), 
+        (120 200, 120 180), 
+        (220 240, 200 240), 
+        (80 240, 60 240), 
+        (60 220, 80 220), 
+        (200 220, 220 220), 
+        (120 260, 120 240), 
+        (120 220, 120 200), 
+        (120 180, 120 160), 
+        (120 140, 120 120), 
+        (140 120, 140 140), 
+        (140 160, 140 180), 
+        (140 200, 140 220), 
+        (140 240, 140 260))
+          </op>
+  </test>
+  <test>
+    <op name="union" arg1="A" arg2="B">
+      GEOMETRYCOLLECTION(
+        LINESTRING(40 260, 60 260), 
+        LINESTRING(220 260, 240 260, 240 240, 220 240), 
+        LINESTRING(60 240, 40 240, 40 220, 60 220), 
+        LINESTRING(80 220, 100 220), 
+        LINESTRING(180 220, 200 220), 
+        LINESTRING(220 220, 240 220), 
+        LINESTRING(120 300, 120 260), 
+        LINESTRING(120 240, 120 220), 
+        LINESTRING(120 160, 120 140), 
+        LINESTRING(120 120, 120 80), 
+        LINESTRING(120 80, 140 80), 
+        LINESTRING(140 80, 140 120), 
+        LINESTRING(140 140, 140 160), 
+        LINESTRING(140 180, 140 200), 
+        LINESTRING(140 220, 140 240), 
+        LINESTRING(140 260, 140 300), 
+        LINESTRING(120 300, 120 320), 
+        POLYGON(
+          (60 240, 60 260, 120 260, 140 260, 220 260, 220 240, 220 220, 220 120, 140 120, 
+          120 120, 60 120, 60 220, 60 240), 
+          (80 240, 80 220, 80 140, 120 140, 140 140, 200 140, 200 220, 200 240, 140 240, 
+          120 240, 80 240)), 
+        POLYGON(
+          (120 160, 100 160, 100 220, 120 220, 140 220, 180 220, 180 160, 140 160, 120 160), 
+          (120 200, 120 180, 140 180, 160 180, 160 200, 140 200, 120 200)))
+          </op>
+  </test>
+  <test>
+    <op name="difference" arg1="A" arg2="B">
+      MULTIPOLYGON(
+        (
+          (60 240, 60 260, 120 260, 140 260, 220 260, 220 240, 220 220, 220 120, 140 120, 
+          120 120, 60 120, 60 220, 60 240), 
+          (80 240, 80 220, 80 140, 120 140, 140 140, 200 140, 200 220, 200 240, 140 240, 
+          120 240, 80 240)), 
+        (
+          (120 160, 100 160, 100 220, 120 220, 140 220, 180 220, 180 160, 140 160, 120 160), 
+          (120 200, 120 180, 140 180, 160 180, 160 200, 140 200, 120 200)))
+          </op>
+  </test>
+  <test>
+    <op name="symdifference" arg1="A" arg2="B">
+      GEOMETRYCOLLECTION(
+        LINESTRING(40 260, 60 260), 
+        LINESTRING(220 260, 240 260, 240 240, 220 240), 
+        LINESTRING(60 240, 40 240, 40 220, 60 220), 
+        LINESTRING(80 220, 100 220), 
+        LINESTRING(180 220, 200 220), 
+        LINESTRING(220 220, 240 220), 
+        LINESTRING(120 300, 120 260), 
+        LINESTRING(120 240, 120 220), 
+        LINESTRING(120 160, 120 140), 
+        LINESTRING(120 120, 120 80), 
+        LINESTRING(120 80, 140 80), 
+        LINESTRING(140 80, 140 120), 
+        LINESTRING(140 140, 140 160), 
+        LINESTRING(140 180, 140 200), 
+        LINESTRING(140 220, 140 240), 
+        LINESTRING(140 260, 140 300), 
+        LINESTRING(120 300, 120 320), 
+        POLYGON(
+          (60 240, 60 260, 120 260, 140 260, 220 260, 220 240, 220 220, 220 120, 140 120, 
+          120 120, 60 120, 60 220, 60 240), 
+          (80 240, 80 220, 80 140, 120 140, 140 140, 200 140, 200 220, 200 240, 140 240, 
+          120 240, 80 240)), 
+        POLYGON(
+          (120 160, 100 160, 100 220, 120 220, 140 220, 180 220, 180 160, 140 160, 120 160), 
+          (120 200, 120 180, 140 180, 160 180, 160 200, 140 200, 120 200)))
+          </op>
+  </test>
+</case>
+
+<case>
+  <desc>mLmA - A and B complex, overlapping and touching #2</desc>
+  <a>
+    MULTIPOLYGON(
+      (
+        (60 320, 60 120, 280 120, 280 320, 60 320), 
+        (120 260, 120 180, 240 180, 240 260, 120 260)), 
+      (
+        (280 400, 320 400, 320 360, 280 360, 280 400)), 
+      (
+        (300 240, 300 220, 320 220, 320 240, 300 240)))
+  </a>
+  <b>
+    MULTILINESTRING(
+      (80 300, 80 160, 260 160, 260 300, 80 300, 80 140), 
+      (220 360, 220 240, 300 240, 300 360))
+  </b>
+<test>
+  <op name="symdifference" pattern="FFFFFFFFF" arg1="A" arg2="B">
+    GEOMETRYCOLLECTION(
+      LINESTRING(220 360, 220 320), 
+      LINESTRING(220 260, 220 240, 240 240), 
+      LINESTRING(280 240, 300 240), 
+      LINESTRING(300 240, 300 360), 
+      POLYGON(
+        (280 240, 280 120, 60 120, 60 320, 220 320, 280 320, 280 240), 
+        (120 260, 120 180, 240 180, 240 240, 240 260, 220 260, 120 260)), 
+      POLYGON(
+        (280 400, 320 400, 320 360, 300 360, 280 360, 280 400)), 
+      POLYGON(
+        (300 240, 320 240, 320 220, 300 220, 300 240)))
+  </op>
+</test>
+<test>
+  <op name="difference" pattern="FFFFFFFFF" arg1="A" arg2="B">
+    MULTIPOLYGON(
+      (
+        (280 240, 280 120, 60 120, 60 320, 220 320, 280 320, 280 240), 
+        (120 260, 120 180, 240 180, 240 240, 240 260, 220 260, 120 260)), 
+      (
+        (280 400, 320 400, 320 360, 300 360, 280 360, 280 400)), 
+      (
+        (300 240, 320 240, 320 220, 300 220, 300 240)))
+  </op>
+</test>
+<test>
+  <op name="union" pattern="FFFFFFFFF" arg1="A" arg2="B">
+    GEOMETRYCOLLECTION(
+      LINESTRING(220 360, 220 320), 
+      LINESTRING(220 260, 220 240, 240 240), 
+      LINESTRING(280 240, 300 240), 
+      LINESTRING(300 240, 300 360), 
+      POLYGON(
+        (280 240, 280 120, 60 120, 60 320, 220 320, 280 320, 280 240), 
+        (120 260, 120 180, 240 180, 240 240, 240 260, 220 260, 120 260)), 
+      POLYGON(
+        (280 400, 320 400, 320 360, 300 360, 280 360, 280 400)), 
+      POLYGON(
+        (300 240, 320 240, 320 220, 300 220, 300 240)))
+  </op>
+</test>
+<test>
+  <op name="intersection" pattern="FFFFFFFFF" arg1="A" arg2="B">
+    GEOMETRYCOLLECTION(
+      POINT(300 240), 
+      POINT(300 360), 
+      LINESTRING(80 300, 80 160), 
+      LINESTRING(80 160, 260 160, 260 240), 
+      LINESTRING(260 240, 260 300, 220 300), 
+      LINESTRING(220 300, 80 300), 
+      LINESTRING(80 160, 80 140), 
+      LINESTRING(220 320, 220 300), 
+      LINESTRING(220 300, 220 260), 
+      LINESTRING(240 240, 260 240), 
+      LINESTRING(260 240, 280 240))
+  </op>
+</test>
+</case>
+
+<case>
+  <desc>mLmA - A and B complex, overlapping and touching #3</desc>
+  <a>
+    MULTIPOLYGON(
+      (
+        (120 180, 60 80, 180 80, 120 180)), 
+      (
+        (100 240, 140 240, 120 220, 100 240)))
+  </a>
+  <b>
+    MULTILINESTRING(
+      (180 260, 120 180, 60 260, 180 260), 
+      (60 300, 60 40), 
+      (100 100, 140 100))
+  </b>
+<test>
+  <op name="symdifference" pattern="FFFFFFFFF" arg1="A" arg2="B">
+    GEOMETRYCOLLECTION(
+      LINESTRING(180 260, 120 180), 
+      LINESTRING(120 180, 60 260), 
+      LINESTRING(60 260, 180 260), 
+      LINESTRING(60 300, 60 260), 
+      LINESTRING(60 260, 60 80), 
+      LINESTRING(60 80, 60 40), 
+      POLYGON(
+        (60 80, 120 180, 180 80, 60 80)), 
+      POLYGON(
+        (100 240, 140 240, 120 220, 100 240)))
+  </op>
+</test>
+<test>
+  <op name="difference" pattern="FFFFFFFFF" arg1="A" arg2="B">
+    MULTIPOLYGON(
+      (
+        (60 80, 120 180, 180 80, 60 80)), 
+      (
+        (100 240, 140 240, 120 220, 100 240)))
+  </op>
+</test>
+<test>
+  <op name="union" pattern="FFFFFFFFF" arg1="A" arg2="B">
+    GEOMETRYCOLLECTION(
+      LINESTRING(180 260, 120 180), 
+      LINESTRING(120 180, 60 260), 
+      LINESTRING(60 260, 180 260), 
+      LINESTRING(60 300, 60 260), 
+      LINESTRING(60 260, 60 80), 
+      LINESTRING(60 80, 60 40), 
+      POLYGON(
+        (60 80, 120 180, 180 80, 60 80)), 
+      POLYGON(
+        (100 240, 140 240, 120 220, 100 240)))
+  </op>
+</test>
+<test>
+  <op name="intersection" pattern="FFFFFFFFF" arg1="A" arg2="B">
+    GEOMETRYCOLLECTION(
+      POINT(60 80), 
+      POINT(120 180), 
+      LINESTRING(100 100, 140 100))
+  </op>
+</test>
+</case>
+
+</run>
diff --git a/tests/xmltester/tests/general/TestFunctionLAPrec.xml b/tests/xmltester/tests/general/TestOverlayLAPrec.xml
similarity index 69%
rename from tests/xmltester/tests/general/TestFunctionLAPrec.xml
rename to tests/xmltester/tests/general/TestOverlayLAPrec.xml
index 56e7a8a..8862ddd 100644
--- a/tests/xmltester/tests/general/TestFunctionLAPrec.xml
+++ b/tests/xmltester/tests/general/TestOverlayLAPrec.xml
@@ -11,17 +11,6 @@
     LINESTRING(93 13, 96 13)
   </b>
 <test>
-  <op name="getboundary" arg1="A">
-    LINESTRING(95 9, 81 414, 87 414, 95 9)
-  </op>
-</test>
-<test>
-  <op name="convexhull" arg1="A">
-    POLYGON(
-      (95 9, 81 414, 87 414, 95 9))
-  </op>
-</test>
-<test>
   <op name="intersection" arg1="A" arg2="B">
     POINT(95 13)
   </op>
@@ -29,17 +18,17 @@
 <test>
   <op name="union" arg1="A" arg2="B">
     GEOMETRYCOLLECTION(
-      LINESTRING(95 9, 95 13),
+      LINESTRING(95 9, 95 13), 
       POLYGON(
-        (95 13, 81 414, 87 414, 95 13)),
-      LINESTRING(93 13, 95 13),
+        (95 13, 81 414, 87 414, 95 13)), 
+      LINESTRING(93 13, 95 13), 
       LINESTRING(95 13, 96 13))
   </op>
 </test>
 <test>
   <op name="difference" arg1="A" arg2="B">
     GEOMETRYCOLLECTION(
-      LINESTRING(95 9, 95 13),
+      LINESTRING(95 9, 95 13), 
       POLYGON(
         (95 13, 81 414, 87 414, 95 13)))
   </op>
@@ -47,10 +36,10 @@
 <test>
   <op name="symdifference" arg1="A" arg2="B">
     GEOMETRYCOLLECTION(
-      LINESTRING(95 9, 95 13),
+      LINESTRING(95 9, 95 13), 
       POLYGON(
-        (95 13, 81 414, 87 414, 95 13)),
-      LINESTRING(93 13, 95 13),
+        (95 13, 81 414, 87 414, 95 13)), 
+      LINESTRING(93 13, 95 13), 
       LINESTRING(95 13, 96 13))
   </op>
 </test>
@@ -73,7 +62,7 @@
 <test>
   <op name="union" arg1="A" arg2="B">
     GEOMETRYCOLLECTION(
-      LINESTRING(240 190, 177 153),
+      LINESTRING(240 190, 177 153), 
       POLYGON(
         (177 153, 240 70, 50 80, 110 240, 177 153)))
   </op>
@@ -86,7 +75,7 @@
 <test>
   <op name="symdifference" arg1="A" arg2="B">
     GEOMETRYCOLLECTION(
-      LINESTRING(240 190, 177 153),
+      LINESTRING(240 190, 177 153), 
       POLYGON(
         (177 153, 240 70, 50 80, 110 240, 177 153)))
   </op>
@@ -100,43 +89,43 @@
   </a>
   <b>
     POLYGON(
-      (30 240, 260 30, 30 30, 30 240),
+      (30 240, 260 30, 30 30, 30 240), 
       (80 140, 80 80, 140 80, 80 140))
   </b>
 <test>
   <op name="intersection" arg1="A" arg2="B">
     MULTILINESTRING(
-      (30 100, 80 100),
+      (30 100, 80 100), 
       (110 110, 140 140))
   </op>
 </test>
 <test>
   <op name="union" arg1="A" arg2="B">
     GEOMETRYCOLLECTION(
-      LINESTRING(0 100, 30 100),
-      LINESTRING(80 100, 100 100, 110 110),
-      LINESTRING(140 140, 200 200),
+      LINESTRING(0 100, 30 100), 
+      LINESTRING(80 100, 100 100, 110 110), 
+      LINESTRING(140 140, 200 200), 
       POLYGON(
-        (30 240, 140 140, 260 30, 30 30, 30 100, 30 240),
+        (30 240, 140 140, 260 30, 30 30, 30 100, 30 240), 
         (80 140, 80 100, 80 80, 140 80, 110 110, 80 140)))
   </op>
 </test>
 <test>
   <op name="difference" arg1="A" arg2="B">
     MULTILINESTRING(
-      (0 100, 30 100),
-      (80 100, 100 100, 110 110),
+      (0 100, 30 100), 
+      (80 100, 100 100, 110 110), 
       (140 140, 200 200))
   </op>
 </test>
 <test>
   <op name="symdifference" arg1="A" arg2="B">
     GEOMETRYCOLLECTION(
-      LINESTRING(0 100, 30 100),
-      LINESTRING(80 100, 100 100, 110 110),
-      LINESTRING(140 140, 200 200),
+      LINESTRING(0 100, 30 100), 
+      LINESTRING(80 100, 100 100, 110 110), 
+      LINESTRING(140 140, 200 200), 
       POLYGON(
-        (30 240, 140 140, 260 30, 30 30, 30 100, 30 240),
+        (30 240, 140 140, 260 30, 30 30, 30 100, 30 240), 
         (80 140, 80 100, 80 80, 140 80, 110 110, 80 140)))
   </op>
 </test>
@@ -149,45 +138,45 @@
   </a>
   <b>
     POLYGON(
-      (160 330, 60 260, 20 150, 60 40, 190 20, 270 130, 260 250, 160 330),
+      (160 330, 60 260, 20 150, 60 40, 190 20, 270 130, 260 250, 160 330), 
       (140 240, 80 190, 90 100, 160 70, 210 130, 210 210, 140 240))
   </b>
 <test>
   <op name="intersection" arg1="A" arg2="B">
     MULTILINESTRING(
-      (114 298, 200 250, 173 226),
+      (114 298, 200 250, 173 226), 
       (182 96, 225 68))
   </op>
 </test>
 <test>
   <op name="union" arg1="A" arg2="B">
     GEOMETRYCOLLECTION(
-      LINESTRING(40 340, 114 298),
-      LINESTRING(173 226, 120 180, 160 110, 182 96),
-      LINESTRING(225 68, 270 40),
+      LINESTRING(40 340, 114 298), 
+      LINESTRING(173 226, 120 180, 160 110, 182 96), 
+      LINESTRING(225 68, 270 40), 
       POLYGON(
-        (114 298, 160 330, 260 250, 270 130, 225 68, 190 20, 60 40, 20 150, 60 260,
-        114 298),
+        (114 298, 160 330, 260 250, 270 130, 225 68, 190 20, 60 40, 20 150, 60 260, 
+        114 298), 
         (140 240, 80 190, 90 100, 160 70, 182 96, 210 130, 210 210, 173 226, 140 240)))
   </op>
 </test>
 <test>
   <op name="difference" arg1="A" arg2="B">
     MULTILINESTRING(
-      (40 340, 114 298),
-      (173 226, 120 180, 160 110, 182 96),
+      (40 340, 114 298), 
+      (173 226, 120 180, 160 110, 182 96), 
       (225 68, 270 40))
   </op>
 </test>
 <test>
   <op name="symdifference" arg1="A" arg2="B">
     GEOMETRYCOLLECTION(
-      LINESTRING(40 340, 114 298),
-      LINESTRING(173 226, 120 180, 160 110, 182 96),
-      LINESTRING(225 68, 270 40),
+      LINESTRING(40 340, 114 298), 
+      LINESTRING(173 226, 120 180, 160 110, 182 96), 
+      LINESTRING(225 68, 270 40), 
       POLYGON(
-        (114 298, 160 330, 260 250, 270 130, 225 68, 190 20, 60 40, 20 150, 60 260,
-        114 298),
+        (114 298, 160 330, 260 250, 270 130, 225 68, 190 20, 60 40, 20 150, 60 260, 
+        114 298), 
         (140 240, 80 190, 90 100, 160 70, 182 96, 210 130, 210 210, 173 226, 140 240)))
   </op>
 </test>
diff --git a/tests/xmltester/tests/general/TestFunctionLL.xml b/tests/xmltester/tests/general/TestOverlayLL.xml
similarity index 70%
rename from tests/xmltester/tests/general/TestFunctionLL.xml
rename to tests/xmltester/tests/general/TestOverlayLL.xml
index cdd3659..89c481e 100644
--- a/tests/xmltester/tests/general/TestFunctionLL.xml
+++ b/tests/xmltester/tests/general/TestOverlayLL.xml
@@ -16,25 +16,25 @@
 <test>
   <op name="union" arg1="A" arg2="B">
     MULTILINESTRING(
-      (0 0, 50 50),
-      (0 100, 50 50),
-      (50 50, 100 100),
+      (0 0, 50 50), 
+      (0 100, 50 50), 
+      (50 50, 100 100), 
       (50 50, 100 0))
   </op>
 </test>
 <test>
   <op name="difference" arg1="A" arg2="B">
     MULTILINESTRING(
-      (0 0, 50 50),
+      (0 0, 50 50), 
       (50 50, 100 100))
   </op>
 </test>
 <test>
   <op name="symdifference" arg1="A" arg2="B">
     MULTILINESTRING(
-      (0 0, 50 50),
-      (0 100, 50 50),
-      (50 50, 100 100),
+      (0 0, 50 50), 
+      (0 100, 50 50), 
+      (50 50, 100 100), 
       (50 50, 100 0))
   </op>
 </test>
@@ -56,8 +56,8 @@
 <test>
   <op name="union" arg1="A" arg2="B">
     MULTILINESTRING(
-      (0 0, 100 100),
-      (100 100, 200 200),
+      (0 0, 100 100), 
+      (100 100, 200 200), 
       (100 100, 200 0))
   </op>
 </test>
@@ -69,7 +69,7 @@
 <test>
   <op name="symdifference" arg1="A" arg2="B">
     MULTILINESTRING(
-      (100 100, 200 200),
+      (100 100, 200 200), 
       (100 100, 200 0))
   </op>
 </test>
@@ -84,17 +84,6 @@
     LINESTRING(120 340, 60 220, 140 220, 140 360)
   </b>
 <test>
-  <op name="getboundary" arg1="A">
-    MULTIPOINT((40 360), (120 360))
-  </op>
-</test>
-<test>
-  <op name="convexhull" arg1="A">
-    POLYGON(
-      (40 220, 40 360, 120 360, 40 220))
-  </op>
-</test>
-<test>
   <op name="intersection" arg1="A" arg2="B">
     LINESTRING EMPTY
   </op>
@@ -102,7 +91,7 @@
 <test>
   <op name="union" arg1="A" arg2="B">
     MULTILINESTRING(
-      (40 360, 40 220, 120 360),
+      (40 360, 40 220, 120 360), 
       (120 340, 60 220, 140 220, 140 360))
   </op>
 </test>
@@ -114,13 +103,12 @@
 <test>
   <op name="symdifference" arg1="A" arg2="B">
     MULTILINESTRING(
-      (40 360, 40 220, 120 360),
+      (40 360, 40 220, 120 360), 
       (120 340, 60 220, 140 220, 140 360))
   </op>
 </test>
 </case>
 
-
 <case>
   <desc>LL - A and B equal</desc>
   <a>
@@ -130,29 +118,18 @@
     LINESTRING(80 320, 220 320, 220 160, 80 300)
   </b>
 <test>
-  <op name="getboundary" arg1="A">
-    MULTIPOINT((80 320), (80 300))
-  </op>
-</test>
-<test>
-  <op name="convexhull" arg1="A">
-    POLYGON(
-      (220 160, 80 300, 80 320, 220 320, 220 160))
-  </op>
-</test>
-<test>
   <op name="intersection" arg1="A" arg2="B">
     MULTILINESTRING(
-      (220 160, 80 300),
-      (80 320, 220 320),
+      (220 160, 80 300), 
+      (80 320, 220 320), 
       (220 320, 220 160))
   </op>
 </test>
 <test>
   <op name="union" arg1="A" arg2="B">
     MULTILINESTRING(
-      (220 160, 80 300),
-      (80 320, 220 320),
+      (220 160, 80 300), 
+      (80 320, 220 320), 
       (220 320, 220 160))
   </op>
 </test>
@@ -177,17 +154,6 @@
     LINESTRING(60 200, 60 140, 140 200)
   </b>
 <test>
-  <op name="getboundary" arg1="A">
-    MULTIPOINT((60 200), (140 200))
-  </op>
-</test>
-<test>
-  <op name="convexhull" arg1="A">
-    POLYGON(
-      (60 200, 60 260, 140 200, 60 200))
-  </op>
-</test>
-<test>
   <op name="intersection" arg1="A" arg2="B">
     MULTIPOINT((60 200), (140 200))
   </op>
@@ -195,7 +161,7 @@
 <test>
   <op name="union" arg1="A" arg2="B">
     MULTILINESTRING(
-      (60 200, 60 260, 140 200),
+      (60 200, 60 260, 140 200), 
       (60 200, 60 140, 140 200))
   </op>
 </test>
@@ -207,7 +173,7 @@
 <test>
   <op name="symdifference" arg1="A" arg2="B">
     MULTILINESTRING(
-      (60 200, 60 260, 140 200),
+      (60 200, 60 260, 140 200), 
       (60 200, 60 140, 140 200))
   </op>
 </test>
@@ -222,17 +188,6 @@
     LINESTRING(100 200, 220 200, 220 80, 100 80, 100 200)
   </b>
 <test>
-  <op name="getboundary" arg1="A">
-    MULTIPOINT EMPTY
-  </op>
-</test>
-<test>
-  <op name="convexhull" arg1="A">
-    POLYGON(
-      (100 120, 20 200, 100 280, 180 200, 100 120))
-  </op>
-</test>
-<test>
   <op name="intersection" arg1="A" arg2="B">
     MULTIPOINT((100 120), (180 200))
   </op>
@@ -240,27 +195,27 @@
 <test>
   <op name="union" arg1="A" arg2="B">
     MULTILINESTRING(
-      (100 120, 180 200),
-      (100 120, 100 200),
-      (180 200, 100 280, 20 200, 100 120),
-      (180 200, 220 200, 220 80, 100 80, 100 120),
+      (100 120, 180 200), 
+      (100 120, 100 200), 
+      (180 200, 100 280, 20 200, 100 120), 
+      (180 200, 220 200, 220 80, 100 80, 100 120), 
       (100 200, 180 200))
   </op>
 </test>
 <test>
   <op name="difference" arg1="A" arg2="B">
     MULTILINESTRING(
-      (100 120, 180 200),
+      (100 120, 180 200), 
       (180 200, 100 280, 20 200, 100 120))
   </op>
 </test>
 <test>
   <op name="symdifference" arg1="A" arg2="B">
     MULTILINESTRING(
-      (100 120, 180 200),
-      (100 120, 100 200),
-      (180 200, 100 280, 20 200, 100 120),
-      (180 200, 220 200, 220 80, 100 80, 100 120),
+      (100 120, 180 200), 
+      (100 120, 100 200), 
+      (180 200, 100 280, 20 200, 100 120), 
+      (180 200, 220 200, 220 80, 100 80, 100 120), 
       (100 200, 180 200))
   </op>
 </test>
diff --git a/tests/xmltester/tests/general/TestOverlayLLPrec.xml b/tests/xmltester/tests/general/TestOverlayLLPrec.xml
new file mode 100644
index 0000000..e47e586
--- /dev/null
+++ b/tests/xmltester/tests/general/TestOverlayLLPrec.xml
@@ -0,0 +1,108 @@
+<run>
+  <precisionModel scale="1.0" offsetx="0.0" offsety="0.0"/>
+
+<case>
+  <desc>LL - narrow V</desc>
+  <a>
+    LINESTRING(0 10, 620 10, 0 11)
+  </a>
+  <b>
+    LINESTRING(400 60, 400 10)
+  </b>
+<test>
+  <op name="intersection" arg1="A" arg2="B">
+    POINT(400 10)
+  </op>
+</test>
+<test>
+  <op name="union" arg1="A" arg2="B">
+    MULTILINESTRING(
+      (0 10, 400 10), 
+      (400 10, 620 10, 400 10), 
+      (400 10, 0 11), 
+      (400 60, 400 10))
+  </op>
+</test>
+</case>
+
+<case>
+  <desc>LL - A and B intersect frequently</desc>
+  <a>
+    LINESTRING(220 240, 200 220, 60 320, 40 300, 180 200, 160 180, 20 280)
+  </a>
+  <b>
+    LINESTRING(220 240, 140 160, 120 180, 220 280, 200 300, 100 200)
+  </b>
+<test>
+  <op name="intersection" arg1="A" arg2="B">
+    GEOMETRYCOLLECTION(
+      POINT(113 213), 
+      POINT(133 233), 
+      POINT(137 197), 
+      POINT(153 253), 
+      POINT(157 217), 
+      POINT(177 237), 
+      LINESTRING(180 200, 160 180), 
+      LINESTRING(220 240, 200 220))
+  </op>
+</test>
+<test>
+  <op name="union" arg1="A" arg2="B">
+    MULTILINESTRING(
+      (113 213, 20 280), 
+      (133 233, 113 213), 
+      (113 213, 100 200), 
+      (137 197, 113 213), 
+      (153 253, 133 233), 
+      (153 253, 60 320, 40 300, 133 233), 
+      (133 233, 157 217), 
+      (137 197, 157 217), 
+      (160 180, 140 160, 120 180, 137 197), 
+      (160 180, 137 197), 
+      (177 237, 220 280, 200 300, 153 253), 
+      (177 237, 153 253), 
+      (157 217, 177 237), 
+      (157 217, 180 200), 
+      (180 200, 160 180), 
+      (200 220, 177 237), 
+      (200 220, 180 200), 
+      (220 240, 200 220))
+  </op>
+</test>
+<test>
+  <op name="difference" arg1="A" arg2="B">
+    MULTILINESTRING(
+      (200 220, 177 237), 
+      (177 237, 153 253), 
+      (153 253, 60 320, 40 300, 133 233), 
+      (133 233, 157 217), 
+      (157 217, 180 200), 
+      (160 180, 137 197), 
+      (137 197, 113 213), 
+      (113 213, 20 280))
+  </op>
+</test>
+<test>
+  <op name="symdifference" arg1="A" arg2="B">
+    MULTILINESTRING(
+      (200 220, 177 237), 
+      (177 237, 153 253), 
+      (153 253, 60 320, 40 300, 133 233), 
+      (133 233, 157 217), 
+      (157 217, 180 200), 
+      (160 180, 137 197), 
+      (137 197, 113 213), 
+      (113 213, 20 280), 
+      (200 220, 180 200), 
+      (160 180, 140 160, 120 180, 137 197), 
+      (137 197, 157 217), 
+      (157 217, 177 237), 
+      (177 237, 220 280, 200 300, 153 253), 
+      (153 253, 133 233), 
+      (133 233, 113 213), 
+      (113 213, 100 200))
+  </op>
+</test>
+</case>
+
+</run>
diff --git a/tests/xmltester/tests/general/TestFunctionPA.xml b/tests/xmltester/tests/general/TestOverlayPA.xml
similarity index 55%
rename from tests/xmltester/tests/general/TestFunctionPA.xml
rename to tests/xmltester/tests/general/TestOverlayPA.xml
index 57ce6f7..c9eb856 100644
--- a/tests/xmltester/tests/general/TestFunctionPA.xml
+++ b/tests/xmltester/tests/general/TestOverlayPA.xml
@@ -21,7 +21,7 @@
   <a>
     MULTIPOLYGON(
       (
-        (120 320, 180 200, 240 320, 120 320)),
+        (120 320, 180 200, 240 320, 120 320)), 
       (
         (180 200, 240 80, 300 200, 180 200)))
   </a>
@@ -29,19 +29,6 @@
     MULTIPOINT((120 320), (180 260), (180 320), (180 200), (300 200), (200 220))
   </b>
 <test>
-  <op name="getboundary" arg1="A">
-    MULTILINESTRING(
-      (120 320, 180 200, 240 320, 120 320),
-      (180 200, 240 80, 300 200, 180 200))
-  </op>
-</test>
-<test>
-  <op name="convexhull" arg1="A">
-    POLYGON(
-      (240 80, 120 320, 240 320, 300 200, 240 80))
-  </op>
-</test>
-<test>
   <op name="intersection" arg1="A" arg2="B">
     MULTIPOINT((120 320), (180 200), (180 260), (180 320), (300 200))
   </op>
@@ -49,9 +36,9 @@
 <test>
   <op name="union" arg1="A" arg2="B">
     GEOMETRYCOLLECTION(
-      POINT(200 220),
+      POINT(200 220), 
       POLYGON(
-        (180 200, 120 320, 240 320, 180 200)),
+        (180 200, 120 320, 240 320, 180 200)), 
       POLYGON(
         (180 200, 300 200, 240 80, 180 200)))
   </op>
@@ -60,7 +47,7 @@
   <op name="difference" arg1="A" arg2="B">
     MULTIPOLYGON(
       (
-        (180 200, 120 320, 240 320, 180 200)),
+        (180 200, 120 320, 240 320, 180 200)), 
       (
         (180 200, 300 200, 240 80, 180 200)))
   </op>
@@ -68,9 +55,9 @@
 <test>
   <op name="symdifference" arg1="A" arg2="B">
     GEOMETRYCOLLECTION(
-      POINT(200 220),
+      POINT(200 220), 
       POLYGON(
-        (180 200, 120 320, 240 320, 180 200)),
+        (180 200, 120 320, 240 320, 180 200)), 
       POLYGON(
         (180 200, 300 200, 240 80, 180 200)))
   </op>
@@ -82,32 +69,17 @@
   <a>
     MULTIPOLYGON(
       (
-        (120 80, 420 80, 420 340, 120 340, 120 80),
-        (160 300, 160 120, 380 120, 380 300, 160 300)),
+        (120 80, 420 80, 420 340, 120 340, 120 80), 
+        (160 300, 160 120, 380 120, 380 300, 160 300)), 
       (
-        (200 260, 200 160, 340 160, 340 260, 200 260),
+        (200 260, 200 160, 340 160, 340 260, 200 260), 
         (240 220, 240 200, 300 200, 300 220, 240 220)))
   </a>
   <b>
-    MULTIPOINT((200 360), (420 340), (400 100), (340 120), (200 140), (200 160), (220 180), (260 200), (200 360),
+    MULTIPOINT((200 360), (420 340), (400 100), (340 120), (200 140), (200 160), (220 180), (260 200), (200 360), 
     (420 340), (400 100), (340 120), (200 140), (200 160), (220 180), (260 200))
   </b>
 <test>
-  <op name="getboundary" arg1="A">
-    MULTILINESTRING(
-      (120 80, 420 80, 420 340, 120 340, 120 80),
-      (160 300, 160 120, 380 120, 380 300, 160 300),
-      (200 260, 200 160, 340 160, 340 260, 200 260),
-      (240 220, 240 200, 300 200, 300 220, 240 220))
-  </op>
-</test>
-<test>
-  <op name="convexhull" arg1="A">
-    POLYGON(
-      (120 80, 120 340, 420 340, 420 80, 120 80))
-  </op>
-</test>
-<test>
   <op name="intersection" arg1="A" arg2="B">
     MULTIPOINT((200 160), (220 180), (260 200), (340 120), (400 100), (420 340))
   </op>
@@ -115,13 +87,13 @@
 <test>
   <op name="union" arg1="A" arg2="B">
     GEOMETRYCOLLECTION(
-      POINT(200 140),
-      POINT(200 360),
+      POINT(200 140), 
+      POINT(200 360), 
       POLYGON(
-        (120 80, 120 340, 420 340, 420 80, 120 80),
-        (160 300, 160 120, 380 120, 380 300, 160 300)),
+        (120 80, 120 340, 420 340, 420 80, 120 80), 
+        (160 300, 160 120, 380 120, 380 300, 160 300)), 
       POLYGON(
-        (200 260, 340 260, 340 160, 200 160, 200 260),
+        (200 260, 340 260, 340 160, 200 160, 200 260), 
         (240 220, 240 200, 300 200, 300 220, 240 220)))
   </op>
 </test>
@@ -129,23 +101,23 @@
   <op name="difference" arg1="A" arg2="B">
     MULTIPOLYGON(
       (
-        (120 80, 120 340, 420 340, 420 80, 120 80),
-        (160 300, 160 120, 380 120, 380 300, 160 300)),
+        (120 80, 120 340, 420 340, 420 80, 120 80), 
+        (160 300, 160 120, 380 120, 380 300, 160 300)), 
       (
-        (200 260, 340 260, 340 160, 200 160, 200 260),
+        (200 260, 340 260, 340 160, 200 160, 200 260), 
         (240 220, 240 200, 300 200, 300 220, 240 220)))
   </op>
 </test>
 <test>
   <op name="symdifference" arg1="A" arg2="B">
     GEOMETRYCOLLECTION(
-      POINT(200 140),
-      POINT(200 360),
+      POINT(200 140), 
+      POINT(200 360), 
       POLYGON(
-        (120 80, 120 340, 420 340, 420 80, 120 80),
-        (160 300, 160 120, 380 120, 380 300, 160 300)),
+        (120 80, 120 340, 420 340, 420 80, 120 80), 
+        (160 300, 160 120, 380 120, 380 300, 160 300)), 
       POLYGON(
-        (200 260, 340 260, 340 160, 200 160, 200 260),
+        (200 260, 340 260, 340 160, 200 160, 200 260), 
         (240 220, 240 200, 300 200, 300 220, 240 220)))
   </op>
 </test>
diff --git a/tests/xmltester/tests/general/TestFunctionPL.xml b/tests/xmltester/tests/general/TestOverlayPL.xml
similarity index 60%
rename from tests/xmltester/tests/general/TestFunctionPL.xml
rename to tests/xmltester/tests/general/TestOverlayPL.xml
index bc9c855..ba072db 100644
--- a/tests/xmltester/tests/general/TestFunctionPL.xml
+++ b/tests/xmltester/tests/general/TestOverlayPL.xml
@@ -16,7 +16,7 @@
 <test>
   <op name="union" arg1="A" arg2="B">
     GEOMETRYCOLLECTION(
-      POINT(40 90),
+      POINT(40 90), 
       LINESTRING(20 20, 100 100))
   </op>
 </test>
@@ -28,7 +28,7 @@
 <test>
   <op name="symdifference" arg1="A" arg2="B">
     GEOMETRYCOLLECTION(
-      POINT(40 90),
+      POINT(40 90), 
       LINESTRING(20 20, 100 100))
   </op>
 </test>
@@ -50,8 +50,8 @@
 <test>
   <op name="union" arg1="A" arg2="B">
     GEOMETRYCOLLECTION(
-      POINT(40 90),
-      LINESTRING(20 20, 70 70),
+      POINT(40 90), 
+      LINESTRING(20 20, 70 70), 
       LINESTRING(70 70, 110 110, 170 50, 130 10, 70 70))
   </op>
 </test>
@@ -63,8 +63,8 @@
 <test>
   <op name="symdifference" arg1="A" arg2="B">
     GEOMETRYCOLLECTION(
-      POINT(40 90),
-      LINESTRING(20 20, 70 70),
+      POINT(40 90), 
+      LINESTRING(20 20, 70 70), 
       LINESTRING(70 70, 110 110, 170 50, 130 10, 70 70))
   </op>
 </test>
@@ -74,30 +74,19 @@
   <desc>mPmL - points in I, B and E of lines, lines overlap, points overlap</desc>
   <a>
     MULTILINESTRING(
-      (100 320, 100 220),
-      (100 180, 200 180),
-      (220 180, 220 320),
-      (220 320, 160 320),
-      (100 320, 100 220),
-      (100 180, 200 180),
-      (220 180, 220 320),
-      (220 320, 160 320),
+      (100 320, 100 220), 
+      (100 180, 200 180), 
+      (220 180, 220 320), 
+      (220 320, 160 320), 
+      (100 320, 100 220), 
+      (100 180, 200 180), 
+      (220 180, 220 320), 
+      (220 320, 160 320), 
       (100 220, 100 320))
   </a>
   <b>
     MULTIPOINT ((100 320), (100 260), (100 220), (100 200), (100 180), (120 180), (200 180), (220 180), (220 260), (220 320), (200 320), (160 320), (140 320), (120 320), (100 320), (100 260), (100 220), (100 200), (100 180), (120 180), (200 180), (220 180), (220 260), (220 320), (200 320), (160 320), (140 320), (120 320))  </b>
 <test>
-  <op name="getboundary" arg1="A">
-    MULTIPOINT((100 220), (100 320))
-  </op>
-</test>
-<test>
-  <op name="convexhull" arg1="A">
-    POLYGON(
-      (100 180, 100 320, 220 320, 220 180, 100 180))
-  </op>
-</test>
-<test>
   <op name="intersection" arg1="A" arg2="B">
     MULTIPOINT ((100 180), (100 220), (100 260), (100 320), (120 180), (160 320), (200 180), (200 320), (220 180), (220 260), (220 320))
   </op>
@@ -105,33 +94,33 @@
 <test>
   <op name="union" arg1="A" arg2="B">
     GEOMETRYCOLLECTION(
-      POINT(100 200),
-      POINT(120 320),
-      POINT(140 320),
-      LINESTRING(100 320, 100 220),
-      LINESTRING(100 180, 200 180),
-      LINESTRING(220 180, 220 320),
+      POINT(100 200), 
+      POINT(120 320), 
+      POINT(140 320), 
+      LINESTRING(100 320, 100 220), 
+      LINESTRING(100 180, 200 180), 
+      LINESTRING(220 180, 220 320), 
       LINESTRING(220 320, 160 320))
   </op>
 </test>
 <test>
   <op name="difference" arg1="A" arg2="B">
     MULTILINESTRING(
-      (100 320, 100 220),
-      (100 180, 200 180),
-      (220 180, 220 320),
+      (100 320, 100 220), 
+      (100 180, 200 180), 
+      (220 180, 220 320), 
       (220 320, 160 320))
   </op>
 </test>
 <test>
   <op name="symdifference" arg1="A" arg2="B">
     GEOMETRYCOLLECTION(
-      POINT(100 200),
-      POINT(120 320),
-      POINT(140 320),
-      LINESTRING(100 320, 100 220),
-      LINESTRING(100 180, 200 180),
-      LINESTRING(220 180, 220 320),
+      POINT(100 200), 
+      POINT(120 320), 
+      POINT(140 320), 
+      LINESTRING(100 320, 100 220), 
+      LINESTRING(100 180, 200 180), 
+      LINESTRING(220 180, 220 320), 
       LINESTRING(220 320, 160 320))
   </op>
 </test>
@@ -141,24 +130,13 @@
   <desc>mPmL - points in I, B and E of lines, lines overlap, points overlap, x <0, y < 0</desc>
   <a>
     MULTILINESTRING(
-      (-500 -140, -500 -280, -320 -280, -320 -140, -500 -140, -500 -340),
+      (-500 -140, -500 -280, -320 -280, -320 -140, -500 -140, -500 -340), 
       (-500 -140, -320 -140, -500 -140, -320 -140, -500 -140))
   </a>
   <b>
     MULTIPOINT ((-560 -180), (-420 -180), (-500 -220), (-500 -340), (-500 -280), (-500 -140), (-320 -140), (-420 -140), (-320 -180), (-280 -140), (-320 -120), (-560 -180), (-420 -180), (-500 -220), (-500 -340), (-500 -280), (-500 -140), (-320 -140), (-420 -140), (-320 -180), (-280 -140), (-320 -120))
   </b>
 <test>
-  <op name="getboundary" arg1="A">
-    MULTIPOINT((-500 -340), (-500 -140))
-  </op>
-</test>
-<test>
-  <op name="convexhull" arg1="A">
-    POLYGON(
-      (-500 -340, -500 -140, -320 -140, -320 -280, -500 -340))
-  </op>
-</test>
-<test>
   <op name="intersection" arg1="A" arg2="B">
     MULTIPOINT((-500 -340), (-500 -280), (-500 -220), (-500 -140), (-420 -140), (-320 -180), (-320 -140))
   </op>
@@ -166,83 +144,58 @@
 <test>
   <op name="union" arg1="A" arg2="B">
     GEOMETRYCOLLECTION(
-      POINT(-560 -180),
-      POINT(-420 -180),
-      POINT(-320 -120),
-      POINT(-280 -140),
-      LINESTRING(-500 -140, -500 -280),
-      LINESTRING(-500 -280, -320 -280, -320 -140),
-      LINESTRING(-320 -140, -500 -140),
+      POINT(-560 -180), 
+      POINT(-420 -180), 
+      POINT(-320 -120), 
+      POINT(-280 -140), 
+      LINESTRING(-500 -140, -500 -280), 
+      LINESTRING(-500 -280, -320 -280, -320 -140), 
+      LINESTRING(-320 -140, -500 -140), 
       LINESTRING(-500 -280, -500 -340))
   </op>
 </test>
 <test>
   <op name="difference" arg1="A" arg2="B">
     MULTILINESTRING(
-      (-500 -140, -500 -280),
-      (-500 -280, -320 -280, -320 -140),
-      (-320 -140, -500 -140),
+      (-500 -140, -500 -280), 
+      (-500 -280, -320 -280, -320 -140), 
+      (-320 -140, -500 -140), 
       (-500 -280, -500 -340))
   </op>
 </test>
 <test>
   <op name="symdifference" arg1="A" arg2="B">
     GEOMETRYCOLLECTION(
-      POINT(-560 -180),
-      POINT(-420 -180),
-      POINT(-320 -120),
-      POINT(-280 -140),
-      LINESTRING(-500 -140, -500 -280),
-      LINESTRING(-500 -280, -320 -280, -320 -140),
-      LINESTRING(-320 -140, -500 -140),
+      POINT(-560 -180), 
+      POINT(-420 -180), 
+      POINT(-320 -120), 
+      POINT(-280 -140), 
+      LINESTRING(-500 -140, -500 -280), 
+      LINESTRING(-500 -280, -320 -280, -320 -140), 
+      LINESTRING(-320 -140, -500 -140), 
       LINESTRING(-500 -280, -500 -340))
   </op>
 </test>
 </case>
 
 <case>
-  <desc>mL - lines intersect at 1 point</desc>
-  <a>
-    MULTILINESTRING(
-      (180 100, 140 280, 240 140, 220 120, 140 280),
-      (140 280, 100 400, 80 380, 140 280, 40 380, 20 360, 140 280))
-  </a>
-<test>
-  <op name="getboundary" arg1="A">
-    MULTIPOINT((180 100), (140 280))
-  </op>
-</test>
-</case>
-
-<case>
   <desc>mPmL - points in I, B and E of lines, lines overlap, points overlap</desc>
   <a>
     MULTILINESTRING(
-      (100 320, 100 220),
-      (100 180, 200 180),
-      (220 180, 220 320),
-      (220 320, 160 320),
-      (100 320, 100 220),
-      (100 180, 200 180),
-      (220 180, 220 320),
-      (220 320, 160 320),
+      (100 320, 100 220), 
+      (100 180, 200 180), 
+      (220 180, 220 320), 
+      (220 320, 160 320), 
+      (100 320, 100 220), 
+      (100 180, 200 180), 
+      (220 180, 220 320), 
+      (220 320, 160 320), 
       (100 220, 100 320))
   </a>
   <b>
     MULTIPOINT ((100 320), (100 260), (100 220), (100 200), (100 180), (120 180), (200 180), (220 180), (220 260), (220 320), (200 320), (160 320), (140 320), (120 320), (100 320), (100 260), (100 220), (100 200), (100 180), (120 180), (200 180), (220 180), (220 260), (220 320), (200 320), (160 320), (140 320), (120 320))
   </b>
 <test>
-  <op name="getboundary" arg1="A">
-    MULTIPOINT((100 220), (100 320))
-  </op>
-</test>
-<test>
-  <op name="convexhull" arg1="A">
-    POLYGON(
-      (100 180, 100 320, 220 320, 220 180, 100 180))
-  </op>
-</test>
-<test>
   <op name="intersection" arg1="A" arg2="B">
     MULTIPOINT ((100 180), (100 220), (100 260), (100 320), (120 180), (160 320), (200 180), (200 320), (220 180), (220 260), (220 320))
   </op>
@@ -250,33 +203,33 @@
 <test>
   <op name="union" arg1="A" arg2="B">
     GEOMETRYCOLLECTION(
-      POINT(100 200),
-      POINT(120 320),
-      POINT(140 320),
-      LINESTRING(100 320, 100 220),
-      LINESTRING(100 180, 200 180),
-      LINESTRING(220 180, 220 320),
+      POINT(100 200), 
+      POINT(120 320), 
+      POINT(140 320), 
+      LINESTRING(100 320, 100 220), 
+      LINESTRING(100 180, 200 180), 
+      LINESTRING(220 180, 220 320), 
       LINESTRING(220 320, 160 320))
   </op>
 </test>
 <test>
   <op name="difference" arg1="A" arg2="B">
     MULTILINESTRING(
-      (100 320, 100 220),
-      (100 180, 200 180),
-      (220 180, 220 320),
+      (100 320, 100 220), 
+      (100 180, 200 180), 
+      (220 180, 220 320), 
       (220 320, 160 320))
   </op>
 </test>
 <test>
   <op name="symdifference" arg1="A" arg2="B">
     GEOMETRYCOLLECTION(
-      POINT(100 200),
-      POINT(120 320),
-      POINT(140 320),
-      LINESTRING(100 320, 100 220),
-      LINESTRING(100 180, 200 180),
-      LINESTRING(220 180, 220 320),
+      POINT(100 200), 
+      POINT(120 320), 
+      POINT(140 320), 
+      LINESTRING(100 320, 100 220), 
+      LINESTRING(100 180, 200 180), 
+      LINESTRING(220 180, 220 320), 
       LINESTRING(220 320, 160 320))
   </op>
 </test>
diff --git a/tests/xmltester/tests/general/TestFunctionPLPrec.xml b/tests/xmltester/tests/general/TestOverlayPLPrec.xml
similarity index 100%
rename from tests/xmltester/tests/general/TestFunctionPLPrec.xml
rename to tests/xmltester/tests/general/TestOverlayPLPrec.xml
diff --git a/tests/xmltester/tests/general/TestFunctionPP.xml b/tests/xmltester/tests/general/TestOverlayPP.xml
similarity index 85%
rename from tests/xmltester/tests/general/TestFunctionPP.xml
rename to tests/xmltester/tests/general/TestOverlayPP.xml
index 9f60060..2e1ea0c 100644
--- a/tests/xmltester/tests/general/TestFunctionPP.xml
+++ b/tests/xmltester/tests/general/TestOverlayPP.xml
@@ -114,16 +114,6 @@
     POINT(80 200)
   </b>
 <test>
-  <op name="getboundary" arg1="A">
-    GEOMETRYCOLLECTION EMPTY
-  </op>
-</test>
-<test>
-  <op name="convexhull" arg1="A">
-    POINT(80 200)
-  </op>
-</test>
-<test>
   <op name="intersection" arg1="A" arg2="B">
     POINT(80 200)
   </op>
@@ -154,16 +144,6 @@
     POINT(260 80)
   </b>
 <test>
-  <op name="getboundary" arg1="A">
-    GEOMETRYCOLLECTION EMPTY
-  </op>
-</test>
-<test>
-  <op name="convexhull" arg1="A">
-    POINT(80 200)
-  </op>
-</test>
-<test>
   <op name="intersection" arg1="A" arg2="B">
     POINT EMPTY
   </op>
@@ -194,16 +174,6 @@
     POINT(120 260)
   </b>
 <test>
-  <op name="getboundary" arg1="A">
-    GEOMETRYCOLLECTION EMPTY
-  </op>
-</test>
-<test>
-  <op name="convexhull" arg1="A">
-    POINT(60 260)
-  </op>
-</test>
-<test>
   <op name="intersection" arg1="A" arg2="B">
     POINT EMPTY
   </op>
@@ -234,16 +204,6 @@
     POINT(80 280)
   </b>
 <test>
-  <op name="getboundary" arg1="A">
-    GEOMETRYCOLLECTION EMPTY
-  </op>
-</test>
-<test>
-  <op name="convexhull" arg1="A">
-    POINT(80 80)
-  </op>
-</test>
-<test>
   <op name="intersection" arg1="A" arg2="B">
     POINT EMPTY
   </op>

-----------------------------------------------------------------------

Summary of changes:
 include/geos/operation/overlay/OverlayOp.h         |   34 +-
 src/geom/Geometry.cpp                              |   32 +-
 tests/unit/capi/GEOSIntersectionTest.cpp           |    2 +-
 tests/xmltester/Makefile.am                        |   21 +-
 tests/xmltester/tests/general/TestFunctionLA.xml   |  384 --------
 .../xmltester/tests/general/TestFunctionLLPrec.xml |  120 ---
 .../{TestFunctionAA.xml => TestOverlayAA.xml}      |  279 +++---
 ...estFunctionAAPrec.xml => TestOverlayAAPrec.xml} |  299 ++----
 tests/xmltester/tests/general/TestOverlayEmpty.xml | 1021 ++++++++++++++++++++
 tests/xmltester/tests/general/TestOverlayLA.xml    |  329 +++++++
 ...estFunctionLAPrec.xml => TestOverlayLAPrec.xml} |   81 +-
 .../{TestFunctionLL.xml => TestOverlayLL.xml}      |   99 +-
 .../xmltester/tests/general/TestOverlayLLPrec.xml  |  108 +++
 .../{TestFunctionPA.xml => TestOverlayPA.xml}      |   74 +-
 .../{TestFunctionPL.xml => TestOverlayPL.xml}      |  187 ++--
 ...estFunctionPLPrec.xml => TestOverlayPLPrec.xml} |    0
 .../{TestFunctionPP.xml => TestOverlayPP.xml}      |   40 -
 17 files changed, 1882 insertions(+), 1228 deletions(-)
 delete mode 100644 tests/xmltester/tests/general/TestFunctionLA.xml
 delete mode 100644 tests/xmltester/tests/general/TestFunctionLLPrec.xml
 rename tests/xmltester/tests/general/{TestFunctionAA.xml => TestOverlayAA.xml} (65%)
 rename tests/xmltester/tests/general/{TestFunctionAAPrec.xml => TestOverlayAAPrec.xml} (74%)
 create mode 100644 tests/xmltester/tests/general/TestOverlayEmpty.xml
 create mode 100644 tests/xmltester/tests/general/TestOverlayLA.xml
 rename tests/xmltester/tests/general/{TestFunctionLAPrec.xml => TestOverlayLAPrec.xml} (69%)
 rename tests/xmltester/tests/general/{TestFunctionLL.xml => TestOverlayLL.xml} (70%)
 create mode 100644 tests/xmltester/tests/general/TestOverlayLLPrec.xml
 rename tests/xmltester/tests/general/{TestFunctionPA.xml => TestOverlayPA.xml} (55%)
 rename tests/xmltester/tests/general/{TestFunctionPL.xml => TestOverlayPL.xml} (60%)
 rename tests/xmltester/tests/general/{TestFunctionPLPrec.xml => TestOverlayPLPrec.xml} (100%)
 rename tests/xmltester/tests/general/{TestFunctionPP.xml => TestOverlayPP.xml} (85%)


hooks/post-receive
-- 
GEOS


More information about the geos-commits mailing list