Annotation of embedaddon/libxml2/python/tests/reader.py, revision 1.1
1.1 ! misho 1: #!/usr/bin/python -u
! 2: # -*- coding: ISO-8859-1 -*-
! 3: #
! 4: # this tests the basic APIs of the XmlTextReader interface
! 5: #
! 6: import libxml2
! 7: import StringIO
! 8: import sys
! 9:
! 10: # Memory debug specific
! 11: libxml2.debugMemory(1)
! 12:
! 13: f = StringIO.StringIO("""<a><b b1="b1"/><c>content of c</c></a>""")
! 14: input = libxml2.inputBuffer(f)
! 15: reader = input.newTextReader("test1")
! 16: ret = reader.Read()
! 17: if ret != 1:
! 18: print "test1: Error reading to first element"
! 19: sys.exit(1)
! 20: if reader.Name() != "a" or reader.IsEmptyElement() != 0 or \
! 21: reader.NodeType() != 1 or reader.HasAttributes() != 0:
! 22: print "test1: Error reading the first element"
! 23: sys.exit(1)
! 24: ret = reader.Read()
! 25: if ret != 1:
! 26: print "test1: Error reading to second element"
! 27: sys.exit(1)
! 28: if reader.Name() != "b" or reader.IsEmptyElement() != 1 or \
! 29: reader.NodeType() != 1 or reader.HasAttributes() != 1:
! 30: print "test1: Error reading the second element"
! 31: sys.exit(1)
! 32: ret = reader.Read()
! 33: if ret != 1:
! 34: print "test1: Error reading to third element"
! 35: sys.exit(1)
! 36: if reader.Name() != "c" or reader.IsEmptyElement() != 0 or \
! 37: reader.NodeType() != 1 or reader.HasAttributes() != 0:
! 38: print "test1: Error reading the third element"
! 39: sys.exit(1)
! 40: ret = reader.Read()
! 41: if ret != 1:
! 42: print "test1: Error reading to text node"
! 43: sys.exit(1)
! 44: if reader.Name() != "#text" or reader.IsEmptyElement() != 0 or \
! 45: reader.NodeType() != 3 or reader.HasAttributes() != 0 or \
! 46: reader.Value() != "content of c":
! 47: print "test1: Error reading the text node"
! 48: sys.exit(1)
! 49: ret = reader.Read()
! 50: if ret != 1:
! 51: print "test1: Error reading to end of third element"
! 52: sys.exit(1)
! 53: if reader.Name() != "c" or reader.IsEmptyElement() != 0 or \
! 54: reader.NodeType() != 15 or reader.HasAttributes() != 0:
! 55: print "test1: Error reading the end of third element"
! 56: sys.exit(1)
! 57: ret = reader.Read()
! 58: if ret != 1:
! 59: print "test1: Error reading to end of first element"
! 60: sys.exit(1)
! 61: if reader.Name() != "a" or reader.IsEmptyElement() != 0 or \
! 62: reader.NodeType() != 15 or reader.HasAttributes() != 0:
! 63: print "test1: Error reading the end of first element"
! 64: sys.exit(1)
! 65: ret = reader.Read()
! 66: if ret != 0:
! 67: print "test1: Error reading to end of document"
! 68: sys.exit(1)
! 69:
! 70: #
! 71: # example from the XmlTextReader docs
! 72: #
! 73: f = StringIO.StringIO("""<test xmlns:dt="urn:datatypes" dt:type="int"/>""")
! 74: input = libxml2.inputBuffer(f)
! 75: reader = input.newTextReader("test2")
! 76:
! 77: ret = reader.Read()
! 78: if ret != 1:
! 79: print "Error reading test element"
! 80: sys.exit(1)
! 81: if reader.GetAttributeNo(0) != "urn:datatypes" or \
! 82: reader.GetAttributeNo(1) != "int" or \
! 83: reader.GetAttributeNs("type", "urn:datatypes") != "int" or \
! 84: reader.GetAttribute("dt:type") != "int":
! 85: print "error reading test attributes"
! 86: sys.exit(1)
! 87:
! 88: #
! 89: # example from the XmlTextReader docs
! 90: #
! 91: f = StringIO.StringIO("""<root xmlns:a="urn:456">
! 92: <item>
! 93: <ref href="a:b"/>
! 94: </item>
! 95: </root>""")
! 96: input = libxml2.inputBuffer(f)
! 97: reader = input.newTextReader("test3")
! 98:
! 99: ret = reader.Read()
! 100: while ret == 1:
! 101: if reader.Name() == "ref":
! 102: if reader.LookupNamespace("a") != "urn:456":
! 103: print "error resolving namespace prefix"
! 104: sys.exit(1)
! 105: break
! 106: ret = reader.Read()
! 107: if ret != 1:
! 108: print "Error finding the ref element"
! 109: sys.exit(1)
! 110:
! 111: #
! 112: # Home made example for the various attribute access functions
! 113: #
! 114: f = StringIO.StringIO("""<testattr xmlns="urn:1" xmlns:a="urn:2" b="b" a:b="a:b"/>""")
! 115: input = libxml2.inputBuffer(f)
! 116: reader = input.newTextReader("test4")
! 117: ret = reader.Read()
! 118: if ret != 1:
! 119: print "Error reading the testattr element"
! 120: sys.exit(1)
! 121: #
! 122: # Attribute exploration by index
! 123: #
! 124: if reader.MoveToAttributeNo(0) != 1:
! 125: print "Failed moveToAttribute(0)"
! 126: sys.exit(1)
! 127: if reader.Value() != "urn:1":
! 128: print "Failed to read attribute(0)"
! 129: sys.exit(1)
! 130: if reader.Name() != "xmlns":
! 131: print "Failed to read attribute(0) name"
! 132: sys.exit(1)
! 133: if reader.MoveToAttributeNo(1) != 1:
! 134: print "Failed moveToAttribute(1)"
! 135: sys.exit(1)
! 136: if reader.Value() != "urn:2":
! 137: print "Failed to read attribute(1)"
! 138: sys.exit(1)
! 139: if reader.Name() != "xmlns:a":
! 140: print "Failed to read attribute(1) name"
! 141: sys.exit(1)
! 142: if reader.MoveToAttributeNo(2) != 1:
! 143: print "Failed moveToAttribute(2)"
! 144: sys.exit(1)
! 145: if reader.Value() != "b":
! 146: print "Failed to read attribute(2)"
! 147: sys.exit(1)
! 148: if reader.Name() != "b":
! 149: print "Failed to read attribute(2) name"
! 150: sys.exit(1)
! 151: if reader.MoveToAttributeNo(3) != 1:
! 152: print "Failed moveToAttribute(3)"
! 153: sys.exit(1)
! 154: if reader.Value() != "a:b":
! 155: print "Failed to read attribute(3)"
! 156: sys.exit(1)
! 157: if reader.Name() != "a:b":
! 158: print "Failed to read attribute(3) name"
! 159: sys.exit(1)
! 160: #
! 161: # Attribute exploration by name
! 162: #
! 163: if reader.MoveToAttribute("xmlns") != 1:
! 164: print "Failed moveToAttribute('xmlns')"
! 165: sys.exit(1)
! 166: if reader.Value() != "urn:1":
! 167: print "Failed to read attribute('xmlns')"
! 168: sys.exit(1)
! 169: if reader.MoveToAttribute("xmlns:a") != 1:
! 170: print "Failed moveToAttribute('xmlns')"
! 171: sys.exit(1)
! 172: if reader.Value() != "urn:2":
! 173: print "Failed to read attribute('xmlns:a')"
! 174: sys.exit(1)
! 175: if reader.MoveToAttribute("b") != 1:
! 176: print "Failed moveToAttribute('b')"
! 177: sys.exit(1)
! 178: if reader.Value() != "b":
! 179: print "Failed to read attribute('b')"
! 180: sys.exit(1)
! 181: if reader.MoveToAttribute("a:b") != 1:
! 182: print "Failed moveToAttribute('a:b')"
! 183: sys.exit(1)
! 184: if reader.Value() != "a:b":
! 185: print "Failed to read attribute('a:b')"
! 186: sys.exit(1)
! 187: if reader.MoveToAttributeNs("b", "urn:2") != 1:
! 188: print "Failed moveToAttribute('b', 'urn:2')"
! 189: sys.exit(1)
! 190: if reader.Value() != "a:b":
! 191: print "Failed to read attribute('b', 'urn:2')"
! 192: sys.exit(1)
! 193: #
! 194: # Go back and read in sequence
! 195: #
! 196: if reader.MoveToElement() != 1:
! 197: print "Failed to move back to element"
! 198: sys.exit(1)
! 199: if reader.MoveToFirstAttribute() != 1:
! 200: print "Failed to move to first attribute"
! 201: sys.exit(1)
! 202: if reader.Value() != "urn:1":
! 203: print "Failed to read attribute(0)"
! 204: sys.exit(1)
! 205: if reader.Name() != "xmlns":
! 206: print "Failed to read attribute(0) name"
! 207: sys.exit(1)
! 208: if reader.MoveToNextAttribute() != 1:
! 209: print "Failed to move to next attribute"
! 210: sys.exit(1)
! 211: if reader.Value() != "urn:2":
! 212: print "Failed to read attribute(1)"
! 213: sys.exit(1)
! 214: if reader.Name() != "xmlns:a":
! 215: print "Failed to read attribute(1) name"
! 216: sys.exit(1)
! 217: if reader.MoveToNextAttribute() != 1:
! 218: print "Failed to move to next attribute"
! 219: sys.exit(1)
! 220: if reader.Value() != "b":
! 221: print "Failed to read attribute(2)"
! 222: sys.exit(1)
! 223: if reader.Name() != "b":
! 224: print "Failed to read attribute(2) name"
! 225: sys.exit(1)
! 226: if reader.MoveToNextAttribute() != 1:
! 227: print "Failed to move to next attribute"
! 228: sys.exit(1)
! 229: if reader.Value() != "a:b":
! 230: print "Failed to read attribute(3)"
! 231: sys.exit(1)
! 232: if reader.Name() != "a:b":
! 233: print "Failed to read attribute(3) name"
! 234: sys.exit(1)
! 235: if reader.MoveToNextAttribute() != 0:
! 236: print "Failed to detect last attribute"
! 237: sys.exit(1)
! 238:
! 239:
! 240: #
! 241: # a couple of tests for namespace nodes
! 242: #
! 243: f = StringIO.StringIO("""<a xmlns="http://example.com/foo"/>""")
! 244: input = libxml2.inputBuffer(f)
! 245: reader = input.newTextReader("test6")
! 246: ret = reader.Read()
! 247: if ret != 1:
! 248: print "test6: failed to Read()"
! 249: sys.exit(1)
! 250: ret = reader.MoveToFirstAttribute()
! 251: if ret != 1:
! 252: print "test6: failed to MoveToFirstAttribute()"
! 253: sys.exit(1)
! 254: if reader.NamespaceUri() != "http://www.w3.org/2000/xmlns/" or \
! 255: reader.LocalName() != "xmlns" or reader.Name() != "xmlns" or \
! 256: reader.Value() != "http://example.com/foo" or reader.NodeType() != 2:
! 257: print "test6: failed to read the namespace node"
! 258: sys.exit(1)
! 259:
! 260: f = StringIO.StringIO("""<a xmlns:prefix="http://example.com/foo"/>""")
! 261: input = libxml2.inputBuffer(f)
! 262: reader = input.newTextReader("test7")
! 263: ret = reader.Read()
! 264: if ret != 1:
! 265: print "test7: failed to Read()"
! 266: sys.exit(1)
! 267: ret = reader.MoveToFirstAttribute()
! 268: if ret != 1:
! 269: print "test7: failed to MoveToFirstAttribute()"
! 270: sys.exit(1)
! 271: if reader.NamespaceUri() != "http://www.w3.org/2000/xmlns/" or \
! 272: reader.LocalName() != "prefix" or reader.Name() != "xmlns:prefix" or \
! 273: reader.Value() != "http://example.com/foo" or reader.NodeType() != 2:
! 274: print "test7: failed to read the namespace node"
! 275: sys.exit(1)
! 276:
! 277: #
! 278: # Test for a limit case:
! 279: #
! 280: f = StringIO.StringIO("""<a/>""")
! 281: input = libxml2.inputBuffer(f)
! 282: reader = input.newTextReader("test8")
! 283: ret = reader.Read()
! 284: if ret != 1:
! 285: print "test8: failed to read the node"
! 286: sys.exit(1)
! 287: if reader.Name() != "a" or reader.IsEmptyElement() != 1:
! 288: print "test8: failed to analyze the node"
! 289: sys.exit(1)
! 290: ret = reader.Read()
! 291: if ret != 0:
! 292: print "test8: failed to detect the EOF"
! 293: sys.exit(1)
! 294:
! 295: #
! 296: # Another test provided by Stéphane Bidoul and checked with C#
! 297: #
! 298: def tst_reader(s):
! 299: f = StringIO.StringIO(s)
! 300: input = libxml2.inputBuffer(f)
! 301: reader = input.newTextReader("tst")
! 302: res = ""
! 303: while reader.Read():
! 304: res=res + "%s (%s) [%s] %d %d\n" % (reader.NodeType(),reader.Name(),
! 305: reader.Value(), reader.IsEmptyElement(),
! 306: reader.Depth())
! 307: if reader.NodeType() == 1: # Element
! 308: while reader.MoveToNextAttribute():
! 309: res = res + "-- %s (%s) [%s] %d %d\n" % (reader.NodeType(),
! 310: reader.Name(),reader.Value(),
! 311: reader.IsEmptyElement(), reader.Depth())
! 312: return res
! 313:
! 314: doc="""<a><b b1="b1"/><c>content of c</c></a>"""
! 315: expect="""1 (a) [None] 0 0
! 316: 1 (b) [None] 1 1
! 317: -- 2 (b1) [b1] 0 2
! 318: 1 (c) [None] 0 1
! 319: 3 (#text) [content of c] 0 2
! 320: 15 (c) [None] 0 1
! 321: 15 (a) [None] 0 0
! 322: """
! 323: res = tst_reader(doc)
! 324: if res != expect:
! 325: print "test5 failed"
! 326: print res
! 327: sys.exit(1)
! 328:
! 329: doc="""<test><b/><c/></test>"""
! 330: expect="""1 (test) [None] 0 0
! 331: 1 (b) [None] 1 1
! 332: 1 (c) [None] 1 1
! 333: 15 (test) [None] 0 0
! 334: """
! 335: res = tst_reader(doc)
! 336: if res != expect:
! 337: print "test9 failed"
! 338: print res
! 339: sys.exit(1)
! 340:
! 341: doc="""<a><b>bbb</b><c>ccc</c></a>"""
! 342: expect="""1 (a) [None] 0 0
! 343: 1 (b) [None] 0 1
! 344: 3 (#text) [bbb] 0 2
! 345: 15 (b) [None] 0 1
! 346: 1 (c) [None] 0 1
! 347: 3 (#text) [ccc] 0 2
! 348: 15 (c) [None] 0 1
! 349: 15 (a) [None] 0 0
! 350: """
! 351: res = tst_reader(doc)
! 352: if res != expect:
! 353: print "test10 failed"
! 354: print res
! 355: sys.exit(1)
! 356:
! 357: doc="""<test a="a"/>"""
! 358: expect="""1 (test) [None] 1 0
! 359: -- 2 (a) [a] 0 1
! 360: """
! 361: res = tst_reader(doc)
! 362: if res != expect:
! 363: print "test11 failed"
! 364: print res
! 365: sys.exit(1)
! 366:
! 367: doc="""<test><a>aaa</a><b/></test>"""
! 368: expect="""1 (test) [None] 0 0
! 369: 1 (a) [None] 0 1
! 370: 3 (#text) [aaa] 0 2
! 371: 15 (a) [None] 0 1
! 372: 1 (b) [None] 1 1
! 373: 15 (test) [None] 0 0
! 374: """
! 375: res = tst_reader(doc)
! 376: if res != expect:
! 377: print "test12 failed"
! 378: print res
! 379: sys.exit(1)
! 380:
! 381: doc="""<test><p></p></test>"""
! 382: expect="""1 (test) [None] 0 0
! 383: 1 (p) [None] 0 1
! 384: 15 (p) [None] 0 1
! 385: 15 (test) [None] 0 0
! 386: """
! 387: res = tst_reader(doc)
! 388: if res != expect:
! 389: print "test13 failed"
! 390: print res
! 391: sys.exit(1)
! 392:
! 393: doc="""<p></p>"""
! 394: expect="""1 (p) [None] 0 0
! 395: 15 (p) [None] 0 0
! 396: """
! 397: res = tst_reader(doc)
! 398: if res != expect:
! 399: print "test14 failed"
! 400: print res
! 401: sys.exit(1)
! 402:
! 403: #
! 404: # test from bug #108801
! 405: #
! 406: doc="""<?xml version="1.0" standalone="no"?>
! 407: <!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN"
! 408: "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd" [
! 409: ]>
! 410:
! 411: <article>
! 412: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
! 413: </article>
! 414: """
! 415: expect="""10 (article) [None] 0 0
! 416: 1 (article) [None] 0 0
! 417: 3 (#text) [
! 418: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
! 419: ] 0 1
! 420: 15 (article) [None] 0 0
! 421: """
! 422: res = tst_reader(doc)
! 423: if res != expect:
! 424: print "test15 failed"
! 425: print res
! 426: sys.exit(1)
! 427:
! 428: #
! 429: # cleanup for memory allocation counting
! 430: #
! 431: del f
! 432: del input
! 433: del reader
! 434:
! 435: # Memory debug specific
! 436: libxml2.cleanupParser()
! 437: if libxml2.debugMemory(1) == 0:
! 438: print "OK"
! 439: else:
! 440: print "Memory leak %d bytes" % (libxml2.debugMemory(1))
! 441: libxml2.dumpMemory()
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>