6c3776231b088a76e80375a16c5a4ac24b9434ce
[platform/upstream/libxml2.git] / python / tests / reader.py
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()