1
2
3 """
4 Tests specific to the extended etree API
5
6 Tests that apply to the general ElementTree API should go into
7 test_elementtree
8 """
9
10
11 import unittest, doctest, operator
12
13 from common_imports import etree, StringIO, HelperTestCase, fileInTestDir
14 from common_imports import SillyFileLike, canonicalize
15
16 xml_str = '''\
17 <root xmlns="myNS" xmlns:other="otherNS">
18 <c1 a1="A1" a2="A2" other:a3="A3">
19 <c2 a1="C2">0</c2>
20 <c2>1</c2>
21 <other:c2>2</other:c2>
22 </c1>
23 </root>'''
24
26 """Test cases for lxml.elementlib.classlookup
27 """
28 etree = etree
29
34
36 class TestElement(etree.ElementBase):
37 FIND_ME = "namespace class"
38
39 ns = etree.Namespace("myNS")
40 ns[None] = TestElement
41
42 lookup = etree.ElementNamespaceClassLookup()
43 etree.setElementClassLookup(lookup)
44
45 root = etree.XML(xml_str)
46 self.assertEquals(root.FIND_ME,
47 TestElement.FIND_ME)
48 self.assertEquals(root[0].FIND_ME,
49 TestElement.FIND_ME)
50 self.assertFalse(hasattr(root[0][-1], 'FIND_ME'))
51
53 class TestElement(etree.ElementBase):
54 FIND_ME = "default element"
55 class TestComment(etree.CommentBase):
56 FIND_ME = "default comment"
57 class TestPI(etree.PIBase):
58 FIND_ME = "default pi"
59
60 parser = etree.XMLParser()
61
62 lookup = etree.ElementDefaultClassLookup(
63 element=TestElement, comment=TestComment, pi=TestPI)
64 parser.setElementClassLookup(lookup)
65
66 root = etree.XML("""<?xml version='1.0'?>
67 <root>
68 <?myPI?>
69 <!-- hi -->
70 </root>
71 """, parser)
72
73 self.assertEquals("default element", root.FIND_ME)
74 self.assertEquals("default pi", root[0].FIND_ME)
75 self.assertEquals("default comment", root[1].FIND_ME)
76
78 class TestElement(etree.ElementBase):
79 FIND_ME = "namespace class"
80
81 ns = etree.Namespace("myNS")
82 ns[None] = TestElement
83
84 lookup = etree.ElementDefaultClassLookup()
85 etree.setElementClassLookup(lookup)
86
87 root = etree.XML(xml_str)
88 self.assertFalse(hasattr(root, 'FIND_ME'))
89 self.assertFalse(hasattr(root[0][-1], 'FIND_ME'))
90
92 class TestElement(etree.ElementBase):
93 FIND_ME = "attribute_based"
94
95 class_dict = {"A1" : TestElement}
96
97 lookup = etree.AttributeBasedElementClassLookup(
98 "a1", class_dict)
99 etree.setElementClassLookup(lookup)
100
101 root = etree.XML(xml_str)
102 self.assertFalse(hasattr(root, 'FIND_ME'))
103 self.assertEquals(root[0].FIND_ME,
104 TestElement.FIND_ME)
105 self.assertFalse(hasattr(root[0][0], 'FIND_ME'))
106
108 class TestElement(etree.ElementBase):
109 FIND_ME = "custom"
110
111 class MyLookup(etree.CustomElementClassLookup):
112 def lookup(self, t, d, ns, name):
113 if name == 'c1':
114 return TestElement
115
116 etree.setElementClassLookup( MyLookup() )
117
118 root = etree.XML(xml_str)
119 self.assertFalse(hasattr(root, 'FIND_ME'))
120 self.assertEquals(root[0].FIND_ME,
121 TestElement.FIND_ME)
122 self.assertFalse(hasattr(root[0][1], 'FIND_ME'))
123
125 class TestElement1(etree.ElementBase):
126 FIND_ME = "custom"
127
128 class TestElement2(etree.ElementBase):
129 FIND_ME = "nsclasses"
130
131 class MyLookup(etree.CustomElementClassLookup):
132 def lookup(self, t, d, ns, name):
133 if name == 'c1':
134 return TestElement1
135
136 ns = etree.Namespace("otherNS")
137 ns[None] = TestElement2
138
139 lookup = etree.ElementNamespaceClassLookup( MyLookup() )
140 etree.setElementClassLookup(lookup)
141
142 root = etree.XML(xml_str)
143 self.assertFalse(hasattr(root, 'FIND_ME'))
144 self.assertEquals(root[0].FIND_ME,
145 TestElement1.FIND_ME)
146 self.assertFalse(hasattr(root[0][1], 'FIND_ME'))
147 self.assertEquals(root[0][-1].FIND_ME,
148 TestElement2.FIND_ME)
149
151 class TestElement(etree.ElementBase):
152 FIND_ME = "parser_based"
153
154 lookup = etree.ParserBasedElementClassLookup()
155 etree.setElementClassLookup(lookup)
156
157 class MyLookup(etree.CustomElementClassLookup):
158 def lookup(self, t, d, ns, name):
159 return TestElement
160
161 parser = etree.XMLParser()
162 parser.setElementClassLookup( MyLookup() )
163
164 root = etree.parse(StringIO(xml_str), parser).getroot()
165 self.assertEquals(root.FIND_ME,
166 TestElement.FIND_ME)
167 self.assertEquals(root[0].FIND_ME,
168 TestElement.FIND_ME)
169
170 root = etree.parse(StringIO(xml_str)).getroot()
171 self.assertFalse(hasattr(root, 'FIND_ME'))
172 self.assertFalse(hasattr(root[0], 'FIND_ME'))
173
174
176 suite = unittest.TestSuite()
177 suite.addTests([unittest.makeSuite(ClassLookupTestCase)])
178 return suite
179
180 if __name__ == '__main__':
181 unittest.main()
182