1
2
3 """
4 Test cases related to RelaxNG parsing and validation
5 """
6
7 import unittest
8
9 from common_imports import etree, doctest, HelperTestCase, fileInTestDir
10
13 tree_valid = self.parse('<a><b></b></a>')
14 tree_invalid = self.parse('<a><c></c></a>')
15 schema = self.parse('''\
16 <element name="a" xmlns="http://relaxng.org/ns/structure/1.0">
17 <zeroOrMore>
18 <element name="b">
19 <text />
20 </element>
21 </zeroOrMore>
22 </element>
23 ''')
24 schema = etree.RelaxNG(schema)
25 self.assert_(schema.validate(tree_valid))
26 self.assert_(not schema.validate(tree_invalid))
27
30
32 tree_invalid = self.parse('<a><c></c></a>')
33 schema = self.parse('''\
34 <element name="a" xmlns="http://relaxng.org/ns/structure/1.0">
35 <zeroOrMore>
36 <element name="b">
37 <text />
38 </element>
39 </zeroOrMore>
40 </element>
41 ''')
42 schema = etree.RelaxNG(schema)
43 self.assert_(not schema.validate(tree_invalid))
44 errors = schema.error_log
45 self.assert_([ log for log in errors
46 if log.level_name == "ERROR" ])
47 self.assert_([ log for log in errors
48 if "not expect" in log.message ])
49
51 schema = self.parse('''\
52 <element name="a" xmlns="http://relaxng.org/ns/structure/1.0">
53 <zeroOrMore>
54 <element name="b" />
55 </zeroOrMore>
56 </element>
57 ''')
58 self.assertRaises(etree.RelaxNGParseError,
59 etree.RelaxNG, schema)
60
62 schema = self.parse('''\
63 <grammar xmlns="http://relaxng.org/ns/structure/1.0" />
64 ''')
65 self.assertRaises(etree.RelaxNGParseError,
66 etree.RelaxNG, schema)
67
69 schema = self.parse('''\
70 <grammar xmlns="http://relaxng.org/ns/structure/1.0">
71 <define name="test">
72 <element name="test"/>
73 </define>
74 </grammar>
75 ''')
76 self.assertRaises(etree.RelaxNGParseError,
77 etree.RelaxNG, schema)
78
80
81 schema = self.parse('''\
82 <element name="a" xmlns="mynamespace" />
83 ''')
84 self.assertRaises(etree.RelaxNGParseError,
85 etree.RelaxNG, schema)
86
92
94 tree_valid = self.parse('<a><b></b></a>')
95 tree_invalid = self.parse('<a><c></c></a>')
96 schema = self.parse('''\
97 <element name="a" xmlns="http://relaxng.org/ns/structure/1.0">
98 <zeroOrMore>
99 <element name="b">
100 <text />
101 </element>
102 </zeroOrMore>
103 </element>
104 ''')
105 self.assert_(tree_valid.relaxng(schema))
106 self.assert_(not tree_invalid.relaxng(schema))
107
109 tree = self.parse('<a><b>B</b><c>C</c></a>')
110 schema = etree.RelaxNG( self.parse('''\
111 <element name="a" xmlns="http://relaxng.org/ns/structure/1.0">
112 <element name="b">
113 <text />
114 </element>
115 <element name="c">
116 <text />
117 </element>
118 </element>
119 ''') )
120 self.assert_(schema.validate(tree))
121 self.assert_(schema.validate(tree))
122
123 schema = etree.RelaxNG( self.parse('''\
124 <element name="b" xmlns="http://relaxng.org/ns/structure/1.0">
125 <text />
126 </element>
127 ''') )
128 c_tree = etree.ElementTree(tree.getroot()[1])
129 self.assertEqual(self._rootstring(c_tree), '<c>C</c>')
130 self.assert_(not schema.validate(c_tree))
131
132 b_tree = etree.ElementTree(tree.getroot()[0])
133 self.assertEqual(self._rootstring(b_tree), '<b>B</b>')
134 self.assert_(schema.validate(b_tree))
135
136
138 suite = unittest.TestSuite()
139 suite.addTests([unittest.makeSuite(ETreeRelaxNGTestCase)])
140 suite.addTests(
141 [doctest.DocFileSuite('../../../doc/validation.txt')])
142 return suite
143
144 if __name__ == '__main__':
145 unittest.main()
146