| 
									
										
										
										
											2005-12-14 18:10:45 +00:00
										 |  |  | # xmlcore.etree test.  This file contains enough tests to make sure that | 
					
						
							|  |  |  | # all included components work as they should.  For a more extensive | 
					
						
							|  |  |  | # test suite, see the selftest script in the ElementTree distribution. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import doctest, sys | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | from test import test_support | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-12-16 22:07:17 +00:00
										 |  |  | from xmlcore.etree import ElementTree as ET | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-12-14 18:10:45 +00:00
										 |  |  | SAMPLE_XML = """
 | 
					
						
							|  |  |  | <body> | 
					
						
							|  |  |  |   <tag>text</tag> | 
					
						
							|  |  |  |   <tag /> | 
					
						
							|  |  |  |   <section> | 
					
						
							|  |  |  |     <tag>subtext</tag> | 
					
						
							|  |  |  |   </section> | 
					
						
							|  |  |  | </body> | 
					
						
							|  |  |  | """
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | SAMPLE_XML_NS = """
 | 
					
						
							|  |  |  | <body xmlns="http://effbot.org/ns"> | 
					
						
							|  |  |  |   <tag>text</tag> | 
					
						
							|  |  |  |   <tag /> | 
					
						
							|  |  |  |   <section> | 
					
						
							|  |  |  |     <tag>subtext</tag> | 
					
						
							|  |  |  |   </section> | 
					
						
							|  |  |  | </body> | 
					
						
							|  |  |  | """
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def sanity(): | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     Import sanity. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     >>> from xmlcore.etree import ElementTree | 
					
						
							|  |  |  |     >>> from xmlcore.etree import ElementInclude | 
					
						
							|  |  |  |     >>> from xmlcore.etree import ElementPath | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def check_method(method): | 
					
						
							|  |  |  |     if not callable(method): | 
					
						
							|  |  |  |         print method, "not callable" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def serialize(ET, elem, encoding=None): | 
					
						
							|  |  |  |     import StringIO | 
					
						
							|  |  |  |     file = StringIO.StringIO() | 
					
						
							|  |  |  |     tree = ET.ElementTree(elem) | 
					
						
							|  |  |  |     if encoding: | 
					
						
							|  |  |  |         tree.write(file, encoding) | 
					
						
							|  |  |  |     else: | 
					
						
							|  |  |  |         tree.write(file) | 
					
						
							|  |  |  |     return file.getvalue() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def summarize(elem): | 
					
						
							|  |  |  |     return elem.tag | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def summarize_list(seq): | 
					
						
							|  |  |  |     return map(summarize, seq) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def interface(): | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     Test element tree interface. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     >>> element = ET.Element("tag", key="value") | 
					
						
							|  |  |  |     >>> tree = ET.ElementTree(element) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     Make sure all standard element methods exist. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     >>> check_method(element.append) | 
					
						
							|  |  |  |     >>> check_method(element.insert) | 
					
						
							|  |  |  |     >>> check_method(element.remove) | 
					
						
							|  |  |  |     >>> check_method(element.getchildren) | 
					
						
							|  |  |  |     >>> check_method(element.find) | 
					
						
							|  |  |  |     >>> check_method(element.findall) | 
					
						
							|  |  |  |     >>> check_method(element.findtext) | 
					
						
							|  |  |  |     >>> check_method(element.clear) | 
					
						
							|  |  |  |     >>> check_method(element.get) | 
					
						
							|  |  |  |     >>> check_method(element.set) | 
					
						
							|  |  |  |     >>> check_method(element.keys) | 
					
						
							|  |  |  |     >>> check_method(element.items) | 
					
						
							|  |  |  |     >>> check_method(element.getiterator) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     Basic method sanity checks. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     >>> serialize(ET, element) # 1 | 
					
						
							|  |  |  |     '<tag key="value" />' | 
					
						
							|  |  |  |     >>> subelement = ET.Element("subtag") | 
					
						
							|  |  |  |     >>> element.append(subelement) | 
					
						
							|  |  |  |     >>> serialize(ET, element) #  2 | 
					
						
							|  |  |  |     '<tag key="value"><subtag /></tag>' | 
					
						
							|  |  |  |     >>> element.insert(0, subelement) | 
					
						
							|  |  |  |     >>> serialize(ET, element) # 3 | 
					
						
							|  |  |  |     '<tag key="value"><subtag /><subtag /></tag>' | 
					
						
							|  |  |  |     >>> element.remove(subelement) | 
					
						
							|  |  |  |     >>> serialize(ET, element) # 4 | 
					
						
							|  |  |  |     '<tag key="value"><subtag /></tag>' | 
					
						
							|  |  |  |     >>> element.remove(subelement) | 
					
						
							|  |  |  |     >>> serialize(ET, element) # 5 | 
					
						
							|  |  |  |     '<tag key="value" />' | 
					
						
							|  |  |  |     >>> element.remove(subelement) | 
					
						
							|  |  |  |     Traceback (most recent call last): | 
					
						
							|  |  |  |     ValueError: list.remove(x): x not in list | 
					
						
							|  |  |  |     >>> serialize(ET, element) # 6 | 
					
						
							|  |  |  |     '<tag key="value" />' | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def find(): | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     Test find methods (including xpath syntax). | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     >>> elem = ET.XML(SAMPLE_XML) | 
					
						
							|  |  |  |     >>> elem.find("tag").tag | 
					
						
							|  |  |  |     'tag' | 
					
						
							|  |  |  |     >>> ET.ElementTree(elem).find("tag").tag | 
					
						
							|  |  |  |     'tag' | 
					
						
							|  |  |  |     >>> elem.find("section/tag").tag | 
					
						
							|  |  |  |     'tag' | 
					
						
							|  |  |  |     >>> ET.ElementTree(elem).find("section/tag").tag | 
					
						
							|  |  |  |     'tag' | 
					
						
							|  |  |  |     >>> elem.findtext("tag") | 
					
						
							|  |  |  |     'text' | 
					
						
							|  |  |  |     >>> elem.findtext("tog") | 
					
						
							|  |  |  |     >>> elem.findtext("tog", "default") | 
					
						
							|  |  |  |     'default' | 
					
						
							|  |  |  |     >>> ET.ElementTree(elem).findtext("tag") | 
					
						
							|  |  |  |     'text' | 
					
						
							|  |  |  |     >>> elem.findtext("section/tag") | 
					
						
							|  |  |  |     'subtext' | 
					
						
							|  |  |  |     >>> ET.ElementTree(elem).findtext("section/tag") | 
					
						
							|  |  |  |     'subtext' | 
					
						
							|  |  |  |     >>> summarize_list(elem.findall("tag")) | 
					
						
							|  |  |  |     ['tag', 'tag'] | 
					
						
							|  |  |  |     >>> summarize_list(elem.findall("*")) | 
					
						
							|  |  |  |     ['tag', 'tag', 'section'] | 
					
						
							|  |  |  |     >>> summarize_list(elem.findall(".//tag")) | 
					
						
							|  |  |  |     ['tag', 'tag', 'tag'] | 
					
						
							|  |  |  |     >>> summarize_list(elem.findall("section/tag")) | 
					
						
							|  |  |  |     ['tag'] | 
					
						
							|  |  |  |     >>> summarize_list(elem.findall("section//tag")) | 
					
						
							|  |  |  |     ['tag'] | 
					
						
							|  |  |  |     >>> summarize_list(elem.findall("section/*")) | 
					
						
							|  |  |  |     ['tag'] | 
					
						
							|  |  |  |     >>> summarize_list(elem.findall("section//*")) | 
					
						
							|  |  |  |     ['tag'] | 
					
						
							|  |  |  |     >>> summarize_list(elem.findall("section/.//*")) | 
					
						
							|  |  |  |     ['tag'] | 
					
						
							|  |  |  |     >>> summarize_list(elem.findall("*/*")) | 
					
						
							|  |  |  |     ['tag'] | 
					
						
							|  |  |  |     >>> summarize_list(elem.findall("*//*")) | 
					
						
							|  |  |  |     ['tag'] | 
					
						
							|  |  |  |     >>> summarize_list(elem.findall("*/tag")) | 
					
						
							|  |  |  |     ['tag'] | 
					
						
							|  |  |  |     >>> summarize_list(elem.findall("*/./tag")) | 
					
						
							|  |  |  |     ['tag'] | 
					
						
							|  |  |  |     >>> summarize_list(elem.findall("./tag")) | 
					
						
							|  |  |  |     ['tag', 'tag'] | 
					
						
							|  |  |  |     >>> summarize_list(elem.findall(".//tag")) | 
					
						
							|  |  |  |     ['tag', 'tag', 'tag'] | 
					
						
							|  |  |  |     >>> summarize_list(elem.findall("././tag")) | 
					
						
							|  |  |  |     ['tag', 'tag'] | 
					
						
							|  |  |  |     >>> summarize_list(ET.ElementTree(elem).findall("/tag")) | 
					
						
							|  |  |  |     ['tag', 'tag'] | 
					
						
							|  |  |  |     >>> summarize_list(ET.ElementTree(elem).findall("./tag")) | 
					
						
							|  |  |  |     ['tag', 'tag'] | 
					
						
							|  |  |  |     >>> elem = ET.XML(SAMPLE_XML_NS) | 
					
						
							|  |  |  |     >>> summarize_list(elem.findall("tag")) | 
					
						
							|  |  |  |     [] | 
					
						
							|  |  |  |     >>> summarize_list(elem.findall("{http://effbot.org/ns}tag")) | 
					
						
							|  |  |  |     ['{http://effbot.org/ns}tag', '{http://effbot.org/ns}tag'] | 
					
						
							|  |  |  |     >>> summarize_list(elem.findall(".//{http://effbot.org/ns}tag")) | 
					
						
							|  |  |  |     ['{http://effbot.org/ns}tag', '{http://effbot.org/ns}tag', '{http://effbot.org/ns}tag'] | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def parseliteral(): | 
					
						
							|  |  |  |     r"""
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     >>> element = ET.XML("<html><body>text</body></html>") | 
					
						
							|  |  |  |     >>> ET.ElementTree(element).write(sys.stdout) | 
					
						
							|  |  |  |     <html><body>text</body></html> | 
					
						
							|  |  |  |     >>> element = ET.fromstring("<html><body>text</body></html>") | 
					
						
							|  |  |  |     >>> ET.ElementTree(element).write(sys.stdout) | 
					
						
							|  |  |  |     <html><body>text</body></html> | 
					
						
							|  |  |  |     >>> print ET.tostring(element) | 
					
						
							|  |  |  |     <html><body>text</body></html> | 
					
						
							|  |  |  |     >>> print ET.tostring(element, "ascii") | 
					
						
							|  |  |  |     <?xml version='1.0' encoding='ascii'?> | 
					
						
							|  |  |  |     <html><body>text</body></html> | 
					
						
							|  |  |  |     >>> _, ids = ET.XMLID("<html><body>text</body></html>") | 
					
						
							|  |  |  |     >>> len(ids) | 
					
						
							|  |  |  |     0 | 
					
						
							|  |  |  |     >>> _, ids = ET.XMLID("<html><body id='body'>text</body></html>") | 
					
						
							|  |  |  |     >>> len(ids) | 
					
						
							|  |  |  |     1 | 
					
						
							|  |  |  |     >>> ids["body"].tag | 
					
						
							|  |  |  |     'body' | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-12-16 22:07:17 +00:00
										 |  |  | def check_encoding(encoding): | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     >>> check_encoding("ascii") | 
					
						
							|  |  |  |     >>> check_encoding("us-ascii") | 
					
						
							|  |  |  |     >>> check_encoding("iso-8859-1") | 
					
						
							|  |  |  |     >>> check_encoding("iso-8859-15") | 
					
						
							|  |  |  |     >>> check_encoding("cp437") | 
					
						
							|  |  |  |     >>> check_encoding("mac-roman") | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     ET.XML( | 
					
						
							|  |  |  |         "<?xml version='1.0' encoding='%s'?><xml />" % encoding | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-12-14 18:10:45 +00:00
										 |  |  | # | 
					
						
							|  |  |  | # xinclude tests (samples from appendix C of the xinclude specification) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | XINCLUDE = {} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | XINCLUDE["C1.xml"] = """\
 | 
					
						
							|  |  |  | <?xml version='1.0'?> | 
					
						
							|  |  |  | <document xmlns:xi="http://www.w3.org/2001/XInclude"> | 
					
						
							|  |  |  |   <p>120 Mz is adequate for an average home user.</p> | 
					
						
							|  |  |  |   <xi:include href="disclaimer.xml"/> | 
					
						
							|  |  |  | </document> | 
					
						
							|  |  |  | """
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | XINCLUDE["disclaimer.xml"] = """\
 | 
					
						
							|  |  |  | <?xml version='1.0'?> | 
					
						
							|  |  |  | <disclaimer> | 
					
						
							|  |  |  |   <p>The opinions represented herein represent those of the individual | 
					
						
							|  |  |  |   and should not be interpreted as official policy endorsed by this | 
					
						
							|  |  |  |   organization.</p> | 
					
						
							|  |  |  | </disclaimer> | 
					
						
							|  |  |  | """
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | XINCLUDE["C2.xml"] = """\
 | 
					
						
							|  |  |  | <?xml version='1.0'?> | 
					
						
							|  |  |  | <document xmlns:xi="http://www.w3.org/2001/XInclude"> | 
					
						
							|  |  |  |   <p>This document has been accessed | 
					
						
							|  |  |  |   <xi:include href="count.txt" parse="text"/> times.</p> | 
					
						
							|  |  |  | </document> | 
					
						
							|  |  |  | """
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | XINCLUDE["count.txt"] = "324387" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | XINCLUDE["C3.xml"] = """\
 | 
					
						
							|  |  |  | <?xml version='1.0'?> | 
					
						
							|  |  |  | <document xmlns:xi="http://www.w3.org/2001/XInclude"> | 
					
						
							|  |  |  |   <p>The following is the source of the "data.xml" resource:</p> | 
					
						
							|  |  |  |   <example><xi:include href="data.xml" parse="text"/></example> | 
					
						
							|  |  |  | </document> | 
					
						
							|  |  |  | """
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | XINCLUDE["data.xml"] = """\
 | 
					
						
							|  |  |  | <?xml version='1.0'?> | 
					
						
							|  |  |  | <data> | 
					
						
							|  |  |  |   <item><![CDATA[Brooks & Shields]]></item> | 
					
						
							|  |  |  | </data> | 
					
						
							|  |  |  | """
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | XINCLUDE["C5.xml"] = """\
 | 
					
						
							|  |  |  | <?xml version='1.0'?> | 
					
						
							|  |  |  | <div xmlns:xi="http://www.w3.org/2001/XInclude"> | 
					
						
							|  |  |  |   <xi:include href="example.txt" parse="text"> | 
					
						
							|  |  |  |     <xi:fallback> | 
					
						
							|  |  |  |       <xi:include href="fallback-example.txt" parse="text"> | 
					
						
							|  |  |  |         <xi:fallback><a href="mailto:bob@example.org">Report error</a></xi:fallback> | 
					
						
							|  |  |  |       </xi:include> | 
					
						
							|  |  |  |     </xi:fallback> | 
					
						
							|  |  |  |   </xi:include> | 
					
						
							|  |  |  | </div> | 
					
						
							|  |  |  | """
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | XINCLUDE["default.xml"] = """\
 | 
					
						
							|  |  |  | <?xml version='1.0'?> | 
					
						
							|  |  |  | <document xmlns:xi="http://www.w3.org/2001/XInclude"> | 
					
						
							|  |  |  |   <p>Example.</p> | 
					
						
							|  |  |  |   <xi:include href="samples/simple.xml"/> | 
					
						
							|  |  |  | </document> | 
					
						
							|  |  |  | """
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def xinclude_loader(href, parse="xml", encoding=None): | 
					
						
							|  |  |  |     try: | 
					
						
							|  |  |  |         data = XINCLUDE[href] | 
					
						
							|  |  |  |     except KeyError: | 
					
						
							|  |  |  |         raise IOError("resource not found") | 
					
						
							|  |  |  |     if parse == "xml": | 
					
						
							| 
									
										
										
										
											2005-12-16 22:07:17 +00:00
										 |  |  |         return ET.XML(data) | 
					
						
							| 
									
										
										
										
											2005-12-14 18:10:45 +00:00
										 |  |  |     return data | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def xinclude(): | 
					
						
							|  |  |  |     r"""
 | 
					
						
							|  |  |  |     Basic inclusion example (XInclude C.1) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     >>> from xmlcore.etree import ElementInclude | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     >>> document = xinclude_loader("C1.xml") | 
					
						
							|  |  |  |     >>> ElementInclude.include(document, xinclude_loader) | 
					
						
							|  |  |  |     >>> print serialize(ET, document) # C1 | 
					
						
							|  |  |  |     <document> | 
					
						
							|  |  |  |       <p>120 Mz is adequate for an average home user.</p> | 
					
						
							|  |  |  |       <disclaimer> | 
					
						
							|  |  |  |       <p>The opinions represented herein represent those of the individual | 
					
						
							|  |  |  |       and should not be interpreted as official policy endorsed by this | 
					
						
							|  |  |  |       organization.</p> | 
					
						
							|  |  |  |     </disclaimer> | 
					
						
							|  |  |  |     </document> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     Textual inclusion example (XInclude C.2) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     >>> document = xinclude_loader("C2.xml") | 
					
						
							|  |  |  |     >>> ElementInclude.include(document, xinclude_loader) | 
					
						
							|  |  |  |     >>> print serialize(ET, document) # C2 | 
					
						
							|  |  |  |     <document> | 
					
						
							|  |  |  |       <p>This document has been accessed | 
					
						
							|  |  |  |       324387 times.</p> | 
					
						
							|  |  |  |     </document> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     Textual inclusion of XML example (XInclude C.3) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     >>> document = xinclude_loader("C3.xml") | 
					
						
							|  |  |  |     >>> ElementInclude.include(document, xinclude_loader) | 
					
						
							|  |  |  |     >>> print serialize(ET, document) # C3 | 
					
						
							|  |  |  |     <document> | 
					
						
							|  |  |  |       <p>The following is the source of the "data.xml" resource:</p> | 
					
						
							|  |  |  |       <example><?xml version='1.0'?> | 
					
						
							|  |  |  |     <data> | 
					
						
							|  |  |  |       <item><![CDATA[Brooks & Shields]]></item> | 
					
						
							|  |  |  |     </data> | 
					
						
							|  |  |  |     </example> | 
					
						
							|  |  |  |     </document> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     Fallback example (XInclude C.5) | 
					
						
							|  |  |  |     Note! Fallback support is not yet implemented | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     >>> document = xinclude_loader("C5.xml") | 
					
						
							|  |  |  |     >>> ElementInclude.include(document, xinclude_loader) | 
					
						
							|  |  |  |     Traceback (most recent call last): | 
					
						
							|  |  |  |     IOError: resource not found | 
					
						
							|  |  |  |     >>> # print serialize(ET, document) # C5 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def test_main(): | 
					
						
							|  |  |  |     from test import test_xml_etree | 
					
						
							|  |  |  |     test_support.run_doctest(test_xml_etree, verbosity=True) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if __name__ == '__main__': | 
					
						
							|  |  |  |     test_main() |