Skip to content

Commit

Permalink
Add regression test of xmlschema against W3C XSD suite
Browse files Browse the repository at this point in the history
  • Loading branch information
brunato committed Feb 8, 2024
1 parent 32116ee commit 4aa9adb
Show file tree
Hide file tree
Showing 2 changed files with 113 additions and 4 deletions.
84 changes: 83 additions & 1 deletion tests/test_xpath31.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@
else:
xmlschema.XMLSchema.meta_schema.build()

from elementpath import XPathContext
from elementpath import XPathContext, select
from elementpath.etree import etree_deep_equal
from elementpath.datatypes import DateTime, Base64Binary
from elementpath.xpath_nodes import DocumentNode
Expand Down Expand Up @@ -1089,6 +1089,88 @@ def test_json_to_xml_function(self):
class LxmlXPath31ParserTest(XPath31ParserTest):
etree = lxml_etree

def test_regression_ep415_ep420__issue_71(self):
# This is not really a regression because ep415.
import lxml.html as lxml_html

xml_source = dedent("""\
<hotel>
<branch location="California">
<staff>
<date>2023-10-10</date>
<given_name>Christopher</given_name>
<surname>Anderson</surname>
<age>25</age>
</staff>
<staff>
<date>2023-10-11</date>
<given_name>Christopher</given_name>
<surname>Carter</surname>
<age>30</age>
</staff>
</branch>
<branch location="Las Vegas">
<staff>
<given_name>Lisa</given_name>
<surname>Walker</surname>
<age>60</age>
</staff>
<staff>
<given_name>Jessica</given_name>
<surname>Walker</surname>
<age>32</age>
</staff>
<staff>
<given_name>Jennifer</given_name>
<surname>Roberts</surname>
<age>50</age>
</staff>
</branch>
</hotel>
""")

queries = [
'if (count(//hotel/branch/staff) = 5) then true() else false()',
'//hotel/branch/staff',
'if (count(/hotel/branch/staff) = 5) then true() else false()',
'(count(/hotel/branch/staff) = 5)',
'(count(/hotel/branch/staff))',
'/hotel/branch/staff',
'for $i in /hotel/branch/staff return $i/given_name',
'for $i in //hotel/branch/staff return $i/given_name',
'distinct-values(for $i in /hotel/branch/staff return $i/given_name)',
'distinct-values(for $i in //hotel/branch/staff return $i/given_name)',
'date(/hotel/branch[1]/staff[1]/date) instance of xs:date',
'/hotel/branch[1]/staff[1]/date cast as xs:date',
]

html_parser = lxml_html.HTMLParser()
xml_parser = lxml_etree.XMLParser(strip_cdata=False)

xml_data = bytes(xml_source, encoding='utf-8')
data_trees = {
'html': lxml_html.fromstring(xml_data, parser=html_parser),
'xml': lxml_etree.fromstring(xml_data, parser=xml_parser)
}

for query in queries:
results = []
for doctype, document in data_trees.items():
try:
res = select(document, query, parser=XPath31Parser)
except Exception as e:
results.append(e)
else:
results.append(res)

if isinstance(results[0], list):
self.assertIsInstance(results[1], list)
self.assertEqual(len(results[0]), len(results[1]))
for e1, e2 in zip(*results):
self.assertEqual(e1.tag, e2.tag)
else:
self.assertEqual(results[0], results[1])


class XPath31FunctionsTest(test_xpath30.XPath30FunctionsTest):

Expand Down
33 changes: 30 additions & 3 deletions tox.ini
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,9 @@
[tox]
min_version = 4.0
envlist =
py{38,39,310,311,312}, pypy3
docs, flake8, mypy-py{38,39,310,311,312,py3},
pytest, coverage, xmlschema{223,231,240,251,301}
py{38,39,310,311,312}, pypy3, docs, flake8,
mypy-py{38,39,310,311,312,py3}, pytest, coverage,
xmlschema{223,231,240,251,301}, w3c-xsdtests
skip_missing_interpreters = true
work_dir = {tox_root}/../.tox/elementpath

Expand Down Expand Up @@ -84,6 +84,33 @@ commands =
python tests/test_all.py
allowlist_externals = tar

[testenv:w3c-xsdtests]
platform = (linux|darwin)
set_env =
VERSION = 3.0.1
COMMIT = 4293d6fb026af778aa7ad381c2a310354578cbe3
CHECKSUM = 3c7a44dbb59553d09ba96fee898255be78966960c22e9a7886c0b426a03255d7
change_dir = {env_tmp_dir}
deps =
lxml
xmlschema=={env:VERSION}
commands =
pip download xmlschema=={env:VERSION} --no-deps --no-binary xmlschema
tar xzf xmlschema-{env:VERSION}.tar.gz
curl -L -o w3c-xsdtests.tar.gz https://github.com/w3c/xsdtests/tarball/{env:COMMIT}
bash -c "sha256sum w3c-xsdtests.tar.gz | grep {env:CHECKSUM}"
mkdir xsdtests
tar xzf w3c-xsdtests.tar.gz -C xsdtests --strip-components=1
python xmlschema-{env:VERSION}/tests/test_w3c_suite.py --xml
allowlist_externals =
bash
curl
grep
tar
mkdir
sha256sum
ignore_outcome = True

[testenv:build]
deps =
setuptools
Expand Down

0 comments on commit 4aa9adb

Please sign in to comment.