diff options
author | William Joye <wjoye@cfa.harvard.edu> | 2017-05-03 15:29:42 (GMT) |
---|---|---|
committer | William Joye <wjoye@cfa.harvard.edu> | 2017-05-03 15:29:42 (GMT) |
commit | 937cfaf1a06a4a9d0c8ba119d7ce820878ff9058 (patch) | |
tree | f7b0b1bcce9ae963a0a069eafa552350eb4ee391 /libxml2/python/tests/reader.py | |
parent | 4b8453f0303492a1de2dcf854555f6429fac550e (diff) | |
download | blt-937cfaf1a06a4a9d0c8ba119d7ce820878ff9058.zip blt-937cfaf1a06a4a9d0c8ba119d7ce820878ff9058.tar.gz blt-937cfaf1a06a4a9d0c8ba119d7ce820878ff9058.tar.bz2 |
inital commit
Diffstat (limited to 'libxml2/python/tests/reader.py')
-rwxr-xr-x | libxml2/python/tests/reader.py | 446 |
1 files changed, 446 insertions, 0 deletions
diff --git a/libxml2/python/tests/reader.py b/libxml2/python/tests/reader.py new file mode 100755 index 0000000..173ce66 --- /dev/null +++ b/libxml2/python/tests/reader.py @@ -0,0 +1,446 @@ +#!/usr/bin/python -u +# -*- coding: ISO-8859-1 -*- +# +# this tests the basic APIs of the XmlTextReader interface +# +import libxml2 +import sys +try: + import StringIO + str_io = StringIO.StringIO +except: + import io + str_io = io.StringIO + +# Memory debug specific +libxml2.debugMemory(1) + +f = str_io("""<a><b b1="b1"/><c>content of c</c></a>""") +input = libxml2.inputBuffer(f) +reader = input.newTextReader("test1") +ret = reader.Read() +if ret != 1: + print("test1: Error reading to first element") + sys.exit(1) +if reader.Name() != "a" or reader.IsEmptyElement() != 0 or \ + reader.NodeType() != 1 or reader.HasAttributes() != 0: + print("test1: Error reading the first element") + sys.exit(1) +ret = reader.Read() +if ret != 1: + print("test1: Error reading to second element") + sys.exit(1) +if reader.Name() != "b" or reader.IsEmptyElement() != 1 or \ + reader.NodeType() != 1 or reader.HasAttributes() != 1: + print("test1: Error reading the second element") + sys.exit(1) +ret = reader.Read() +if ret != 1: + print("test1: Error reading to third element") + sys.exit(1) +if reader.Name() != "c" or reader.IsEmptyElement() != 0 or \ + reader.NodeType() != 1 or reader.HasAttributes() != 0: + print("test1: Error reading the third element") + sys.exit(1) +ret = reader.Read() +if ret != 1: + print("test1: Error reading to text node") + sys.exit(1) +if reader.Name() != "#text" or reader.IsEmptyElement() != 0 or \ + reader.NodeType() != 3 or reader.HasAttributes() != 0 or \ + reader.Value() != "content of c": + print("test1: Error reading the text node") + sys.exit(1) +ret = reader.Read() +if ret != 1: + print("test1: Error reading to end of third element") + sys.exit(1) +if reader.Name() != "c" or reader.IsEmptyElement() != 0 or \ + reader.NodeType() != 15 or reader.HasAttributes() != 0: + print("test1: Error reading the end of third element") + sys.exit(1) +ret = reader.Read() +if ret != 1: + print("test1: Error reading to end of first element") + sys.exit(1) +if reader.Name() != "a" or reader.IsEmptyElement() != 0 or \ + reader.NodeType() != 15 or reader.HasAttributes() != 0: + print("test1: Error reading the end of first element") + sys.exit(1) +ret = reader.Read() +if ret != 0: + print("test1: Error reading to end of document") + sys.exit(1) + +# +# example from the XmlTextReader docs +# +f = str_io("""<test xmlns:dt="urn:datatypes" dt:type="int"/>""") +input = libxml2.inputBuffer(f) +reader = input.newTextReader("test2") + +ret = reader.Read() +if ret != 1: + print("Error reading test element") + sys.exit(1) +if reader.GetAttributeNo(0) != "urn:datatypes" or \ + reader.GetAttributeNo(1) != "int" or \ + reader.GetAttributeNs("type", "urn:datatypes") != "int" or \ + reader.GetAttribute("dt:type") != "int": + print("error reading test attributes") + sys.exit(1) + +# +# example from the XmlTextReader docs +# +f = str_io("""<root xmlns:a="urn:456"> +<item> +<ref href="a:b"/> +</item> +</root>""") +input = libxml2.inputBuffer(f) +reader = input.newTextReader("test3") + +ret = reader.Read() +while ret == 1: + if reader.Name() == "ref": + if reader.LookupNamespace("a") != "urn:456": + print("error resolving namespace prefix") + sys.exit(1) + break + ret = reader.Read() +if ret != 1: + print("Error finding the ref element") + sys.exit(1) + +# +# Home made example for the various attribute access functions +# +f = str_io("""<testattr xmlns="urn:1" xmlns:a="urn:2" b="b" a:b="a:b"/>""") +input = libxml2.inputBuffer(f) +reader = input.newTextReader("test4") +ret = reader.Read() +if ret != 1: + print("Error reading the testattr element") + sys.exit(1) +# +# Attribute exploration by index +# +if reader.MoveToAttributeNo(0) != 1: + print("Failed moveToAttribute(0)") + sys.exit(1) +if reader.Value() != "urn:1": + print("Failed to read attribute(0)") + sys.exit(1) +if reader.Name() != "xmlns": + print("Failed to read attribute(0) name") + sys.exit(1) +if reader.MoveToAttributeNo(1) != 1: + print("Failed moveToAttribute(1)") + sys.exit(1) +if reader.Value() != "urn:2": + print("Failed to read attribute(1)") + sys.exit(1) +if reader.Name() != "xmlns:a": + print("Failed to read attribute(1) name") + sys.exit(1) +if reader.MoveToAttributeNo(2) != 1: + print("Failed moveToAttribute(2)") + sys.exit(1) +if reader.Value() != "b": + print("Failed to read attribute(2)") + sys.exit(1) +if reader.Name() != "b": + print("Failed to read attribute(2) name") + sys.exit(1) +if reader.MoveToAttributeNo(3) != 1: + print("Failed moveToAttribute(3)") + sys.exit(1) +if reader.Value() != "a:b": + print("Failed to read attribute(3)") + sys.exit(1) +if reader.Name() != "a:b": + print("Failed to read attribute(3) name") + sys.exit(1) +# +# Attribute exploration by name +# +if reader.MoveToAttribute("xmlns") != 1: + print("Failed moveToAttribute('xmlns')") + sys.exit(1) +if reader.Value() != "urn:1": + print("Failed to read attribute('xmlns')") + sys.exit(1) +if reader.MoveToAttribute("xmlns:a") != 1: + print("Failed moveToAttribute('xmlns')") + sys.exit(1) +if reader.Value() != "urn:2": + print("Failed to read attribute('xmlns:a')") + sys.exit(1) +if reader.MoveToAttribute("b") != 1: + print("Failed moveToAttribute('b')") + sys.exit(1) +if reader.Value() != "b": + print("Failed to read attribute('b')") + sys.exit(1) +if reader.MoveToAttribute("a:b") != 1: + print("Failed moveToAttribute('a:b')") + sys.exit(1) +if reader.Value() != "a:b": + print("Failed to read attribute('a:b')") + sys.exit(1) +if reader.MoveToAttributeNs("b", "urn:2") != 1: + print("Failed moveToAttribute('b', 'urn:2')") + sys.exit(1) +if reader.Value() != "a:b": + print("Failed to read attribute('b', 'urn:2')") + sys.exit(1) +# +# Go back and read in sequence +# +if reader.MoveToElement() != 1: + print("Failed to move back to element") + sys.exit(1) +if reader.MoveToFirstAttribute() != 1: + print("Failed to move to first attribute") + sys.exit(1) +if reader.Value() != "urn:1": + print("Failed to read attribute(0)") + sys.exit(1) +if reader.Name() != "xmlns": + print("Failed to read attribute(0) name") + sys.exit(1) +if reader.MoveToNextAttribute() != 1: + print("Failed to move to next attribute") + sys.exit(1) +if reader.Value() != "urn:2": + print("Failed to read attribute(1)") + sys.exit(1) +if reader.Name() != "xmlns:a": + print("Failed to read attribute(1) name") + sys.exit(1) +if reader.MoveToNextAttribute() != 1: + print("Failed to move to next attribute") + sys.exit(1) +if reader.Value() != "b": + print("Failed to read attribute(2)") + sys.exit(1) +if reader.Name() != "b": + print("Failed to read attribute(2) name") + sys.exit(1) +if reader.MoveToNextAttribute() != 1: + print("Failed to move to next attribute") + sys.exit(1) +if reader.Value() != "a:b": + print("Failed to read attribute(3)") + sys.exit(1) +if reader.Name() != "a:b": + print("Failed to read attribute(3) name") + sys.exit(1) +if reader.MoveToNextAttribute() != 0: + print("Failed to detect last attribute") + sys.exit(1) + + +# +# a couple of tests for namespace nodes +# +f = str_io("""<a xmlns="http://example.com/foo"/>""") +input = libxml2.inputBuffer(f) +reader = input.newTextReader("test6") +ret = reader.Read() +if ret != 1: + print("test6: failed to Read()") + sys.exit(1) +ret = reader.MoveToFirstAttribute() +if ret != 1: + print("test6: failed to MoveToFirstAttribute()") + sys.exit(1) +if reader.NamespaceUri() != "http://www.w3.org/2000/xmlns/" or \ + reader.LocalName() != "xmlns" or reader.Name() != "xmlns" or \ + reader.Value() != "http://example.com/foo" or reader.NodeType() != 2: + print("test6: failed to read the namespace node") + sys.exit(1) + +f = str_io("""<a xmlns:prefix="http://example.com/foo"/>""") +input = libxml2.inputBuffer(f) +reader = input.newTextReader("test7") +ret = reader.Read() +if ret != 1: + print("test7: failed to Read()") + sys.exit(1) +ret = reader.MoveToFirstAttribute() +if ret != 1: + print("test7: failed to MoveToFirstAttribute()") + sys.exit(1) +if reader.NamespaceUri() != "http://www.w3.org/2000/xmlns/" or \ + reader.LocalName() != "prefix" or reader.Name() != "xmlns:prefix" or \ + reader.Value() != "http://example.com/foo" or reader.NodeType() != 2: + print("test7: failed to read the namespace node") + sys.exit(1) + +# +# Test for a limit case: +# +f = str_io("""<a/>""") +input = libxml2.inputBuffer(f) +reader = input.newTextReader("test8") +ret = reader.Read() +if ret != 1: + print("test8: failed to read the node") + sys.exit(1) +if reader.Name() != "a" or reader.IsEmptyElement() != 1: + print("test8: failed to analyze the node") + sys.exit(1) +ret = reader.Read() +if ret != 0: + print("test8: failed to detect the EOF") + sys.exit(1) + +# +# Another test provided by Stéphane Bidoul and checked with C# +# +def tst_reader(s): + f = str_io(s) + input = libxml2.inputBuffer(f) + reader = input.newTextReader("tst") + res = "" + while reader.Read(): + res=res + "%s (%s) [%s] %d %d\n" % (reader.NodeType(),reader.Name(), + reader.Value(), reader.IsEmptyElement(), + reader.Depth()) + if reader.NodeType() == 1: # Element + while reader.MoveToNextAttribute(): + res = res + "-- %s (%s) [%s] %d %d\n" % (reader.NodeType(), + reader.Name(),reader.Value(), + reader.IsEmptyElement(), reader.Depth()) + return res + +doc="""<a><b b1="b1"/><c>content of c</c></a>""" +expect="""1 (a) [None] 0 0 +1 (b) [None] 1 1 +-- 2 (b1) [b1] 0 2 +1 (c) [None] 0 1 +3 (#text) [content of c] 0 2 +15 (c) [None] 0 1 +15 (a) [None] 0 0 +""" +res = tst_reader(doc) +if res != expect: + print("test5 failed") + print(res) + sys.exit(1) + +doc="""<test><b/><c/></test>""" +expect="""1 (test) [None] 0 0 +1 (b) [None] 1 1 +1 (c) [None] 1 1 +15 (test) [None] 0 0 +""" +res = tst_reader(doc) +if res != expect: + print("test9 failed") + print(res) + sys.exit(1) + +doc="""<a><b>bbb</b><c>ccc</c></a>""" +expect="""1 (a) [None] 0 0 +1 (b) [None] 0 1 +3 (#text) [bbb] 0 2 +15 (b) [None] 0 1 +1 (c) [None] 0 1 +3 (#text) [ccc] 0 2 +15 (c) [None] 0 1 +15 (a) [None] 0 0 +""" +res = tst_reader(doc) +if res != expect: + print("test10 failed") + print(res) + sys.exit(1) + +doc="""<test a="a"/>""" +expect="""1 (test) [None] 1 0 +-- 2 (a) [a] 0 1 +""" +res = tst_reader(doc) +if res != expect: + print("test11 failed") + print(res) + sys.exit(1) + +doc="""<test><a>aaa</a><b/></test>""" +expect="""1 (test) [None] 0 0 +1 (a) [None] 0 1 +3 (#text) [aaa] 0 2 +15 (a) [None] 0 1 +1 (b) [None] 1 1 +15 (test) [None] 0 0 +""" +res = tst_reader(doc) +if res != expect: + print("test12 failed") + print(res) + sys.exit(1) + +doc="""<test><p></p></test>""" +expect="""1 (test) [None] 0 0 +1 (p) [None] 0 1 +15 (p) [None] 0 1 +15 (test) [None] 0 0 +""" +res = tst_reader(doc) +if res != expect: + print("test13 failed") + print(res) + sys.exit(1) + +doc="""<p></p>""" +expect="""1 (p) [None] 0 0 +15 (p) [None] 0 0 +""" +res = tst_reader(doc) +if res != expect: + print("test14 failed") + print(res) + sys.exit(1) + +# +# test from bug #108801 +# +doc="""<?xml version="1.0" standalone="no"?> +<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN" + "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd" [ +]> + +<article> +xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx +</article> +""" +expect="""10 (article) [None] 0 0 +1 (article) [None] 0 0 +3 (#text) [ +xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx +] 0 1 +15 (article) [None] 0 0 +""" +res = tst_reader(doc) +if res != expect: + print("test15 failed") + print(res) + sys.exit(1) + +# +# cleanup for memory allocation counting +# +del f +del input +del reader + +# Memory debug specific +libxml2.cleanupParser() +if libxml2.debugMemory(1) == 0: + print("OK") +else: + print("Memory leak %d bytes" % (libxml2.debugMemory(1))) + libxml2.dumpMemory() |