fastkml icon indicating copy to clipboard operation
fastkml copied to clipboard

Add tests for the OGC KML 2.2 Conformance Test Suite

Open cleder opened this issue 1 year ago • 8 comments

The kml and kmz files to be tested are present in: /tests/ogc_conformance/ to be done after #284

cleder avatar Apr 21 '24 14:04 cleder

@cleder Can you assign me this issue?

apurvabanka avatar Nov 16 '24 16:11 apurvabanka

I gave it a bit of a start. The idea is to read each file in fastkml and it then has to reproduce the original with to_string, i.e. the xmldiff should be empty.

import pathlib

from xmldiff import formatting
from xmldiff import main

import fastkml
import fastkml.validator
from tests.base import Lxml

BASEDIR = pathlib.Path(__file__).parent
KMLFILEDIR = BASEDIR / "data" / "kml"


class TestLxml(Lxml):
    """Test with the standard library."""

    def test_document_clean(self) -> None:
        clean_doc = KMLFILEDIR / "Document-clean.kml"
        expected_xml = clean_doc.open("rb").read()
        formatter = formatting.XmlDiffFormatter(normalize=formatting.WS_BOTH)

        doc = fastkml.kml.KML.parse(clean_doc)

        diff = main.diff_texts(
            doc.to_string(),
            expected_xml,
            # diff_options={"uniqueattrs": "{http://www.opengis.net/kml/2.2}id"},
            # formatter=formatter,
        )

        assert fastkml.validator.validate(file_to_validate=clean_doc)
        assert fastkml.validator.validate(element=doc.etree_element())
        # assert diff == []

    def test_docunemt_empty_placemark_without_id(self) -> None:
        empty_placemark = KMLFILEDIR / "emptyPlacemarkWithoutId.xml"
        expected_xml = empty_placemark.open("rb").read()
        formatter = formatting.DiffFormatter(normalize=formatting.WS_BOTH)

        doc = fastkml.kml.KML.parse(empty_placemark)

        diff = main.diff_texts(
            doc.to_string(),
            expected_xml,
            # diff_options={"uniqueattrs": "{http://www.opengis.net/kml/2.2}id"},
            # formatter=formatter,
        )
        assert diff == []
        assert fastkml.validator.validate(file_to_validate=empty_placemark)
        assert fastkml.validator.validate(element=doc.etree_element())

    def test_document_deprecated(self) -> None:
        deprecated_doc = KMLFILEDIR / "Document-deprecated.kml"
        expected_xml = deprecated_doc.open("rb").read()
        formatter = formatting.DiffFormatter(normalize=formatting.WS_BOTH)

        doc = fastkml.kml.KML.parse(deprecated_doc)

        diff = main.diff_texts(
            doc.to_string(),
            expected_xml,
            # diff_options={"uniqueattrs": "{http://www.opengis.net/kml/2.2}id"},
            # formatter=formatter,
        )

        # assert diff is None

    def test_document_places(self) -> None:
        places_doc = KMLFILEDIR / "Document-places.kml"
        expected_xml = places_doc.open("rb").read()
        formatter = formatting.DiffFormatter(normalize=formatting.WS_BOTH)

        doc = fastkml.kml.KML.parse(places_doc)

        diff = main.diff_texts(
            doc.to_string(precision=2),
            expected_xml,
            # diff_options={"uniqueattrs": "{http://www.opengis.net/kml/2.2}id"},
            formatter=formatter,
        )

        assert diff == ""
        assert fastkml.validator.validate(file_to_validate=places_doc)
        assert fastkml.validator.validate(element=doc.etree_element())

    def test_document_kml_samples(self) -> None:
        kml_samples_doc = KMLFILEDIR / "KML_Samples.kml"
        expected_xml = kml_samples_doc.open("rb").read()
        formatter = formatting.DiffFormatter(normalize=formatting.WS_BOTH)

        doc = fastkml.kml.KML.parse(kml_samples_doc)

        diff = main.diff_texts(
            doc.to_string(),
            expected_xml,
            # diff_options={"uniqueattrs": "{http://www.opengis.net/kml/2.2}id"},
            formatter=formatter,
        )

        # assert diff is None
        assert fastkml.validator.validate(file_to_validate=kml_samples_doc)
        assert fastkml.validator.validate(element=doc.etree_element())

    def test_document_linearring_with_1d_tuple(self) -> None:
        linearring_1d_tuples = KMLFILEDIR / "LinearRingWith1DTuple.kml"
        expected_xml = linearring_1d_tuples.open("rb").read()
        formatter = formatting.DiffFormatter(normalize=formatting.WS_BOTH)

        doc = fastkml.kml.KML.parse(linearring_1d_tuples)

        diff = main.diff_texts(
            doc.to_string(precision=1),
            expected_xml,
            # diff_options={"uniqueattrs": "{http://www.opengis.net/kml/2.2}id"},
            formatter=formatter,
        )

        # assert diff is None
        assert fastkml.validator.validate(file_to_validate=linearring_1d_tuples)
        # assert fastkml.validate.validate(element=doc.etree_element())

    def test_read_kml_samples(self) -> None:
        for p in KMLFILEDIR.glob("**/*.kml"):
            print(p)
            doc = fastkml.kml.KML.parse(p)
            # assert doc.validate()
            # assert doc.to_string() == p.open("rb").read()

cleder avatar Nov 17 '24 11:11 cleder

@cleder This change requires to install "xmldiff". Should this be added to the requirement.txt or the pyproject.toml.? For pyproject.toml, how do we add the dependency? I have used poetry in the past but I don't see you use poetry for this repo.

apurvabanka avatar Nov 17 '24 18:11 apurvabanka

pyproject.toml

[project.optional-dependencies]
tests = [
    "hypothesis[dateutil]",
    "pytest",
    "pytest-cov",
    "pytz",
    "tzdata",
    "xmldiff", # here
]

cleder avatar Nov 18 '24 12:11 cleder

@cleder Trying to understand what we are comparing here. I tried to create a KML file after using the Parse function on "Document-clean.kml" file. I see there are components that the Parser function doesn't account for. For eg. <NetworkLinkControl> tag. Our parser doesn't parse this tag. How do we handle this?

apurvabanka avatar Nov 19 '24 08:11 apurvabanka

Create an Issue to implement the tag.

cleder avatar Nov 19 '24 10:11 cleder

@cleder Created the issue https://github.com/cleder/fastkml/issues/390. Can you verify if any fields are missing?

apurvabanka avatar Nov 19 '24 18:11 apurvabanka

to be tackled after #413

cleder avatar Nov 26 '25 23:11 cleder