[Lxml-checkins] r46516 - in lxml/trunk: . src/lxml/tests

scoder at codespeak.net scoder at codespeak.net
Wed Sep 12 22:06:10 CEST 2007


Author: scoder
Date: Wed Sep 12 22:06:09 2007
New Revision: 46516

Modified:
   lxml/trunk/selftest.py
   lxml/trunk/selftest2.py
   lxml/trunk/src/lxml/tests/test_elementtree.py
Log:
loads of test cases for QName resolving and serialisation

Modified: lxml/trunk/selftest.py
==============================================================================
--- lxml/trunk/selftest.py	(original)
+++ lxml/trunk/selftest.py	Wed Sep 12 22:06:09 2007
@@ -23,6 +23,7 @@
 
 def fix_compatibility(xml_data):
     xml_data = re.sub('\s*xmlns:[a-z0-9]+="http://www.w3.org/2001/XInclude"', '', xml_data)
+    xml_data = xml_data.replace(' />', '/>')
     return xml_data
 
 def serialize(elem, encoding=None):
@@ -437,65 +438,65 @@
     '<html><body>text</body></html>'
     """
 
-## def encoding():
-##     r"""
-##     Test encoding issues.
+def encoding():
+    r"""
+    Test encoding issues.
 
-##     >>> elem = ElementTree.Element("tag")
-##     >>> elem.text = u"abc"
-##     >>> serialize(elem)
-##     '<tag>abc</tag>'
-##     >>> serialize(elem, "utf-8")
-##     '<tag>abc</tag>'
-##     >>> serialize(elem, "us-ascii")
-##     '<tag>abc</tag>'
-##     >>> serialize(elem, "iso-8859-1")
-##     "<?xml version='1.0' encoding='iso-8859-1'?>\n<tag>abc</tag>"
+    >>> elem = ElementTree.Element("tag")
+    >>> elem.text = u"abc"
+    >>> serialize(elem)
+    '<tag>abc</tag>'
+    >>> serialize(elem, "utf-8")
+    '<tag>abc</tag>'
+    >>> serialize(elem, "us-ascii")
+    '<tag>abc</tag>'
+    >>> serialize(elem, "ISO-8859-1")
+    "<?xml version='1.0' encoding='ISO-8859-1'?>\n<tag>abc</tag>"
 
-##     >>> elem.text = "<&\"\'>"
-##     >>> serialize(elem)
-##     '<tag>&lt;&amp;"\'&gt;</tag>'
-##     >>> serialize(elem, "utf-8")
-##     '<tag>&lt;&amp;"\'&gt;</tag>'
-##     >>> serialize(elem, "us-ascii") # cdata characters
-##     '<tag>&lt;&amp;"\'&gt;</tag>'
-##     >>> serialize(elem, "iso-8859-1")
-##     '<?xml version=\'1.0\' encoding=\'iso-8859-1\'?>\n<tag>&lt;&amp;"\'&gt;</tag>'
+    >>> elem.text = "<&\"\'>"
+    >>> serialize(elem)
+    '<tag>&lt;&amp;"\'&gt;</tag>'
+    >>> serialize(elem, "utf-8")
+    '<tag>&lt;&amp;"\'&gt;</tag>'
+    >>> serialize(elem, "us-ascii") # cdata characters
+    '<tag>&lt;&amp;"\'&gt;</tag>'
+    >>> serialize(elem, "ISO-8859-1")
+    '<?xml version=\'1.0\' encoding=\'ISO-8859-1\'?>\n<tag>&lt;&amp;"\'&gt;</tag>'
 
 ##     >>> elem.attrib["key"] = "<&\"\'>"
 ##     >>> elem.text = None
 ##     >>> serialize(elem)
-##     '<tag key="&lt;&amp;&quot;&apos;&gt;" />'
+##     '<tag key="&lt;&amp;&quot;&apos;&gt;"/>'
 ##     >>> serialize(elem, "utf-8")
-##     '<tag key="&lt;&amp;&quot;&apos;&gt;" />'
+##     '<tag key="&lt;&amp;&quot;&apos;&gt;"/>'
 ##     >>> serialize(elem, "us-ascii")
-##     '<tag key="&lt;&amp;&quot;&apos;&gt;" />'
+##     '<tag key="&lt;&amp;&quot;&apos;&gt;"/>'
 ##     >>> serialize(elem, "iso-8859-1")
-##     '<?xml version=\'1.0\' encoding=\'iso-8859-1\'?>\n<tag key="&lt;&amp;&quot;&apos;&gt;" />'
+##     '<?xml version=\'1.0\' encoding=\'iso-8859-1\'?>\n<tag key="&lt;&amp;&quot;&apos;&gt;"/>'
 
-##     >>> elem.text = u'\xe5\xf6\xf6<>'
-##     >>> elem.attrib.clear()
-##     >>> serialize(elem)
-##     '<tag>&#229;&#246;&#246;&lt;&gt;</tag>'
-##     >>> serialize(elem, "utf-8")
-##     '<tag>\xc3\xa5\xc3\xb6\xc3\xb6&lt;&gt;</tag>'
-##     >>> serialize(elem, "us-ascii")
-##     '<tag>&#229;&#246;&#246;&lt;&gt;</tag>'
-##     >>> serialize(elem, "iso-8859-1")
-##     "<?xml version='1.0' encoding='iso-8859-1'?>\n<tag>\xe5\xf6\xf6&lt;&gt;</tag>"
+    >>> elem.text = u'\xe5\xf6\xf6<>'
+    >>> elem.attrib.clear()
+    >>> serialize(elem)
+    '<tag>&#229;&#246;&#246;&lt;&gt;</tag>'
+    >>> serialize(elem, "utf-8")
+    '<tag>\xc3\xa5\xc3\xb6\xc3\xb6&lt;&gt;</tag>'
+    >>> serialize(elem, "us-ascii")
+    '<tag>&#229;&#246;&#246;&lt;&gt;</tag>'
+    >>> serialize(elem, "ISO-8859-1")
+    "<?xml version='1.0' encoding='ISO-8859-1'?>\n<tag>\xe5\xf6\xf6&lt;&gt;</tag>"
 
 ##     >>> elem.attrib["key"] = u'\xe5\xf6\xf6<>'
 ##     >>> elem.text = None
 ##     >>> serialize(elem)
-##     '<tag key="&#229;&#246;&#246;&lt;&gt;" />'
+##     '<tag key="&#229;&#246;&#246;&lt;&gt;"/>'
 ##     >>> serialize(elem, "utf-8")
-##     '<tag key="\xc3\xa5\xc3\xb6\xc3\xb6&lt;&gt;" />'
+##     '<tag key="\xc3\xa5\xc3\xb6\xc3\xb6&lt;&gt;"/>'
 ##     >>> serialize(elem, "us-ascii")
-##     '<tag key="&#229;&#246;&#246;&lt;&gt;" />'
-##     >>> serialize(elem, "iso-8859-1")
-##     '<?xml version=\'1.0\' encoding=\'iso-8859-1\'?>\n<tag key="\xe5\xf6\xf6&lt;&gt;" />'
+##     '<tag key="&#229;&#246;&#246;&lt;&gt;"/>'
+##     >>> serialize(elem, "ISO-8859-1")
+##     '<?xml version=\'1.0\' encoding=\'ISO-8859-1\'?>\n<tag key="\xe5\xf6\xf6&lt;&gt;"/>'
 
-##     """
+    """
 
 ENTITY_XML = """\
 <!DOCTYPE points [
@@ -532,8 +533,6 @@
     >>> elem = ElementTree.XML("<tag xml:lang='en' />")
     >>> serialize(elem) # 1.1
     '<tag xml:lang="en"/>'
-
-#   '<tag xml:lang="en" />' # ElementTree produces an extra blank
     """
     
 def namespace():
@@ -560,33 +559,35 @@
 
     """
 
-## def qname():
-##     """
-##     Test QName handling.
+def qname():
+    """
+    Test QName handling.
+
+    1) decorated tags
 
-##     1) decorated tags
+    >>> elem = ElementTree.Element("{uri}tag")
+    >>> serialize(elem) # 1.1
+    '<ns0:tag xmlns:ns0="uri"/>'
+    >>> elem = ElementTree.Element(ElementTree.QName("{uri}tag"))
+    >>> serialize(elem) # 1.2
+    '<ns0:tag xmlns:ns0="uri"/>'
+    >>> elem = ElementTree.Element(ElementTree.QName("uri", "tag"))
+    >>> serialize(elem) # 1.3
+    '<ns0:tag xmlns:ns0="uri"/>'
 
-##     >>> elem = ElementTree.Element("{uri}tag")
-##     >>> serialize(elem) # 1.1
-##     '<ns0:tag xmlns:ns0="uri" />'
-##     >>> elem = ElementTree.Element(ElementTree.QName("{uri}tag"))
-##     >>> serialize(elem) # 1.2
-##     '<ns0:tag xmlns:ns0="uri" />'
-##     >>> elem = ElementTree.Element(ElementTree.QName("uri", "tag"))
-##     >>> serialize(elem) # 1.3
-##     '<ns0:tag xmlns:ns0="uri" />'
+# ns/attribute order ...
 
 ##     2) decorated attributes
 
 ##     >>> elem.clear()
 ##     >>> elem.attrib["{uri}key"] = "value"
 ##     >>> serialize(elem) # 2.1
-##     '<ns0:tag ns0:key="value" xmlns:ns0="uri" />'
+##     '<ns0:tag ns0:key="value" xmlns:ns0="uri"/>'
 
 ##     >>> elem.clear()
 ##     >>> elem.attrib[ElementTree.QName("{uri}key")] = "value"
 ##     >>> serialize(elem) # 2.2
-##     '<ns0:tag ns0:key="value" xmlns:ns0="uri" />'
+##     '<ns0:tag ns0:key="value" xmlns:ns0="uri"/>'
 
 ##     3) decorated values are not converted by default, but the
 ##        QName wrapper can be used for values
@@ -594,12 +595,12 @@
 ##     >>> elem.clear()
 ##     >>> elem.attrib["{uri}key"] = "{uri}value"
 ##     >>> serialize(elem) # 3.1
-##     '<ns0:tag ns0:key="{uri}value" xmlns:ns0="uri" />'
+##     '<ns0:tag ns0:key="{uri}value" xmlns:ns0="uri"/>'
 
 ##     >>> elem.clear()
 ##     >>> elem.attrib["{uri}key"] = ElementTree.QName("{uri}value")
 ##     >>> serialize(elem) # 3.2
-##     '<ns0:tag ns0:key="ns0:value" xmlns:ns0="uri" />'
+##     '<ns0:tag ns0:key="ns0:value" xmlns:ns0="uri"/>'
 
 ##     >>> elem.clear()
 ##     >>> subelem = ElementTree.Element("tag")
@@ -607,9 +608,9 @@
 ##     >>> elem.append(subelem)
 ##     >>> elem.append(subelem)
 ##     >>> serialize(elem) # 3.3
-##     '<ns0:tag xmlns:ns0="uri"><tag ns1:key="ns2:value" xmlns:ns1="uri1" xmlns:ns2="uri2" /><tag ns1:key="ns2:value" xmlns:ns1="uri1" xmlns:ns2="uri2" /></ns0:tag>'
+##     '<ns0:tag xmlns:ns0="uri"><tag ns1:key="ns2:value" xmlns:ns1="uri1" xmlns:ns2="uri2"/><tag ns1:key="ns2:value" xmlns:ns1="uri1" xmlns:ns2="uri2"/></ns0:tag>'
 
-##     """
+    """
 
 def xpath_tokenizer(p):
     """

Modified: lxml/trunk/selftest2.py
==============================================================================
--- lxml/trunk/selftest2.py	(original)
+++ lxml/trunk/selftest2.py	Wed Sep 12 22:06:09 2007
@@ -22,7 +22,7 @@
         tree.write(file, encoding)
     else:
         tree.write(file)
-    return file.getvalue()
+    return file.getvalue().replace(' />', '/>')
 
 def summarize(elem):
     return elem.tag
@@ -161,13 +161,13 @@
 ##     >>> elem.attrib["key"] = "<&\"\'>"
 ##     >>> elem.text = None
 ##     >>> serialize(elem)
-##     '<tag key="&lt;&amp;&quot;&apos;&gt;" />'
+##     '<tag key="&lt;&amp;&quot;&apos;&gt;"/>'
 ##     >>> serialize(elem, "utf-8")
-##     '<tag key="&lt;&amp;&quot;&apos;&gt;" />'
+##     '<tag key="&lt;&amp;&quot;&apos;&gt;"/>'
 ##     >>> serialize(elem, "us-ascii")
-##     '<tag key="&lt;&amp;&quot;&apos;&gt;" />'
+##     '<tag key="&lt;&amp;&quot;&apos;&gt;"/>'
 ##     >>> serialize(elem, "iso-8859-1")
-##     '<?xml version=\'1.0\' encoding=\'iso-8859-1\'?>\n<tag key="&lt;&amp;&quot;&apos;&gt;" />'
+##     '<?xml version=\'1.0\' encoding=\'iso-8859-1\'?>\n<tag key="&lt;&amp;&quot;&apos;&gt;"/>'
 
     >>> elem.text = u'\xe5\xf6\xf6<>'
     >>> elem.attrib.clear()
@@ -183,13 +183,13 @@
 ##     >>> elem.attrib["key"] = u'\xe5\xf6\xf6<>'
 ##     >>> elem.text = None
 ##     >>> serialize(elem)
-##     '<tag key="&#229;&#246;&#246;&lt;&gt;" />'
+##     '<tag key="&#229;&#246;&#246;&lt;&gt;"/>'
 ##     >>> serialize(elem, "utf-8")
-##     '<tag key="\xc3\xa5\xc3\xb6\xc3\xb6&lt;&gt;" />'
+##     '<tag key="\xc3\xa5\xc3\xb6\xc3\xb6&lt;&gt;"/>'
 ##     >>> serialize(elem, "us-ascii")
-##     '<tag key="&#229;&#246;&#246;&lt;&gt;" />'
+##     '<tag key="&#229;&#246;&#246;&lt;&gt;"/>'
 ##     >>> serialize(elem, "iso-8859-1")
-##     '<?xml version=\'1.0\' encoding=\'iso-8859-1\'?>\n<tag key="\xe5\xf6\xf6&lt;&gt;" />'
+##     '<?xml version=\'1.0\' encoding=\'iso-8859-1\'?>\n<tag key="\xe5\xf6\xf6&lt;&gt;"/>'
 
     """
 
@@ -290,25 +290,28 @@
     ['{http://effbot.org/ns}tag', '{http://effbot.org/ns}tag', '{http://effbot.org/ns}tag']
     """
 
-# XXX gives a segfault
+# XXX only deep copying is supported
 
-## def copy():
-##     """
-##     Test copy handling (etc).
+def copy():
+    """
+    Test copy handling (etc).
 
-##     >>> import copy
-##     >>> e1 = unserialize("<tag>hello<foo/></tag>")
-##     >>> e2 = copy.copy(e1)
-##     >>> e3 = copy.deepcopy(e1)
-##     >>> e1.find("foo").tag = "bar"
-##     >>> serialize(e1)
-##     '<tag>hello<bar /></tag>'
-##     >>> serialize(e2)
-##     '<tag>hello<bar /></tag>'
-##     >>> serialize(e3)
-##     '<tag>hello<foo /></tag>'
+    >>> import copy
+    >>> e1 = unserialize("<tag>hello<foo/></tag>")
+    >>> # e2 = copy.copy(e1)
+    >>> e3 = copy.deepcopy(e1)
+    >>> e1.find("foo").tag = "bar"
 
-##     """
+    >>> serialize(e1).replace(' ', '')
+    '<tag>hello<bar/></tag>'
+
+##     >>> serialize(e2).replace(' ', '')
+##     '<tag>hello<bar/></tag>'
+
+    >>> serialize(e3).replace(' ', '')
+    '<tag>hello<foo/></tag>'
+
+    """
 
 def attrib():
     """

Modified: lxml/trunk/src/lxml/tests/test_elementtree.py
==============================================================================
--- lxml/trunk/src/lxml/tests/test_elementtree.py	(original)
+++ lxml/trunk/src/lxml/tests/test_elementtree.py	Wed Sep 12 22:06:09 2007
@@ -1986,7 +1986,7 @@
         del one
         self.assertEquals('{http://a.b.c}baz', baz.tag)
 
-    def test_ns_decl(self):
+    def test_ns_decl_tostring(self):
         tostring = self.etree.tostring
         root = self.etree.XML(
             '<foo><bar xmlns:ns="http://a.b.c"><ns:baz/></bar></foo>')
@@ -1996,7 +1996,7 @@
                             tostring(baz))
         self.assertEquals(["http://a.b.c"], nsdecl)
 
