1#!/usr/bin/python -u
2import sys
3import libxml2
4
5# Memory debug specific
6libxml2.debugMemory(1)
7
8log = ""
9
10class callback:
11    def startDocument(self):
12        global log
13        log = log + "startDocument:"
14
15    def endDocument(self):
16        global log
17        log = log + "endDocument:"
18
19    def startElement(self, tag, attrs):
20        global log
21        log = log + "startElement %s %s:" % (tag, attrs)
22
23    def endElement(self, tag):
24        global log
25        log = log + "endElement %s:" % (tag)
26
27    def characters(self, data):
28        global log
29        log = log + "characters: %s:" % (data)
30
31    def warning(self, msg):
32        global log
33        log = log + "warning: %s:" % (msg)
34
35    def error(self, msg):
36        global log
37        log = log + "error: %s:" % (msg)
38
39    def fatalError(self, msg):
40        global log
41        log = log + "fatalError: %s:" % (msg)
42
43handler = callback()
44
45log=""
46chunk="""<foo><bar2/>"""
47ctxt = libxml2.createPushParser(handler, None, 0, "test.xml")
48ctxt.parseChunk(chunk, len(chunk), 0)
49ctxt=None
50
51reference = "startDocument:startElement foo None:startElement bar2 None:endElement bar2:"
52if log != reference:
53    print("Error got: %s" % log)
54    print("Exprected: %s" % reference)
55    sys.exit(1)
56
57log=""
58chunk="""<foo><bar2></bar2>"""
59ctxt = libxml2.createPushParser(handler, None, 0, "test.xml")
60ctxt.parseChunk(chunk, len(chunk), 0)
61ctxt=None
62
63reference = "startDocument:startElement foo None:startElement bar2 None:endElement bar2:"
64if log != reference:
65    print("Error got: %s" % log)
66    print("Exprected: %s" % reference)
67    sys.exit(1)
68
69log=""
70chunk="""<foo><bar2>"""
71ctxt = libxml2.createPushParser(handler, None, 0, "test.xml")
72ctxt.parseChunk(chunk, len(chunk), 0)
73ctxt=None
74
75reference = "startDocument:startElement foo None:startElement bar2 None:"
76if log != reference:
77    print("Error got: %s" % log)
78    print("Exprected: %s" % reference)
79    sys.exit(1)
80
81log=""
82chunk="""<foo><bar2 a="1" b='2' />"""
83ctxt = libxml2.createPushParser(handler, None, 0, "test.xml")
84ctxt.parseChunk(chunk, len(chunk), 0)
85ctxt=None
86
87reference = "startDocument:startElement foo None:startElement bar2 {'a': '1', 'b': '2'}:endElement bar2:"
88if log != reference:
89    print("Error got: %s" % log)
90    print("Exprected: %s" % reference)
91    sys.exit(1)
92
93log=""
94chunk="""<foo><bar2 a="1" b='2' >"""
95ctxt = libxml2.createPushParser(handler, None, 0, "test.xml")
96ctxt.parseChunk(chunk, len(chunk), 0)
97ctxt=None
98
99reference = "startDocument:startElement foo None:startElement bar2 {'a': '1', 'b': '2'}:"
100if log != reference:
101    print("Error got: %s" % log)
102    print("Exprected: %s" % reference)
103    sys.exit(1)
104
105log=""
106chunk="""<foo><bar2 a="1" b='2' ></bar2>"""
107ctxt = libxml2.createPushParser(handler, None, 0, "test.xml")
108ctxt.parseChunk(chunk, len(chunk), 0)
109ctxt=None
110
111reference = "startDocument:startElement foo None:startElement bar2 {'a': '1', 'b': '2'}:endElement bar2:"
112if log != reference:
113    print("Error got: %s" % log)
114    print("Exprected: %s" % reference)
115    sys.exit(1)
116
117log=""
118chunk="""<foo><bar2 a="b='1' />"""
119ctxt = libxml2.createPushParser(handler, None, 0, "test.xml")
120ctxt.parseChunk(chunk, len(chunk), 0)
121ctxt=None
122
123reference = "startDocument:startElement foo None:"
124if log != reference:
125    print("Error got: %s" % log)
126    print("Exprected: %s" % reference)
127    sys.exit(1)
128
129# Memory debug specific
130libxml2.cleanupParser()
131if libxml2.debugMemory(1) == 0:
132    print("OK")
133else:
134    print("Memory leak %d bytes" % (libxml2.debugMemory(1)))
135    libxml2.dumpMemory()
136