<run>
  <precisionModel scale="1.0" offsetx="0.0" offsety="0.0"/>

<case>
  <desc>P - point</desc>
  <a>
    POINT(10 10)
  </a>
<test>
  <op name="getboundary" arg1="A">
    GEOMETRYCOLLECTION EMPTY
  </op>
</test>
</case>

<case>
  <desc>mP - MultiPoint</desc>
  <a>
    MULTIPOINT((10 10), (20 20))
  </a>
<test>
  <op name="getboundary" arg1="A">
    GEOMETRYCOLLECTION EMPTY
  </op>
</test>
</case>

<case>
  <desc>L - Line</desc>
  <a>
    LINESTRING(10 10, 20 20)
  </a>
<test>
  <op name="getboundary" arg1="A">
    MULTIPOINT((10 10), (20 20))
  </op>
</test>
</case>

<case>
  <desc>L - closed</desc>
  <a>
    LINESTRING(10 10, 20 20, 20 10, 10 10)
  </a>
<test>
  <op name="getboundary" arg1="A">
    MULTIPOINT EMPTY
  </op>
</test>
</case>

<case>
  <desc>L - self-intersecting with boundary</desc>
  <a>
    LINESTRING(40 40, 100 100, 180 100, 180 180, 100 180, 100 100)
  </a>
<test>
  <op name="getboundary" arg1="A">
    MULTIPOINT((40 40), (100 100))
  </op>
</test>
</case>

<case>
  <desc>mL - 2 lines with common endpoint</desc>
  <a>
    MULTILINESTRING(
      (10 10, 20 20), 
      (20 20, 30 30))
  </a>
<test>
  <op name="getboundary" arg1="A">
    MULTIPOINT((10 10), (30 30))
  </op>
</test>
</case>

<case>
  <desc>mL - 3 lines with common endpoint</desc>
  <a>
    MULTILINESTRING(
      (10 10, 20 20), 
      (20 20, 30 20), 
      (20 20, 30 30))
  </a>
<test>
  <op name="getboundary" arg1="A">
    MULTIPOINT((10 10), (20 20), (30 20), (30 30))
  </op>
</test>
</case>

<case>
  <desc>mL - 4 lines with common endpoint</desc>
  <a>
    MULTILINESTRING(
      (10 10, 20 20), 
      (20 20, 30 20), 
      (20 20, 30 30), 
      (20 20, 30 40))
  </a>
<test>
  <op name="getboundary" arg1="A">
    MULTIPOINT((10 10), (30 20), (30 30), (30 40))
  </op>
</test>
</case>

<case>
  <desc>mL - 2 lines, one closed, with common endpoint</desc>
  <a>
    MULTILINESTRING(
      (10 10, 20 20), 
      (20 20, 20 30, 30 30, 30 20, 20 20))
  </a>
<test>
  <op name="getboundary" arg1="A">
    MULTIPOINT((10 10), (20 20))
  </op>
</test>
</case>

<case>
  <desc>L - 1 line, self-intersecting, topologically equal to prev case</desc>
  <a>
    MULTILINESTRING(
      (10 10, 20 20, 20 30, 30 30, 30 20, 20 20))
  </a>
<test>
  <op name="getboundary" arg1="A">
    MULTIPOINT((10 10), (20 20))
  </op>
</test>
</case>

<case>
  <desc>A - polygon with no holes</desc>
  <a>
    POLYGON(
      (40 60, 420 60, 420 320, 40 320, 40 60))
  </a>
<test>
  <op name="getboundary" arg1="A">
    LINESTRING(40 60, 420 60, 420 320, 40 320, 40 60)
  </op>
</test>
</case>

<case>
  <desc>A - polygon with 1 hole</desc>
  <a>
    POLYGON(
      (40 60, 420 60, 420 320, 40 320, 40 60), 
      (200 140, 160 220, 260 200, 200 140))
  </a>
<test>
  <op name="getboundary" arg1="A">
    MULTILINESTRING(
      (40 60, 420 60, 420 320, 40 320, 40 60), 
      (200 140, 160 220, 260 200, 200 140))
  </op>
</test>
</case>

</run>