-    def test_ns_decl_default(self):
+    def test_ns_decl_tostring_default(self):
         tostring = self.etree.tostring
         root = self.etree.XML(
             '<foo><bar xmlns="http://a.b.c"><baz/></bar></foo>')
@@ -2006,7 +2006,7 @@
                             tostring(baz))
         self.assertEquals(["http://a.b.c"], nsdecl)
         
-    def test_ns_decl_root(self):
+    def test_ns_decl_tostring_root(self):
         tostring = self.etree.tostring
         root = self.etree.XML(
             '<foo xmlns:ns="http://a.b.c"><bar><ns:baz/></bar></foo>')
@@ -2016,6 +2016,19 @@
                             tostring(baz))
 
         self.assertEquals(["http://a.b.c"], nsdecl)
+        
+    def test_ns_decl_tostring_element(self):
+        Element = self.etree.Element
+        SubElement = self.etree.SubElement
+
+        root = Element("foo")
+        bar = SubElement(root, "{http://a.b.c}bar")
+        baz = SubElement(bar, "{http://a.b.c}baz")
+
+        nsdecl = re.findall("xmlns(?::[a-z0-9]+)?=[\"']([^\"']+)[\"']",
+                            self.etree.tostring(baz))
+
+        self.assertEquals(["http://a.b.c"], nsdecl)
 
     def test_attribute_xmlns_move(self):
         Element = self.etree.Element
