make file closing more robust
[python/dscho.git] / Lib / test / test_xml_etree_c.py
blob71973ed234793f6a20a1b7ac862ee9742bd06414
1 # xml.etree test for cElementTree
3 import doctest
4 import sys
6 from test import support
8 ET = support.import_module('xml.etree.cElementTree')
10 SAMPLE_XML = """
11 <body>
12 <tag>text</tag>
13 <tag />
14 <section>
15 <tag>subtext</tag>
16 </section>
17 </body>
18 """
20 SAMPLE_XML_NS = """
21 <body xmlns="http://effbot.org/ns">
22 <tag>text</tag>
23 <tag />
24 <section>
25 <tag>subtext</tag>
26 </section>
27 </body>
28 """
30 def sanity():
31 """
32 Import sanity.
34 >>> from xml.etree import cElementTree
35 """
37 def check_method(method):
38 if not hasattr(method, '__call__'):
39 print(method, "not callable")
41 def serialize(ET, elem):
42 import io
43 file = io.StringIO()
44 tree = ET.ElementTree(elem)
45 tree.write(file)
46 return file.getvalue()
48 def summarize(elem):
49 return elem.tag
51 def summarize_list(seq):
52 return list(map(summarize, seq))
54 def interface():
55 """
56 Test element tree interface.
58 >>> element = ET.Element("tag", key="value")
59 >>> tree = ET.ElementTree(element)
61 Make sure all standard element methods exist.
63 >>> check_method(element.append)
64 >>> check_method(element.insert)
65 >>> check_method(element.remove)
66 >>> check_method(element.getchildren)
67 >>> check_method(element.find)
68 >>> check_method(element.findall)
69 >>> check_method(element.findtext)
70 >>> check_method(element.clear)
71 >>> check_method(element.get)
72 >>> check_method(element.set)
73 >>> check_method(element.keys)
74 >>> check_method(element.items)
75 >>> check_method(element.getiterator)
77 Basic method sanity checks.
79 >>> serialize(ET, element) # 1
80 '<tag key="value" />'
81 >>> subelement = ET.Element("subtag")
82 >>> element.append(subelement)
83 >>> serialize(ET, element) # 2
84 '<tag key="value"><subtag /></tag>'
85 >>> element.insert(0, subelement)
86 >>> serialize(ET, element) # 3
87 '<tag key="value"><subtag /><subtag /></tag>'
88 >>> element.remove(subelement)
89 >>> serialize(ET, element) # 4
90 '<tag key="value"><subtag /></tag>'
91 >>> element.remove(subelement)
92 >>> serialize(ET, element) # 5
93 '<tag key="value" />'
94 >>> element.remove(subelement)
95 Traceback (most recent call last):
96 ValueError: list.remove(x): x not in list
97 >>> serialize(ET, element) # 6
98 '<tag key="value" />'
99 """
101 def find():
103 Test find methods (including xpath syntax).
105 >>> elem = ET.XML(SAMPLE_XML)
106 >>> elem.find("tag").tag
107 'tag'
108 >>> ET.ElementTree(elem).find("tag").tag
109 'tag'
110 >>> elem.find("section/tag").tag
111 'tag'
112 >>> ET.ElementTree(elem).find("section/tag").tag
113 'tag'
114 >>> elem.findtext("tag")
115 'text'
116 >>> elem.findtext("tog")
117 >>> elem.findtext("tog", "default")
118 'default'
119 >>> ET.ElementTree(elem).findtext("tag")
120 'text'
121 >>> elem.findtext("section/tag")
122 'subtext'
123 >>> ET.ElementTree(elem).findtext("section/tag")
124 'subtext'
125 >>> summarize_list(elem.findall("tag"))
126 ['tag', 'tag']
127 >>> summarize_list(elem.findall("*"))
128 ['tag', 'tag', 'section']
129 >>> summarize_list(elem.findall(".//tag"))
130 ['tag', 'tag', 'tag']
131 >>> summarize_list(elem.findall("section/tag"))
132 ['tag']
133 >>> summarize_list(elem.findall("section//tag"))
134 ['tag']
135 >>> summarize_list(elem.findall("section/*"))
136 ['tag']
137 >>> summarize_list(elem.findall("section//*"))
138 ['tag']
139 >>> summarize_list(elem.findall("section/.//*"))
140 ['tag']
141 >>> summarize_list(elem.findall("*/*"))
142 ['tag']
143 >>> summarize_list(elem.findall("*//*"))
144 ['tag']
145 >>> summarize_list(elem.findall("*/tag"))
146 ['tag']
147 >>> summarize_list(elem.findall("*/./tag"))
148 ['tag']
149 >>> summarize_list(elem.findall("./tag"))
150 ['tag', 'tag']
151 >>> summarize_list(elem.findall(".//tag"))
152 ['tag', 'tag', 'tag']
153 >>> summarize_list(elem.findall("././tag"))
154 ['tag', 'tag']
155 >>> summarize_list(ET.ElementTree(elem).findall("/tag"))
156 ['tag', 'tag']
157 >>> summarize_list(ET.ElementTree(elem).findall("./tag"))
158 ['tag', 'tag']
159 >>> elem = ET.XML(SAMPLE_XML_NS)
160 >>> summarize_list(elem.findall("tag"))
162 >>> summarize_list(elem.findall("{http://effbot.org/ns}tag"))
163 ['{http://effbot.org/ns}tag', '{http://effbot.org/ns}tag']
164 >>> summarize_list(elem.findall(".//{http://effbot.org/ns}tag"))
165 ['{http://effbot.org/ns}tag', '{http://effbot.org/ns}tag', '{http://effbot.org/ns}tag']
168 def parseliteral():
169 r"""
171 >>> element = ET.XML("<html><body>text</body></html>")
172 >>> ET.ElementTree(element).write(sys.stdout)
173 <html><body>text</body></html>
174 >>> element = ET.fromstring("<html><body>text</body></html>")
175 >>> ET.ElementTree(element).write(sys.stdout)
176 <html><body>text</body></html>
177 >>> print(ET.tostring(element))
178 <html><body>text</body></html>
179 >>> print(repr(ET.tostring(element, "ascii")))
180 b"<?xml version='1.0' encoding='ascii'?>\n<html><body>text</body></html>"
181 >>> _, ids = ET.XMLID("<html><body>text</body></html>")
182 >>> len(ids)
184 >>> _, ids = ET.XMLID("<html><body id='body'>text</body></html>")
185 >>> len(ids)
187 >>> ids["body"].tag
188 'body'
191 def check_encoding(encoding):
193 >>> check_encoding("ascii")
194 >>> check_encoding("us-ascii")
195 >>> check_encoding("iso-8859-1")
196 >>> check_encoding("iso-8859-15")
197 >>> check_encoding("cp437")
198 >>> check_encoding("mac-roman")
200 ET.XML(
201 "<?xml version='1.0' encoding='%s'?><xml />" % encoding
204 def bug_1534630():
206 >>> bob = ET.TreeBuilder()
207 >>> e = bob.data("data")
208 >>> e = bob.start("tag", {})
209 >>> e = bob.end("tag")
210 >>> e = bob.close()
211 >>> serialize(ET, e)
212 '<tag />'
215 def test_main():
216 from test import test_xml_etree_c
217 support.run_doctest(test_xml_etree_c, verbosity=True)
219 if __name__ == '__main__':
220 test_main()