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