gdal/autotest/gcore/minixml.py

260 строки
7.4 KiB
Python
Исполняемый файл

#!/usr/bin/env pytest
###############################################################################
# $Id$
#
# Project: GDAL/OGR Test Suite
# Purpose: Test Minixml services from Python.
# Author: Frank Warmerdam <warmerdam@pobox.com>
#
###############################################################################
# Copyright (c) 2005, Frank Warmerdam <warmerdam@pobox.com>
# Copyright (c) 2009-2011, Even Rouault <even dot rouault at spatialys.com>
#
# Permission is hereby granted, free of charge, to any person obtaining a
# copy of this software and associated documentation files (the "Software"),
# to deal in the Software without restriction, including without limitation
# the rights to use, copy, modify, merge, publish, distribute, sublicense,
# and/or sell copies of the Software, and to permit persons to whom the
# Software is furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included
# in all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
# DEALINGS IN THE SOFTWARE.
###############################################################################
import gdaltest
import pytest
from osgeo import gdal
###############################################################################
# Parse a simple document into a tree of lists.
def test_minixml_1():
tree = gdal.ParseXMLString('<TestDoc style="123"><sub1/><sub2>abc</sub2></TestDoc>')
assert tree[0] == gdal.CXT_Element, "wrong node type."
assert tree[1] == "TestDoc", "Wrong element name"
assert len(tree) == 5, "Wrong number of children."
# Check style attribute
node = tree[2]
assert node[0] == gdal.CXT_Attribute, "wrong node type."
assert node[1] == "style", "Wrong element name"
assert len(node) == 3, "Wrong number of children."
assert node[2][1] == "123", "Wrong element content."
# Check <sub1> element
node = tree[3]
assert node[0] == gdal.CXT_Element, "wrong node type."
assert node[1] == "sub1", "Wrong element name"
assert len(node) == 2, "Wrong number of children."
# Check <sub2> element
node = tree[4]
assert node[0] == gdal.CXT_Element, "wrong node type."
assert node[1] == "sub2", "Wrong element name"
assert len(node) == 3, "Wrong number of children."
assert node[2][1] == "abc", "Wrong element content."
###############################################################################
# Serialize an XML Tree
def test_minixml_2():
tree = [
0,
"TestDoc",
[2, "style", [1, "123"]],
[0, "sub1"],
[0, "sub2", [1, "abc"]],
]
doc_target = '<TestDoc style="123">\n <sub1 />\n <sub2>abc</sub2>\n</TestDoc>\n'
doc_got = gdal.SerializeXMLTree(tree)
assert doc_got == doc_target, "serialize xml tree failed."
###############################################################################
# Read XML document with complex DOCTYPE element.
def test_minixml_3():
fp = open("data/doctype.xml", "r")
text = fp.read()
tree = gdal.ParseXMLString(text)
assert tree[0] == gdal.CXT_Element, "wrong node type."
# Check <chapter> element
node = tree[6]
assert node[0] == gdal.CXT_Element, "wrong node type."
assert node[1] == "chapter", "Wrong element name"
assert len(node) == 7, "Wrong number of children."
# Check <chapter><title> subelement
subnode = node[2]
assert subnode[0] == gdal.CXT_Element, "wrong node type."
assert subnode[1] == "title", "Wrong element name"
assert len(subnode) == 3, "Wrong number of children."
assert subnode[2][1] == "Chapter 1", "Wrong element content."
# Check fist <chapter><para> subelement
subnode = node[3]
assert subnode[0] == gdal.CXT_Element, "wrong node type."
assert subnode[1] == "para", "Wrong element name"
assert len(subnode) == 3, "Wrong number of children."
###############################################################################
# Parse and serialize an XML Tree with a <?xml> prolog
def test_minixml_4():
xml = """<?xml encoding="utf-8"?>\n<foo />\n"""
got_xml = gdal.SerializeXMLTree(gdal.ParseXMLString(xml))
assert xml == got_xml, "serialize xml tree failed."
###############################################################################
# Parse malformed XML. Complains, but still makes a tree.
def test_minixml_5():
test_pairs = (
("<a></A>", "case"),
("<a b=c></a>", "quoted"),
)
for xml_str, expect in test_pairs:
with gdaltest.error_handler():
tree = gdal.ParseXMLString(xml_str)
found = gdal.GetLastErrorMsg()
assert expect in found, (
'Did not find expected error message: "%s" '
'Found: "%s" '
'For test string: "%s""' % (expect, found, xml_str)
)
assert tree is not None, 'Tree is None: "%s"' % tree
###############################################################################
# Parse malformed XML.
def test_minixml_6():
test_pairs = (
("<", "element token after open angle bracket"),
("<a>", "not all elements have been closed"),
("<a><b>", "not all elements have been closed"),
("<a><b></a></b>", "have matching"),
("<a foo=></a>", "attribute value"),
("<></>", "element token"),
("<&></&>", "matching"),
("<a></a", "Missing close angle"),
("<a foo=2'> foo=2'>", "unexpected token"),
("<a?>", "without matching"),
("<a/.", "for value of attribute "),
("<a'>", "reached EOF before closing quote"),
)
for xml_str, expect in test_pairs:
with pytest.raises(Exception):
gdal.ParseXMLString(xml_str)
###############################################################################
# Parse malformed XML. Pass without warning, but should not pass.
def test_minixml_7():
test_strings = (
"<1></1>",
"<-></->",
"<.></.>",
"<![CDATA[",
)
for xml_str in test_strings:
gdal.ErrorReset()
tree = gdal.ParseXMLString(xml_str)
found = gdal.GetLastErrorMsg()
assert found == "", 'Unexpected msg "%s"' % found
assert tree is not None, 'Tree is None: "%s"' % tree
###############################################################################
# Parse XML with too many nesting
def test_minixml_8():
xml_str = "<a>" * 10001
xml_str += "</a>" * 10001
gdal.ErrorReset()
with pytest.raises(Exception):
gdal.ParseXMLString(xml_str)
###############################################################################
# Parse and serialize an XML Tree with a <?a b c d ?> processing instruction
def test_minixml_processing_instruction():
xml = """<?a b c d?>\n<foo />\n"""
got_xml = gdal.SerializeXMLTree(gdal.ParseXMLString(xml))
assert xml == got_xml, "serialize xml tree failed."
###############################################################################
# Cleanup
def test_minixml_cleanup():
pass