@Test
  public void testWithGeometryCollection()
      throws CatalogTransformerException, IOException, ParseException {

    Date now = new Date();

    MetacardImpl metacard = new MetacardImpl();

    metacard.setLocation("GEOMETRYCOLLECTION(POINT(4 6),LINESTRING(4 6,7 10))");

    setupBasicMetacard(now, metacard);

    GeoJsonMetacardTransformer transformer = new GeoJsonMetacardTransformer();

    BinaryContent content = transformer.transform(metacard, null);

    assertEquals(
        content.getMimeTypeValue(), GeoJsonMetacardTransformer.DEFAULT_MIME_TYPE.getBaseType());

    String jsonText = new String(content.getByteArray());
    LOGGER.debug(jsonText);
    Object object = PARSER.parse(jsonText);

    JSONObject obj2 = (JSONObject) object;

    Map geometryMap = (Map) obj2.get("geometry");
    assertThat(geometryMap.get(CompositeGeometry.TYPE_KEY).toString(), is(GeometryCollection.TYPE));

    assertThat(geometryMap.get(CompositeGeometry.GEOMETRIES_KEY), notNullValue());

    verifyBasicMetacardJson(now, obj2);
  }
  /**
   * Tests that proper JSON output is received when no {@link Metacard#GEOGRAPHY} is found.
   *
   * @throws CatalogTransformerException
   * @throws IOException
   * @throws ParseException
   */
  @Test
  public void testNoGeo() throws CatalogTransformerException, IOException, ParseException {

    Date now = new Date();

    MetacardImpl metacard = new MetacardImpl();

    setupBasicMetacard(now, metacard);

    GeoJsonMetacardTransformer transformer = new GeoJsonMetacardTransformer();

    BinaryContent content = transformer.transform(metacard, null);

    assertEquals(
        content.getMimeTypeValue(), GeoJsonMetacardTransformer.DEFAULT_MIME_TYPE.getBaseType());

    String jsonText = new String(content.getByteArray());
    LOGGER.debug(jsonText);
    Object object = PARSER.parse(jsonText);

    JSONObject obj2 = (JSONObject) object;

    assertThat(obj2.get("geometry"), nullValue());
    verifyBasicMetacardJson(now, obj2);
  }
  /**
   * Tests that a POINT Geography can be returned in JSON
   *
   * @throws CatalogTransformerException
   * @throws IOException
   * @throws ParseException
   */
  @Test
  public void testwithPointGeo() throws CatalogTransformerException, IOException, ParseException {

    Date now = new Date();

    MetacardImpl metacard = new MetacardImpl();

    metacard.setLocation(DEFAULT_LOCATION);
    setupBasicMetacard(now, metacard);

    GeoJsonMetacardTransformer transformer = new GeoJsonMetacardTransformer();

    BinaryContent content = transformer.transform(metacard, null);

    assertEquals(
        content.getMimeTypeValue(), GeoJsonMetacardTransformer.DEFAULT_MIME_TYPE.getBaseType());

    String jsonText = new String(content.getByteArray());
    LOGGER.debug(jsonText);
    Object object = PARSER.parse(jsonText);

    JSONObject obj2 = (JSONObject) object;

    Map geometryMap = (Map) obj2.get("geometry");
    assertThat(geometryMap.get(CompositeGeometry.TYPE_KEY).toString(), is(Point.TYPE));
    List<Double> coords = (List<Double>) geometryMap.get(CompositeGeometry.COORDINATES_KEY);
    assertThat(coords.size(), is(2));
    assertThat(coords.get(0), equalTo(1.0));
    assertThat(coords.get(1), equalTo(0.0));

    verifyBasicMetacardJson(now, obj2);
  }
  @Test
  public void testwithPolygonGeoWithHole()
      throws CatalogTransformerException, IOException, ParseException {

    Date now = new Date();

    MetacardImpl metacard = new MetacardImpl();

    metacard.setLocation(
        "POLYGON ((30 10, 10 20, 20 40, 40 40, 30 10),(20 30, 35 35, 30 20, 20 30))");

    setupBasicMetacard(now, metacard);

    GeoJsonMetacardTransformer transformer = new GeoJsonMetacardTransformer();

    BinaryContent content = transformer.transform(metacard, null);

    assertEquals(
        content.getMimeTypeValue(), GeoJsonMetacardTransformer.DEFAULT_MIME_TYPE.getBaseType());

    String jsonText = new String(content.getByteArray());
    LOGGER.debug(jsonText);
    Object object = PARSER.parse(jsonText);

    JSONObject obj2 = (JSONObject) object;

    Map geometryMap = (Map) obj2.get("geometry");
    assertThat(geometryMap.get(CompositeGeometry.TYPE_KEY).toString(), is(Polygon.TYPE));
    List<List> listOfRings = (List<List>) geometryMap.get(CompositeGeometry.COORDINATES_KEY);
    assertThat(listOfRings.size(), is(2));

    List<List> exteriorRing = listOfRings.get(0);
    List<List> interiorRing = listOfRings.get(1);

    testPopularPolygon(exteriorRing);

    List<Double> interiorlist1 = interiorRing.get(0);
    List<Double> interiorlist2 = interiorRing.get(1);
    List<Double> interiorlist3 = interiorRing.get(2);
    List<Double> interiorlist4 = interiorRing.get(3);

    assertThat(interiorlist1.get(0), equalTo(20.0));
    assertThat(interiorlist1.get(1), equalTo(30.0));
    assertThat(interiorlist2.get(0), equalTo(35.0));
    assertThat(interiorlist2.get(1), equalTo(35.0));
    assertThat(interiorlist3.get(0), equalTo(30.0));
    assertThat(interiorlist3.get(1), equalTo(20.0));
    assertThat(interiorlist4.get(0), equalTo(20.0));
    assertThat(interiorlist4.get(1), equalTo(30.0));

    verifyBasicMetacardJson(now, obj2);
  }
  @Test
  public void testwithMultiLineStringGeo()
      throws CatalogTransformerException, IOException, ParseException {

    Date now = new Date();

    MetacardImpl metacard = new MetacardImpl();

    metacard.setLocation("MULTILINESTRING ((10 10, 20 20, 10 40),(40 40, 30 30, 40 20, 30 10))");
    setupBasicMetacard(now, metacard);

    GeoJsonMetacardTransformer transformer = new GeoJsonMetacardTransformer();

    BinaryContent content = transformer.transform(metacard, null);

    assertEquals(
        content.getMimeTypeValue(), GeoJsonMetacardTransformer.DEFAULT_MIME_TYPE.getBaseType());

    String jsonText = new String(content.getByteArray());
    LOGGER.debug(jsonText);
    Object object = PARSER.parse(jsonText);

    JSONObject obj2 = (JSONObject) object;

    Map geometryMap = (Map) obj2.get("geometry");
    assertThat(geometryMap.get(CompositeGeometry.TYPE_KEY).toString(), is(MultiLineString.TYPE));
    List<List<List<Double>>> coordsList =
        (List<List<List<Double>>>) geometryMap.get(CompositeGeometry.COORDINATES_KEY);
    assertThat(coordsList.size(), is(2));
    List<List<Double>> list1 = coordsList.get(0);
    List<List<Double>> list2 = coordsList.get(1);
    assertThat(list1.get(0).get(0), equalTo(10.0));
    assertThat(list1.get(0).get(1), equalTo(10.0));
    assertThat(list1.get(1).get(0), equalTo(20.0));
    assertThat(list1.get(1).get(1), equalTo(20.0));
    assertThat(list1.get(2).get(0), equalTo(10.0));
    assertThat(list1.get(2).get(1), equalTo(40.0));

    assertThat(list2.get(0).get(0), equalTo(40.0));
    assertThat(list2.get(0).get(1), equalTo(40.0));
    assertThat(list2.get(1).get(0), equalTo(30.0));
    assertThat(list2.get(1).get(1), equalTo(30.0));
    assertThat(list2.get(2).get(0), equalTo(40.0));
    assertThat(list2.get(2).get(1), equalTo(20.0));
    assertThat(list2.get(3).get(0), equalTo(30.0));
    assertThat(list2.get(3).get(1), equalTo(10.0));

    verifyBasicMetacardJson(now, obj2);
  }
  /**
   * Tests that improper WKT throws an exception
   *
   * @throws CatalogTransformerException
   * @throws IOException
   * @throws ParseException
   */
  @Test(expected = CatalogTransformerException.class)
  public void testwithBadGeo() throws CatalogTransformerException, IOException, ParseException {

    Date now = new Date();

    MetacardImpl metacard = new MetacardImpl();

    String badWktMissingComma =
        "MULTILINESTRING ((10 10, 20 20, 10 40)(40 40, 30 30, 40 20, 30 10))";
    metacard.setLocation(badWktMissingComma);
    setupBasicMetacard(now, metacard);

    GeoJsonMetacardTransformer transformer = new GeoJsonMetacardTransformer();

    BinaryContent content = transformer.transform(metacard, null);
  }
  @Test
  public void testWithMultiPolygonGeo()
      throws CatalogTransformerException, IOException, ParseException {

    Date now = new Date();

    MetacardImpl metacard = new MetacardImpl();

    metacard.setLocation(
        "MULTIPOLYGON (((30 10, 10 20, 20 40, 40 40, 30 10)),((15 5, 40 10, 10 20, 5 10, 15 5)))");

    setupBasicMetacard(now, metacard);

    GeoJsonMetacardTransformer transformer = new GeoJsonMetacardTransformer();

    BinaryContent content = transformer.transform(metacard, null);

    assertEquals(
        content.getMimeTypeValue(), GeoJsonMetacardTransformer.DEFAULT_MIME_TYPE.getBaseType());

    String jsonText = new String(content.getByteArray());
    LOGGER.debug(jsonText);
    Object object = PARSER.parse(jsonText);

    JSONObject obj2 = (JSONObject) object;

    Map geometryMap = (Map) obj2.get("geometry");
    assertThat(geometryMap.get(CompositeGeometry.TYPE_KEY).toString(), is(MultiPolygon.TYPE));

    List<List> listOfPolygons = (List<List>) geometryMap.get(CompositeGeometry.COORDINATES_KEY);
    assertThat(listOfPolygons.size(), is(2));

    List<List> polygon1 = listOfPolygons.get(0);
    List<List> polygon2 = listOfPolygons.get(1);

    List<List> polygon1FirstRing = polygon1.get(0);
    List<List> polygon2FirstRing = polygon2.get(0);

    testPopularPolygon(polygon1FirstRing);

    testSecondPolygon(polygon2FirstRing);

    verifyBasicMetacardJson(now, obj2);
  }