#!/usr/bin/python -u
#
# this tests the entities substitutions with the XmlTextReader interface
#
import sys
import libxml2

# Memory debug specific
libxml2.debugMemory(1)

result = ""
def processNode(reader):
    global result

    result = result + "%d %d %s %d\n" % (reader.Depth(), reader.NodeType(),
			   reader.Name(), reader.IsEmptyElement())

#
# Parse a document testing the readerForxxx API
#
docstr="""<foo>
<label>some text</label>
<item>100</item>
</foo>"""
expect="""0 1 foo 0
1 14 #text 0
1 1 label 0
2 3 #text 0
1 15 label 0
1 14 #text 0
1 1 item 0
2 3 #text 0
1 15 item 0
1 14 #text 0
0 15 foo 0
"""
result = ""

doc = libxml2.parseDoc(docstr)
reader = doc.readerWalker();
ret = reader.Read()
while ret == 1:
    processNode(reader)
    ret = reader.Read()

if ret != 0:
    print("Error parsing the document test1")
    sys.exit(1)

if result != expect:
    print("Unexpected result for test1")
    print(result)
    sys.exit(1)

doc.freeDoc()

#
# Reuse the reader for another document testing the ReaderNewWalker API
#
docstr="""<foo>
<label>some text</label>
<item>1000</item>
</foo>"""
expect="""0 1 foo 0
1 14 #text 0
1 1 label 0
2 3 #text 0
1 15 label 0
1 14 #text 0
1 1 item 0
2 3 #text 0
1 15 item 0
1 14 #text 0
0 15 foo 0
"""
result = ""

doc = libxml2.parseDoc(docstr)
reader.NewWalker(doc)

ret = reader.Read()
while ret == 1:
    processNode(reader)
    ret = reader.Read()

if ret != 0:
    print("Error parsing the document test2")
    sys.exit(1)

if result != expect:
    print("Unexpected result for test2")
    print(result)
    sys.exit(1)

doc.freeDoc()

#
# Reuse the reader for another document testing the ReaderNewxxx API
#
docstr="""<foo>
<label>some text</label>
<item>1000</item>
</foo>"""
expect="""0 1 foo 0
1 14 #text 0
1 1 label 0
2 3 #text 0
1 15 label 0
1 14 #text 0
1 1 item 0
2 3 #text 0
1 15 item 0
1 14 #text 0
0 15 foo 0
"""
result = ""

reader.NewDoc(docstr, "test3", None, 0)
ret = reader.Read()
while ret == 1:
    processNode(reader)
    ret = reader.Read()

if ret != 0:
    print("Error parsing the document test3")
    sys.exit(1)

if result != expect:
    print("Unexpected result for test3")
    print(result)
    sys.exit(1)

#
# cleanup
#
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()
