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
49
51 class TestElement(etree.ElementBase):
52 FIND_ME = "default element"
53 class TestComment(etree.CommentBase):
54 FIND_ME = "default comment"
55 class TestPI(etree.PIBase):
56 FIND_ME = "default pi"
57
58 parser = etree.XMLParser()
59
60 lookup = etree.ElementDefaultClassLookup(
61 element=TestElement, comment=TestComment, pi=TestPI)
62 parser.setElementClassLookup(lookup)
63
64 root = etree.XML("""<?xml version='1.0'?>
65 <root>
66 <?myPI?>
67 <!-- hi -->
68 </root>
69 """, parser)
70
71 self.assertEquals("default element", root.FIND_ME)
72 self.assertEquals("default pi", root[0].FIND_ME)
73 self.assertEquals("default comment", root[1].FIND_ME)
74
76 class TestElement(etree.ElementBase):
77 FIND_ME = "attribute_based"
78
79 class_dict = {"A1" : TestElement}
80
81 lookup = etree.AttributeBasedElementClassLookup(
82 "a1", class_dict)
83 etree.setElementClassLookup(lookup)
84
85 root = etree.XML(xml_str)
86 self.assertFalse(hasattr(root, 'FIND_ME'))
87 self.assertEquals(root[0].FIND_ME,
88 TestElement.FIND_ME)
89 self.assertFalse(hasattr(root[0][0], 'FIND_ME'))
90
92 class TestElement(etree.ElementBase):
93 FIND_ME = "custom"
94
95 class MyLookup(etree.CustomElementClassLookup):
96 def lookup(self, t, d, ns, name):
97 if name == 'c1':
98 return TestElement
99
100 etree.setElementClassLookup( MyLookup() )
101
102 root = etree.XML(xml_str)
103 self.assertFalse(hasattr(root, 'FIND_ME'))
104 self.assertEquals(root[0].FIND_ME,
105 TestElement.FIND_ME)
106 self.assertFalse(hasattr(root[0][1], 'FIND_ME'))
107
109 class TestElement1(etree.ElementBase):
110 FIND_ME = "custom"
111
112 class TestElement2(etree.ElementBase):
113 FIND_ME = "nsclasses"
114
115 class MyLookup(etree.CustomElementClassLookup):
116 def lookup(self, t, d, ns, name):
117 if name == 'c1':
118 return TestElement1
119
120 lookup = etree.ElementNamespaceClassLookup( MyLookup() )
121 etree.setElementClassLookup(lookup)
122
123 ns = lookup.get_namespace("otherNS")
124 ns[None] = TestElement2
125
126 root = etree.XML(xml_str)
127 self.assertFalse(hasattr(root, 'FIND_ME'))
128 self.assertEquals(root[0].FIND_ME,
129 TestElement1.FIND_ME)
130 self.assertFalse(hasattr(root[0][1], 'FIND_ME'))
131 self.assertEquals(root[0][-1].FIND_ME,
132 TestElement2.FIND_ME)
133
135 class TestElement(etree.ElementBase):
136 FIND_ME = "parser_based"
137
138 lookup = etree.ParserBasedElementClassLookup()
139 etree.setElementClassLookup(lookup)
140
141 class MyLookup(etree.CustomElementClassLookup):
142 def lookup(self, t, d, ns, name):
143 return TestElement
144
145 parser = etree.XMLParser()
146 parser.setElementClassLookup( MyLookup() )
147
148 root = etree.parse(StringIO(xml_str), parser).getroot()
149 self.assertEquals(root.FIND_ME,
150 TestElement.FIND_ME)
151 self.assertEquals(root[0].FIND_ME,
152 TestElement.FIND_ME)
153
154 root = etree.parse(StringIO(xml_str)).getroot()
155 self.assertFalse(hasattr(root, 'FIND_ME'))
156 self.assertFalse(hasattr(root[0], 'FIND_ME'))
157
158
160 suite = unittest.TestSuite()
161 suite.addTests([unittest.makeSuite(ClassLookupTestCase)])
162 return suite
163
164 if __name__ == '__main__':
165 print 'to test use test.py %s' % __file__
166