]> granicus.if.org Git - python/commitdiff
added xml.etree test (enough of the ElementTree selftest to
authorFredrik Lundh <fredrik@pythonware.com>
Mon, 12 Dec 2005 20:19:44 +0000 (20:19 +0000)
committerFredrik Lundh <fredrik@pythonware.com>
Mon, 12 Dec 2005 20:19:44 +0000 (20:19 +0000)
make sure that all included components work)

Lib/test/test_xml_etree.py [new file with mode: 0644]

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