1
0
mirror of https://gitlab.gnome.org/GNOME/libxml2.git synced 2025-07-25 02:02:11 +03:00
Files
libxml2/python/tests/reader.py
Daniel Veillard 067bae5ff8 seriously changed the way data are pushed to the underlying parser, go by
* xmlreader.c: seriously changed the way data are pushed to
  the underlying parser, go by block of 512 bytes instead of
  tryng to detect tag boundaries at that level. Changed the
  way empty element are detected and tagged.
* python/tests/reader.py python/tests/reader2.py
  python/tests/reader3.py: small changes mostly due to context
  reporting being different and DTD node being reported. Some
  errors previously undetected are now caught and fixed.
* doc/xmlreader.html: flagged last section as TODO
Daniel
2003-01-05 01:27:54 +00:00

416 lines
11 KiB
Python
Executable File
Raw Blame History

#!/usr/bin/python -u
#
# this tests the basic APIs of the XmlTextReader interface
#
import libxml2
import StringIO
import sys
# Memory debug specific
libxml2.debugMemory(1)
f = StringIO.StringIO("""<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 = StringIO.StringIO("""<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 = StringIO.StringIO("""<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 = StringIO.StringIO("""<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 = StringIO.StringIO("""<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 = StringIO.StringIO("""<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 = StringIO.StringIO("""<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<53>phane Bidoul and checked with C#
#
def tst_reader(s):
f = StringIO.StringIO(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)
#
# 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()