@@ -2562,6 +2575,59 @@
         self.assertEquals(qname1, qname1)
         self.assertEquals(qname1, qname2)
 
+    def test_qname_attribute_getset(self):
+        etree = self.etree
+        qname = etree.QName('myns', 'a')
+
+        a = etree.Element(qname)
+        a.set(qname, "value")
+
+        self.assertEquals(a.get(qname), "value")
+        self.assertEquals(a.get("{myns}a"), "value")
+
+    def test_qname_attrib(self):
+        etree = self.etree
+        qname = etree.QName('myns', 'a')
+
+        a = etree.Element(qname)
+        a.attrib[qname] = "value"
+
+        self.assertEquals(a.attrib[qname], "value")
+        self.assertEquals(a.attrib.get(qname), "value")
+
+        self.assertEquals(a.attrib["{myns}a"], "value")
+        self.assertEquals(a.attrib.get("{myns}a"), "value")
+
+    def test_qname_attribute_resolve(self):
+        etree = self.etree
+        qname = etree.QName('http://myns', 'a')
+        a = etree.Element(qname)
+        a.set(qname, qname)
+
+        self.assertXML(
+            '<ns0:a xmlns:ns0="http://myns" ns0:a="ns0:a"></ns0:a>',
+            a)
+
+    def test_qname_attribute_resolve_new(self):
+        etree = self.etree
+        qname = etree.QName('http://myns', 'a')
+        a = etree.Element('a')
+        a.set('a', qname)
+
+        self.assertXML(
+            '<a xmlns:ns0="http://myns" a="ns0:a"></a>',
+            a)
+
+    def test_qname_attrib_resolve(self):
+        etree = self.etree
+        qname = etree.QName('http://myns', 'a')
+        a = etree.Element(qname)
+        a.attrib[qname] = qname
+
+        self.assertXML(
+            '<ns0:a xmlns:ns0="http://myns" ns0:a="ns0:a"></ns0:a>',
+            a)
+
     def test_parser_version(self):
         etree = self.etree
         parser = etree.XMLParser()


More information about the lxml-checkins mailing list