1
2
3 """
4 Test cases related to DTD parsing and validation
5 """
6
7 import unittest, sys, os.path
8
9 this_dir = os.path.dirname(__file__)
10 if this_dir not in sys.path:
11 sys.path.insert(0, this_dir)
12
13 from common_imports import etree, StringIO, BytesIO, _bytes, doctest
14 from common_imports import HelperTestCase, fileInTestDir, make_doctest, skipIf
19
27
32
39
55
60
66
71
76
88
101
105
118
119 @skipIf(etree.LIBXML_VERSION == (2, 9, 0),
120 "DTD loading is broken for incremental parsing in libxml2 2.9.0")
122 iterparse = etree.iterparse
123 iterator = iterparse(fileInTestDir("test.xml"), events=('start',),
124 attribute_defaults=True)
125 attributes = [ element.get("default")
126 for event, element in iterator ]
127 self.assertEqual(
128 ["valueA", "valueB"],
129 attributes)
130
131 @skipIf(etree.LIBXML_VERSION == (2, 9, 0),
132 "DTD loading is broken for incremental parsing in libxml2 2.9.0")
134 iterparse = etree.iterparse
135 iterator = iterparse(fileInTestDir("test.xml"), events=('end',),
136 attribute_defaults=True)
137 attributes = [ element.get("default")
138 for event, element in iterator ]
139 self.assertEqual(
140 ["valueB", "valueA"],
141 attributes)
142
144 dtd = etree.DTD(fileInTestDir("test.dtd"))
145
146
147 self.assertTrue(dtd.system_url.endswith("test.dtd"))
148
149
150 a = dtd.elements()[0]
151 self.assertEqual(a.name, "a")
152 self.assertEqual(a.type, "element")
153 self.assertEqual(a.content.name, "b")
154 self.assertEqual(a.content.type, "element")
155 self.assertEqual(a.content.occur, "once")
156
157 aattr = a.attributes()[0]
158 self.assertEqual(aattr.name, "default")
159 self.assertEqual(aattr.type, "enumeration")
160 self.assertEqual(aattr.values(), ["valueA", "valueB"])
161 self.assertEqual(aattr.default_value, "valueA")
162
163 b = dtd.elements()[1]
164 self.assertEqual(b.name, "b")
165 self.assertEqual(b.type, "empty")
166 self.assertEqual(b.content, None)
167
168
169 c = dtd.entities()[0]
170 self.assertEqual(c.name, "c")
171 self.assertEqual(c.orig, "*")
172 self.assertEqual(c.content, "*")
173
174
175 root = etree.XML(_bytes('''
176 <!DOCTYPE a SYSTEM "none" [
177 <!ELEMENT a EMPTY>
178 ]>
179 <a/>
180 '''))
181 dtd = etree.ElementTree(root).docinfo.internalDTD
182 self.assertEqual(dtd.name, "a")
183
184
185 parser = etree.XMLParser(dtd_validation=True)
186 xml = '<!DOCTYPE a SYSTEM "test.dtd"><a><b/></a>'
187 root = etree.fromstring(xml, parser=parser,
188 base_url=fileInTestDir("test.xml"))
189
190 dtd = root.getroottree().docinfo.internalDTD
191 self.assertEqual(dtd.name, "a")
192 self.assertEqual(dtd.system_url, "test.dtd")
193
196 suite = unittest.TestSuite()
197 suite.addTests([unittest.makeSuite(ETreeDtdTestCase)])
198 suite.addTests(
199 [make_doctest('../../../doc/validation.txt')])
200 return suite
201
202 if __name__ == '__main__':
203 print('to test use test.py %s' % __file__)
204