2002-12-15 02:00:35 +03:00
#!/usr/bin/python -u
2002-12-29 01:56:33 +03:00
#
# this tests the basic APIs of the XmlTextReader interface
#
2002-12-15 02:00:35 +03:00
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 )
2002-12-20 13:29:40 +03:00
reader = input . newTextReader ( " test1 " )
2002-12-29 00:14:18 +03:00
ret = reader . Read ( )
2002-12-15 02:00:35 +03:00
if ret != 1 :
print " Error reading to first element "
sys . exit ( 1 )
2002-12-29 00:14:18 +03:00
if reader . Name ( ) != " a " or reader . IsEmptyElement ( ) != 0 or \
reader . NodeType ( ) != 1 or reader . HasAttributes ( ) != 0 :
2002-12-15 02:00:35 +03:00
print " Error reading the first element "
sys . exit ( 1 )
2002-12-29 00:14:18 +03:00
ret = reader . Read ( )
2002-12-15 02:00:35 +03:00
if ret != 1 :
print " Error reading to second element "
sys . exit ( 1 )
2002-12-29 00:14:18 +03:00
if reader . Name ( ) != " b " or reader . IsEmptyElement ( ) != 1 or \
reader . NodeType ( ) != 1 or reader . HasAttributes ( ) != 1 :
2002-12-15 02:00:35 +03:00
print " Error reading the second element "
sys . exit ( 1 )
2002-12-29 00:14:18 +03:00
ret = reader . Read ( )
2002-12-15 02:00:35 +03:00
if ret != 1 :
print " Error reading to third element "
sys . exit ( 1 )
2002-12-29 00:14:18 +03:00
if reader . Name ( ) != " c " or reader . IsEmptyElement ( ) != 0 or \
reader . N odeType ( ) != 1 or reader . HasAttributes ( ) != 0 :
2002-12-15 02:00:35 +03:00
print " Error reading the third element "
sys . exit ( 1 )
2002-12-29 00:14:18 +03:00
ret = reader . Read ( )
2002-12-15 02:00:35 +03:00
if ret != 1 :
print " Error reading to text node "
sys . exit ( 1 )
2002-12-29 00:14:18 +03:00
if reader . Name ( ) != " #text " or reader . IsEmptyElement ( ) != 0 or \
reader . NodeType ( ) != 3 or reader . HasAttributes ( ) != 0 or \
reader . Value ( ) != " content of c " :
2002-12-15 02:00:35 +03:00
print " Error reading the text node "
sys . exit ( 1 )
2002-12-29 00:14:18 +03:00
ret = reader . Read ( )
2002-12-15 02:00:35 +03:00
if ret != 1 :
print " Error reading to end of third element "
sys . exit ( 1 )
2002-12-29 00:14:18 +03:00
if reader . Name ( ) != " c " or reader . IsEmptyElement ( ) != 0 or \
reader . NodeType ( ) != 15 or reader . HasAttributes ( ) != 0 :
2002-12-15 02:00:35 +03:00
print " Error reading the end of third element "
sys . exit ( 1 )
2002-12-29 00:14:18 +03:00
ret = reader . Read ( )
2002-12-15 02:00:35 +03:00
if ret != 1 :
print " Error reading to end of first element "
sys . exit ( 1 )
2002-12-29 00:14:18 +03:00
if reader . Name ( ) != " a " or reader . IsEmptyElement ( ) != 0 or \
reader . NodeType ( ) != 15 or reader . HasAttributes ( ) != 0 :
2002-12-15 02:00:35 +03:00
print " Error reading the end of first element "
sys . exit ( 1 )
2002-12-29 00:14:18 +03:00
ret = reader . Read ( )
2002-12-15 02:00:35 +03:00
if ret != 0 :
print " 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 )
2002-12-20 13:29:40 +03:00
reader = input . newTextReader ( " test2 " )
2002-12-15 02:00:35 +03:00
2002-12-29 00:14:18 +03:00
ret = reader . Read ( )
2002-12-15 02:00:35 +03:00
if ret != 1 :
print " Error reading test element "
sys . exit ( 1 )
2002-12-29 00:14:18 +03:00
if reader . GetAttributeNo ( 0 ) != " urn:datatypes " or \
reader . GetAttributeNo ( 1 ) != " int " or \
reader . GetAttributeNs ( " type " , " urn:datatypes " ) != " int " or \
reader . GetAttribute ( " dt:type " ) != " int " :
2002-12-15 02:00:35 +03:00
print " error reading test attributes "
sys . exit ( 1 )
2002-12-16 02:36:49 +03:00
#
# example from the XmlTextReader docs
#
f = StringIO . StringIO ( """ <root xmlns:a= " urn:456 " >
< item >
< ref href = " a:b " / >
< / item >
< / root > """ )
input = libxml2 . inputBuffer ( f )
2002-12-20 13:29:40 +03:00
reader = input . newTextReader ( " test3 " )
2002-12-16 02:36:49 +03:00
2002-12-29 00:14:18 +03:00
ret = reader . Read ( )
2002-12-16 02:36:49 +03:00
while ret == 1 :
2002-12-29 00:14:18 +03:00
if reader . Name ( ) == " ref " :
if reader . LookupNamespace ( " a " ) != " urn:456 " :
2002-12-16 02:36:49 +03:00
print " error resolving namespace prefix "
sys . exit ( 1 )
break
2002-12-29 00:14:18 +03:00
ret = reader . Read ( )
2002-12-16 02:36:49 +03:00
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 )
2002-12-20 13:29:40 +03:00
reader = input . newTextReader ( " test4 " )
2002-12-29 00:14:18 +03:00
ret = reader . Read ( )
2002-12-16 02:36:49 +03:00
if ret != 1 :
print " Error reading the testattr element "
sys . exit ( 1 )
#
# Attribute exploration by index
#
2002-12-29 00:14:18 +03:00
if reader . MoveToAttributeNo ( 0 ) != 1 :
2002-12-16 02:36:49 +03:00
print " Failed moveToAttribute(0) "
sys . exit ( 1 )
2002-12-29 00:14:18 +03:00
if reader . Value ( ) != " urn:1 " :
2002-12-16 02:36:49 +03:00
print " Failed to read attribute(0) "
sys . exit ( 1 )
2002-12-29 00:14:18 +03:00
if reader . Name ( ) != " xmlns " :
2002-12-16 02:36:49 +03:00
print " Failed to read attribute(0) name "
sys . exit ( 1 )
2002-12-29 00:14:18 +03:00
if reader . MoveToAttributeNo ( 1 ) != 1 :
2002-12-16 02:36:49 +03:00
print " Failed moveToAttribute(1) "
sys . exit ( 1 )
2002-12-29 00:14:18 +03:00
if reader . Value ( ) != " urn:2 " :
2002-12-16 02:36:49 +03:00
print " Failed to read attribute(1) "
sys . exit ( 1 )
2002-12-29 00:14:18 +03:00
if reader . Name ( ) != " xmlns:a " :
2002-12-16 02:36:49 +03:00
print " Failed to read attribute(1) name "
sys . exit ( 1 )
2002-12-29 00:14:18 +03:00
if reader . MoveToAttributeNo ( 2 ) != 1 :
2002-12-16 02:36:49 +03:00
print " Failed moveToAttribute(2) "
sys . exit ( 1 )
2002-12-29 00:14:18 +03:00
if reader . Value ( ) != " b " :
2002-12-16 02:36:49 +03:00
print " Failed to read attribute(2) "
sys . exit ( 1 )
2002-12-29 00:14:18 +03:00
if reader . Name ( ) != " b " :
2002-12-16 02:36:49 +03:00
print " Failed to read attribute(2) name "
sys . exit ( 1 )
2002-12-29 00:14:18 +03:00
if reader . MoveToAttributeNo ( 3 ) != 1 :
2002-12-16 02:36:49 +03:00
print " Failed moveToAttribute(3) "
sys . exit ( 1 )
2002-12-29 00:14:18 +03:00
if reader . Value ( ) != " a:b " :
2002-12-16 02:36:49 +03:00
print " Failed to read attribute(3) "
sys . exit ( 1 )
2002-12-29 00:14:18 +03:00
if reader . Name ( ) != " a:b " :
2002-12-16 02:36:49 +03:00
print " Failed to read attribute(3) name "
sys . exit ( 1 )
#
# Attribute exploration by name
#
2002-12-29 00:14:18 +03:00
if reader . MoveToAttribute ( " xmlns " ) != 1 :
2002-12-16 02:36:49 +03:00
print " Failed moveToAttribute( ' xmlns ' ) "
sys . exit ( 1 )
2002-12-29 00:14:18 +03:00
if reader . Value ( ) != " urn:1 " :
2002-12-16 02:36:49 +03:00
print " Failed to read attribute( ' xmlns ' ) "
sys . exit ( 1 )
2002-12-29 00:14:18 +03:00
if reader . MoveToAttribute ( " xmlns:a " ) != 1 :
2002-12-16 02:36:49 +03:00
print " Failed moveToAttribute( ' xmlns ' ) "
sys . exit ( 1 )
2002-12-29 00:14:18 +03:00
if reader . Value ( ) != " urn:2 " :
2002-12-16 02:36:49 +03:00
print " Failed to read attribute( ' xmlns:a ' ) "
sys . exit ( 1 )
2002-12-29 00:14:18 +03:00
if reader . MoveToAttribute ( " b " ) != 1 :
2002-12-16 02:36:49 +03:00
print " Failed moveToAttribute( ' b ' ) "
sys . exit ( 1 )
2002-12-29 00:14:18 +03:00
if reader . Value ( ) != " b " :
2002-12-16 02:36:49 +03:00
print " Failed to read attribute( ' b ' ) "
sys . exit ( 1 )
2002-12-29 00:14:18 +03:00
if reader . MoveToAttribute ( " a:b " ) != 1 :
2002-12-16 02:36:49 +03:00
print " Failed moveToAttribute( ' a:b ' ) "
sys . exit ( 1 )
2002-12-29 00:14:18 +03:00
if reader . Value ( ) != " a:b " :
2002-12-16 02:36:49 +03:00
print " Failed to read attribute( ' a:b ' ) "
sys . exit ( 1 )
2002-12-29 00:14:18 +03:00
if reader . MoveToAttributeNs ( " b " , " urn:2 " ) != 1 :
2002-12-16 02:36:49 +03:00
print " Failed moveToAttribute( ' b ' , ' urn:2 ' ) "
sys . exit ( 1 )
2002-12-29 00:14:18 +03:00
if reader . Value ( ) != " a:b " :
2002-12-16 02:36:49 +03:00
print " Failed to read attribute( ' b ' , ' urn:2 ' ) "
sys . exit ( 1 )
#
# Go back and read in sequence
#
2002-12-29 00:14:18 +03:00
if reader . MoveToElement ( ) != 1 :
2002-12-16 02:36:49 +03:00
print " Failed to move back to element "
sys . exit ( 1 )
2002-12-29 00:14:18 +03:00
if reader . MoveToFirstAttribute ( ) != 1 :
2002-12-16 02:36:49 +03:00
print " Failed to move to first attribute "
sys . exit ( 1 )
2002-12-29 00:14:18 +03:00
if reader . Value ( ) != " urn:1 " :
2002-12-16 02:36:49 +03:00
print " Failed to read attribute(0) "
sys . exit ( 1 )
2002-12-29 00:14:18 +03:00
if reader . Name ( ) != " xmlns " :
2002-12-16 02:36:49 +03:00
print " Failed to read attribute(0) name "
sys . exit ( 1 )
2002-12-29 00:14:18 +03:00
if reader . MoveToNextAttribute ( ) != 1 :
2002-12-16 02:36:49 +03:00
print " Failed to move to next attribute "
sys . exit ( 1 )
2002-12-29 00:14:18 +03:00
if reader . Value ( ) != " urn:2 " :
2002-12-16 02:36:49 +03:00
print " Failed to read attribute(1) "
sys . exit ( 1 )
2002-12-29 00:14:18 +03:00
if reader . Name ( ) != " xmlns:a " :
2002-12-16 02:36:49 +03:00
print " Failed to read attribute(1) name "
sys . exit ( 1 )
2002-12-29 00:14:18 +03:00
if reader . MoveToNextAttribute ( ) != 1 :
2002-12-16 02:36:49 +03:00
print " Failed to move to next attribute "
sys . exit ( 1 )
2002-12-29 00:14:18 +03:00
if reader . Value ( ) != " b " :
2002-12-16 02:36:49 +03:00
print " Failed to read attribute(2) "
sys . exit ( 1 )
2002-12-29 00:14:18 +03:00
if reader . Name ( ) != " b " :
2002-12-16 02:36:49 +03:00
print " Failed to read attribute(2) name "
sys . exit ( 1 )
2002-12-29 00:14:18 +03:00
if reader . MoveToNextAttribute ( ) != 1 :
2002-12-16 02:36:49 +03:00
print " Failed to move to next attribute "
sys . exit ( 1 )
2002-12-29 00:14:18 +03:00
if reader . Value ( ) != " a:b " :
2002-12-16 02:36:49 +03:00
print " Failed to read attribute(3) "
sys . exit ( 1 )
2002-12-29 00:14:18 +03:00
if reader . Name ( ) != " a:b " :
2002-12-16 02:36:49 +03:00
print " Failed to read attribute(3) name "
sys . exit ( 1 )
2002-12-29 00:14:18 +03:00
if reader . MoveToNextAttribute ( ) != 0 :
2002-12-16 02:36:49 +03:00
print " Failed to detect last attribute "
sys . exit ( 1 )
2002-12-29 14:14:41 +03:00
2002-12-30 13:55:29 +03:00
#
# 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 )
2002-12-29 14:14:41 +03:00
2002-12-30 14:42:17 +03:00
#
# 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 )
2002-12-30 15:37:59 +03:00
#
# 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 ( ) :
2002-12-30 21:40:42 +03:00
res = res + " %s ( %s ) [ %s ] %d %d \n " % ( reader . NodeType ( ) , reader . Name ( ) ,
reader . Value ( ) , reader . IsEmptyElement ( ) ,
reader . Depth ( ) )
2002-12-30 15:37:59 +03:00
if reader . NodeType ( ) == 1 : # Element
while reader . MoveToNextAttribute ( ) :
2003-01-01 18:11:05 +03:00
res = res + " -- %s ( %s ) [ %s ] %d %d \n " % ( reader . NodeType ( ) ,
reader . Name ( ) , reader . Value ( ) ,
reader . IsEmptyElement ( ) , reader . Depth ( ) )
2002-12-30 15:37:59 +03:00
return res
doc = """ <a><b b1= " b1 " /><c>content of c</c></a> """
2002-12-30 21:40:42 +03:00
expect = """ 1 (a) [None] 0 0
1 ( b ) [ None ] 1 1
2003-01-01 18:11:05 +03:00
- - 2 ( b1 ) [ b1 ] 0 2
2002-12-30 21:40:42 +03:00
1 ( c ) [ None ] 0 1
3 ( #text) [content of c] 0 2
15 ( c ) [ None ] 0 1
15 ( a ) [ None ] 0 0
2002-12-30 15:37:59 +03:00
"""
res = tst_reader ( doc )
if res != expect :
print " test5 failed "
print res
sys . exit ( 1 )
doc = """ <test><b/><c/></test> """
2002-12-30 21:40:42 +03:00
expect = """ 1 (test) [None] 0 0
1 ( b ) [ None ] 1 1
1 ( c ) [ None ] 1 1
15 ( test ) [ None ] 0 0
2002-12-30 15:37:59 +03:00
"""
res = tst_reader ( doc )
if res != expect :
2002-12-30 21:40:42 +03:00
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 "
2002-12-30 15:37:59 +03:00
print res
sys . exit ( 1 )
2002-12-30 14:42:17 +03:00
2003-01-01 18:11:05 +03:00
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 )
2003-01-02 17:16:45 +03:00
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 )
2002-12-30 14:42:17 +03:00
#
# cleanup for memory allocation counting
#
2002-12-15 02:00:35 +03:00
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 ( )