Merge branch 'tizen' into tizen_base
[platform/upstream/libxml2.git] / python / tests / reader6.py
1 #!/usr/bin/python -u
2 #
3 # this tests the entities substitutions with the XmlTextReader interface
4 #
5 import sys
6 import libxml2
7 try:
8     import StringIO
9     str_io = StringIO.StringIO
10 except:
11     import io
12     str_io = io.StringIO
13
14 schema="""<element name="foo" xmlns="http://relaxng.org/ns/structure/1.0"
15          datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
16   <oneOrMore>
17     <element name="label">
18       <text/>
19     </element>
20     <optional>
21       <element name="opt">
22         <empty/>
23       </element>
24     </optional>
25     <element name="item">
26       <data type="byte"/>
27     </element>
28   </oneOrMore>
29 </element>
30 """
31 # Memory debug specific
32 libxml2.debugMemory(1)
33
34 #
35 # Parse the Relax NG Schemas
36
37 rngp = libxml2.relaxNGNewMemParserCtxt(schema, len(schema))
38 rngs = rngp.relaxNGParse()
39 del rngp
40
41 #
42 # Parse and validate the correct document
43 #
44 docstr="""<foo>
45 <label>some text</label>
46 <item>100</item>
47 </foo>"""
48
49 f = str_io(docstr)
50 input = libxml2.inputBuffer(f)
51 reader = input.newTextReader("correct")
52 reader.RelaxNGSetSchema(rngs)
53 ret = reader.Read()
54 while ret == 1:
55     ret = reader.Read()
56
57 if ret != 0:
58     print("Error parsing the document")
59     sys.exit(1)
60
61 if reader.IsValid() != 1:
62     print("Document failed to validate")
63     sys.exit(1)
64
65 #
66 # Parse and validate the incorrect document
67 #
68 docstr="""<foo>
69 <label>some text</label>
70 <item>1000</item>
71 </foo>"""
72
73 err=""
74 # RNG errors are not as good as before , TODO
75 #expect="""RNG validity error: file error line 3 element text
76 #Type byte doesn't allow value '1000'
77 #RNG validity error: file error line 3 element text
78 #Error validating datatype byte
79 #RNG validity error: file error line 3 element text
80 #Element item failed to validate content
81 #"""
82 expect="""Type byte doesn't allow value '1000'
83 Error validating datatype byte
84 Element item failed to validate content
85 """
86
87 def callback(ctx, str):
88     global err
89     err = err + "%s" % (str)
90 libxml2.registerErrorHandler(callback, "")
91
92 f = str_io(docstr)
93 input = libxml2.inputBuffer(f)
94 reader = input.newTextReader("error")
95 reader.RelaxNGSetSchema(rngs)
96 ret = reader.Read()
97 while ret == 1:
98     ret = reader.Read()
99
100 if ret != 0:
101     print("Error parsing the document")
102     sys.exit(1)
103
104 if reader.IsValid() != 0:
105     print("Document failed to detect the validation error")
106     sys.exit(1)
107
108 if err != expect:
109     print("Did not get the expected error message:")
110     print(err)
111     sys.exit(1)
112
113 #
114 # cleanup
115 #
116 del f
117 del input
118 del reader
119 del rngs
120 libxml2.relaxNGCleanupTypes()
121
122 # Memory debug specific
123 libxml2.cleanupParser()
124 if libxml2.debugMemory(1) == 0:
125     print("OK")
126 else:
127     print("Memory leak %d bytes" % (libxml2.debugMemory(1)))
128     libxml2.dumpMemory()