void assertFeatureTypeList(WFSCapabilitiesType caps) {
    FeatureTypeListType ftl = caps.getFeatureTypeList();
    assertNotNull(ftl);

    assertEquals(14, ftl.getFeatureType().size());

    FeatureTypeType featureType = (FeatureTypeType) ftl.getFeatureType().get(0);
    assertEquals("poly_landmarks", featureType.getName().getLocalPart());
    assertEquals("tiger", featureType.getName().getPrefix());
    assertEquals("http://www.census.gov", featureType.getName().getNamespaceURI());

    assertEquals("urn:ogc:def:crs:EPSG::4326", featureType.getDefaultCRS());

    List<WGS84BoundingBoxType> wgs84BoundingBox = featureType.getWGS84BoundingBox();
    assertEquals(1, wgs84BoundingBox.size());

    WGS84BoundingBoxType bbox = wgs84BoundingBox.get(0);
    assertEquals("EPSG:4326", bbox.getCrs());
    assertEquals(BigInteger.valueOf(2), bbox.getDimensions());

    assertEquals(-74.047185D, (Double) bbox.getLowerCorner().get(0), 1E-6);
    assertEquals(40.679648D, (Double) bbox.getLowerCorner().get(1), 1E-6);
    assertEquals(-73.90782D, (Double) bbox.getUpperCorner().get(0), 1E-6);
    assertEquals(40.882078D, (Double) bbox.getUpperCorner().get(1), 1E-6);
  }
  void assertOperationsMetadata(WFSCapabilitiesType caps) {
    OperationsMetadataType om = caps.getOperationsMetadata();
    assertNotNull(om);

    // assertEquals(6, om.getOperation().size());

    OperationType getCapsOp = (OperationType) om.getOperation().get(0);
    assertEquals("GetCapabilities", getCapsOp.getName());
    assertEquals(1, getCapsOp.getDCP().size());

    DCPType dcp1 = (DCPType) getCapsOp.getDCP().get(0);
    assertEquals(1, dcp1.getHTTP().getGet().size());
    assertEquals(1, dcp1.getHTTP().getPost().size());

    assertEquals(
        "http://localhost:8080/geoserver/wfs?get",
        ((RequestMethodType) dcp1.getHTTP().getGet().get(0)).getHref());
    assertEquals(
        "http://localhost:8080/geoserver/wfs?post",
        ((RequestMethodType) dcp1.getHTTP().getPost().get(0)).getHref());

    int i = 1;
    assertEquals("DescribeFeatureType", ((OperationType) om.getOperation().get(i++)).getName());
    assertEquals("GetFeature", ((OperationType) om.getOperation().get(i++)).getName());
    assertEquals("GetPropertyValue", ((OperationType) om.getOperation().get(i++)).getName());
    assertEquals("ListStoredQueries", ((OperationType) om.getOperation().get(i++)).getName());
    assertEquals("DescribeStoredQueries", ((OperationType) om.getOperation().get(i++)).getName());
    assertEquals("CreateStoredQuery", ((OperationType) om.getOperation().get(i++)).getName());
    assertEquals("DropStoredQuery", ((OperationType) om.getOperation().get(i++)).getName());
    assertEquals("LockFeature", ((OperationType) om.getOperation().get(i++)).getName());
    assertEquals("GetFeatureWithLock", ((OperationType) om.getOperation().get(i++)).getName());
    assertEquals("Transaction", ((OperationType) om.getOperation().get(i++)).getName());
  }
  public void testParseGetCapabilitiesCuzk() throws Exception {
    configuration = new org.geotools.wfs.v2_0.WFSCapabilitiesConfiguration();

    Parser parser = new Parser(configuration);
    Object parsed = parser.parse(getClass().getResourceAsStream("cuzk-GetCapabilities_2_0_0.xml"));

    assertNotNull(parsed);
    assertTrue(parsed.getClass().getName(), parsed instanceof WFSCapabilitiesType);
    WFSCapabilitiesType caps = (WFSCapabilitiesType) parsed;

    assertNotNull(caps);
    assertEquals("2.0.0", caps.getVersion());

    FilterCapabilitiesType fct = caps.getFilterCapabilities();
    assertNotNull(fct);
  }
  public void testParseGetCapabilitiesFMI() throws Exception {
    configuration = new org.geotools.wfs.v2_0.WFSCapabilitiesConfiguration();

    Parser parser = new Parser(configuration);
    Object parsed = parser.parse(getClass().getResourceAsStream("fmi-GetCapabilities_2_0_0.xml"));

    assertNotNull(parsed);
    assertTrue(parsed.getClass().getName(), parsed instanceof WFSCapabilitiesType);
    WFSCapabilitiesType caps = (WFSCapabilitiesType) parsed;

    assertNotNull(caps);
    assertEquals("2.0.0", caps.getVersion());

    // test stored query parsing
    // TODO:
  }
  public void testParseGetCapabilities() throws Exception {
    configuration = new org.geotools.wfs.v2_0.WFSCapabilitiesConfiguration();

    Parser parser = new Parser(configuration);
    Object parsed =
        parser.parse(getClass().getResourceAsStream("geoserver-GetCapabilities_2_0_0.xml"));

    assertNotNull(parsed);
    assertTrue(parsed.getClass().getName(), parsed instanceof WFSCapabilitiesType);
    WFSCapabilitiesType caps = (WFSCapabilitiesType) parsed;

    assertNotNull(caps);
    assertEquals("2.0.0", caps.getVersion());
    /*
            assertServiceIdentification(caps);
            assertOperationsMetadata(caps);
            assertFeatureTypeList(caps);
            assertFilterCapabilities(caps);
    */
  }
  public void testParseEmptyGetCapabilities() throws Exception {
    String xml =
        "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
            + "<WFS_Capabilities "
            + "  version=\"2.0.0\" "
            + "  xmlns=\"http://www.opengis.net/wfs/2.0\""
            + "  xmlns:fes=\"http://www.opengis.net/fes/2.0\""
            + "  xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\""
            + "  xsi:schemaLocation=\"http://www.opengis.net/wfs/2.0 http://schemas.opengis.net/wfs/2.0/wfs.xsd\">"
            + "</WFS_Capabilities>";

    configuration = new org.geotools.wfs.v2_0.WFSCapabilitiesConfiguration();

    Parser parser = new Parser(configuration);
    Object parsed = parser.parse(new ByteArrayInputStream(xml.getBytes()));
    assertNotNull(parsed);
    assertTrue(parsed.getClass().getName(), parsed instanceof WFSCapabilitiesType);
    WFSCapabilitiesType caps = (WFSCapabilitiesType) parsed;

    assertNotNull(caps);
    assertEquals("2.0.0", caps.getVersion());
  }
  void assertFilterCapabilities(WFSCapabilitiesType caps) {
    FilterCapabilities fc = (FilterCapabilities) caps.getFilterCapabilities();

    assertNotNull(fc.getSpatialCapabilities());
    assertNotNull(fc.getSpatialCapabilities().getSpatialOperators());
    assertNotNull(fc.getSpatialCapabilities().getSpatialOperators().getOperators());
    assertEquals(11, fc.getSpatialCapabilities().getSpatialOperators().getOperators().size());

    assertNotNull(fc.getSpatialCapabilities().getSpatialOperators().getOperator("Disjoint"));
    assertNotNull(fc.getSpatialCapabilities().getSpatialOperators().getOperator("Equals"));
    assertNotNull(fc.getSpatialCapabilities().getSpatialOperators().getOperator("DWithin"));
    assertNotNull(fc.getSpatialCapabilities().getSpatialOperators().getOperator("Beyond"));
    assertNotNull(fc.getSpatialCapabilities().getSpatialOperators().getOperator("Intersect"));
    assertNotNull(fc.getSpatialCapabilities().getSpatialOperators().getOperator("Touches"));
    assertNotNull(fc.getSpatialCapabilities().getSpatialOperators().getOperator("Crosses"));
    assertNotNull(fc.getSpatialCapabilities().getSpatialOperators().getOperator("Within"));
    assertNotNull(fc.getSpatialCapabilities().getSpatialOperators().getOperator("Contains"));
    assertNotNull(fc.getSpatialCapabilities().getSpatialOperators().getOperator("Overlaps"));
    assertNotNull(fc.getSpatialCapabilities().getSpatialOperators().getOperator("BBOX"));

    assertNotNull(fc.getScalarCapabilities());
    assertTrue(fc.getScalarCapabilities().hasLogicalOperators());
    assertNotNull(fc.getScalarCapabilities().getArithmeticOperators());
    assertNotNull(fc.getScalarCapabilities().getComparisonOperators());

    assertTrue(fc.getScalarCapabilities().getArithmeticOperators().hasSimpleArithmetic());
    assertNotNull(fc.getScalarCapabilities().getArithmeticOperators().getFunctions());
    assertEquals(
        7,
        fc.getScalarCapabilities()
            .getArithmeticOperators()
            .getFunctions()
            .getFunctionNames()
            .size());

    Collection<Operator> operators =
        fc.getScalarCapabilities().getComparisonOperators().getOperators();

    assertEquals(3, operators.size()); // "Simple_Comparisons" is commented out on purpose

    assertNotNull(fc.getScalarCapabilities().getComparisonOperators().getOperator("Between"));
    assertNotNull(fc.getScalarCapabilities().getComparisonOperators().getOperator("Like"));
    assertNotNull(fc.getScalarCapabilities().getComparisonOperators().getOperator("NullCheck"));
  }
  void assertServiceIdentification(WFSCapabilitiesType caps) {
    ServiceIdentificationType sa = caps.getServiceIdentification();
    assertNotNull(sa);

    assertEquals(1, sa.getKeywords().size());

    KeywordsType keywords = (KeywordsType) sa.getKeywords().get(0);
    List<String> simpleKeywords = new ArrayList<String>();
    for (Object o : keywords.getKeyword()) {
      LanguageStringType lst = (LanguageStringType) o;
      simpleKeywords.add(lst.getValue());
    }
    assertTrue(simpleKeywords.contains("WFS"));
    assertTrue(simpleKeywords.contains("WMS"));
    assertTrue(simpleKeywords.contains("GEOSERVER"));

    assertEquals("WFS", sa.getServiceType().getValue());
    assertEquals("2.0.0", sa.getServiceTypeVersion().get(0));
  }