/**
   * Round Trip test for a single MultiPolygon with lotsa points
   *
   * @throws SQLException
   */
  public void testSingleMultiPolygonManyPointsManyHolesRoundTrip() throws SQLException {

    PolygonGenerator pgc = new PolygonGenerator();
    pgc.setGeometryFactory(geometryFactory);
    pgc.setGenerationAlgorithm(PolygonGenerator.BOX);
    pgc.setNumberPoints(100);
    pgc.setNumberHoles(100);
    MultiGenerator pg = new MultiGenerator(pgc);
    pg.setBoundingBox(new Envelope(0, 10, 0, 10));
    pg.setNumberGeometries(3);
    pg.setGeometryFactory(geometryFactory);

    MultiPolygon pt = (MultiPolygon) pg.create();
    //		System.out.println((pt==null?"NULL":pt.toString()));

    OraWriter ow = new OraWriter();
    STRUCT st = ow.write(pt, getConnection());

    OraReader or = new OraReader();
    MultiPolygon pt2 = (MultiPolygon) or.read(st);

    //		System.out.println((pt==null?"NULL":pt.toString()));
    //		System.out.println((pt2==null?"NULL":pt2.toString()));
    assertTrue("The input MultiPolygon is not the same as the output MultiPolygon", pt.equals(pt2));
  }
  /**
   * Round Trip test for a 8 overlapping line MultiPolygons (4 distinct MultiPolygons)
   *
   * @throws SQLException
   */
  public void testOverlappingMultiPolygonsHolesRoundTrip() throws SQLException {
    GridGenerator grid = new GridGenerator();
    grid.setGeometryFactory(geometryFactory);
    grid.setBoundingBox(new Envelope(0, 10, 0, 10));
    grid.setNumberColumns(2);
    grid.setNumberRows(2);

    MultiPolygon[] pt = new MultiPolygon[4];
    STRUCT[] st = new STRUCT[8];

    PolygonGenerator pgc = new PolygonGenerator();
    pgc.setGeometryFactory(geometryFactory);
    pgc.setGenerationAlgorithm(PolygonGenerator.BOX);
    pgc.setNumberPoints(10);
    pgc.setNumberHoles(4);
    MultiGenerator pg = new MultiGenerator(pgc);
    pg.setBoundingBox(new Envelope(0, 10, 0, 10));
    pg.setNumberGeometries(3);
    pg.setGeometryFactory(geometryFactory);

    OraWriter ow = new OraWriter();

    int i = 0;
    while (grid.canCreate() && i < 8) {
      pg.setBoundingBox(grid.createEnv());
      pt[i] = (MultiPolygon) pg.create();
      st[i] = ow.write(pt[i], getConnection());
      i++;
    }
    for (int j = 0; j < 4; j++) {
      if (pt[j] != null) st[i++] = ow.write(pt[j], getConnection());
    }

    OraReader or = new OraReader();
    i = 0;
    while (i < 8 && pt[i % 4] != null) {
      MultiPolygon pt2 = (MultiPolygon) or.read(st[i]);
      //			System.out.println((pt==null?"NULL":pt[i%4].toString()));
      //			System.out.println((pt2==null?"NULL":pt2.toString()));
      assertTrue(
          "The input MultiPolygon is not the same as the output MultiPolygon",
          pt[i % 4].equals(pt2));
      i++;
    }
  }
  /**
   * Round Trip test for a 100 non overlapping MultiPolygon
   *
   * @throws SQLException
   */
  public void testGridMultiPolygonsNoHoleRoundTrip() throws SQLException {
    GridGenerator grid = new GridGenerator();
    grid.setGeometryFactory(geometryFactory);
    grid.setBoundingBox(new Envelope(0, 10, 0, 10));
    grid.setNumberColumns(10);
    grid.setNumberRows(10);

    MultiPolygon[] pt = new MultiPolygon[100];
    STRUCT[] st = new STRUCT[100];

    PolygonGenerator pgc = new PolygonGenerator();
    pgc.setGeometryFactory(geometryFactory);
    pgc.setNumberPoints(10);
    MultiGenerator pg = new MultiGenerator(pgc);
    pg.setBoundingBox(new Envelope(0, 10, 0, 10));
    pg.setNumberGeometries(3);
    pg.setGeometryFactory(geometryFactory);

    OraWriter ow = new OraWriter();

    int i = 0;
    while (grid.canCreate() && i < 100) {
      pg.setBoundingBox(grid.createEnv());
      pt[i] = (MultiPolygon) pg.create();
      st[i] = ow.write(pt[i], getConnection());
      i++;
    }

    OraReader or = new OraReader();
    i = 0;
    while (i < 100 && pt[i] != null) {
      MultiPolygon pt2 = (MultiPolygon) or.read(st[i]);
      //			System.out.println((pt[i]==null?"NULL":pt[i].toString()));
      //			System.out.println((pt2==null?"NULL":pt2.toString()));
      assertTrue(
          "The input MultiPolygon is not the same as the output MultiPolygon", pt[i].equals(pt2));
      i++;
    }
  }