Blame src/lxml/tests/test_pyclasslookup.py

Packit Service b74dd5
# -*- coding: utf-8 -*-
Packit Service b74dd5
Packit Service b74dd5
"""
Packit Service b74dd5
Tests specific to the Python based class lookup.
Packit Service b74dd5
"""
Packit Service b74dd5
Packit Service b74dd5
Packit Service b74dd5
import unittest, operator, os.path, sys
Packit Service b74dd5
Packit Service b74dd5
this_dir = os.path.dirname(__file__)
Packit Service b74dd5
if this_dir not in sys.path:
Packit Service b74dd5
    sys.path.insert(0, this_dir) # needed for Py3
Packit Service b74dd5
Packit Service b74dd5
from common_imports import etree, StringIO, HelperTestCase, fileInTestDir
Packit Service b74dd5
from common_imports import SillyFileLike, canonicalize, doctest, _bytes
Packit Service b74dd5
Packit Service b74dd5
from lxml.etree import PythonElementClassLookup
Packit Service b74dd5
Packit Service b74dd5
xml_str = _bytes('''\
Packit Service b74dd5
<obj:root xmlns:obj="objectified" xmlns:other="otherNS">
Packit Service b74dd5
  <obj:c1 a1="A1" a2="A2" other:a3="A3">
Packit Service b74dd5
    <obj:c2>0</obj:c2>
Packit Service b74dd5
    <obj:c2>1</obj:c2>
Packit Service b74dd5
    <obj:c2>2</obj:c2>
Packit Service b74dd5
    <other:c2>3</other:c2>
Packit Service b74dd5
    <c2>3</c2>
Packit Service b74dd5
  </obj:c1>
Packit Service b74dd5
</obj:root>''')
Packit Service b74dd5
Packit Service b74dd5
Packit Service b74dd5
class PyClassLookupTestCase(HelperTestCase):
Packit Service b74dd5
    """Test cases for the lxml.pyclasslookup class lookup mechanism.
Packit Service b74dd5
    """
Packit Service b74dd5
    etree = etree
Packit Service b74dd5
    parser = etree.XMLParser()
Packit Service b74dd5
    Element = parser.makeelement
Packit Service b74dd5
Packit Service b74dd5
    def tearDown(self):
Packit Service b74dd5
        self.parser.set_element_class_lookup(None)
Packit Service b74dd5
        super(PyClassLookupTestCase, self).tearDown()
Packit Service b74dd5
Packit Service b74dd5
    def _setClassLookup(self, lookup_function):
Packit Service b74dd5
        class Lookup(PythonElementClassLookup):
Packit Service b74dd5
            def lookup(self, *args):
Packit Service b74dd5
                return lookup_function(*args)
Packit Service b74dd5
        self.parser.set_element_class_lookup( Lookup() )
Packit Service b74dd5
Packit Service b74dd5
    def _buildElementClass(self):
Packit Service b74dd5
        class LocalElement(etree.ElementBase):
Packit Service b74dd5
            pass
Packit Service b74dd5
        return LocalElement
Packit Service b74dd5
Packit Service b74dd5
    def XML(self, xml):
Packit Service b74dd5
        return self.etree.XML(xml, self.parser)
Packit Service b74dd5
Packit Service b74dd5
    # --- Test cases
Packit Service b74dd5
Packit Service b74dd5
    def test_lookup(self):
Packit Service b74dd5
        el_class = self._buildElementClass()
Packit Service b74dd5
        el_class.i = 1
Packit Service b74dd5
        def lookup(*args):
Packit Service b74dd5
            if el_class.i == 1:
Packit Service b74dd5
                el_class.i = 2
Packit Service b74dd5
            return el_class
Packit Service b74dd5
        self._setClassLookup(lookup)
Packit Service b74dd5
        root = self.XML(xml_str)
Packit Service b74dd5
        self.assertEqual(2, el_class.i)
Packit Service b74dd5
Packit Service b74dd5
    def test_lookup_keep_ref_assertion(self):
Packit Service b74dd5
        el_class = self._buildElementClass()
Packit Service b74dd5
        el_class.EL = None
Packit Service b74dd5
        def lookup(doc, el):
Packit Service b74dd5
            if el_class.EL is None:
Packit Service b74dd5
                el_class.EL = el
Packit Service b74dd5
            return el_class
Packit Service b74dd5
        self._setClassLookup(lookup)
Packit Service b74dd5
        root = self.XML(xml_str)
Packit Service b74dd5
        self.assertNotEqual(None, el_class.EL)
Packit Service b74dd5
        self.assertRaises(ReferenceError, el_class.EL.getchildren)
Packit Service b74dd5
Packit Service b74dd5
    def test_lookup_tag(self):
Packit Service b74dd5
        el_class = self._buildElementClass()
Packit Service b74dd5
        el_class.TAG = None
Packit Service b74dd5
        def lookup(doc, el):
Packit Service b74dd5
            if el_class.TAG is None:
Packit Service b74dd5
                el_class.TAG = el.tag
Packit Service b74dd5
            return el_class
Packit Service b74dd5
        self._setClassLookup(lookup)
Packit Service b74dd5
        root = self.XML(xml_str)
Packit Service b74dd5
        self.assertNotEqual(None, root.TAG)
Packit Service b74dd5
        self.assertEqual(root.tag, root.TAG)
Packit Service b74dd5
Packit Service b74dd5
    def test_lookup_text(self):
Packit Service b74dd5
        el_class = self._buildElementClass()
Packit Service b74dd5
        el_class.TEXT = None
Packit Service b74dd5
        def lookup(doc, el):
Packit Service b74dd5
            if el_class.TEXT is None:
Packit Service b74dd5
                el_class.TEXT = el.text
Packit Service b74dd5
            return el_class
Packit Service b74dd5
        self._setClassLookup(lookup)
Packit Service b74dd5
        root = self.XML(xml_str)
Packit Service b74dd5
        self.assertNotEqual(None, root.TEXT)
Packit Service b74dd5
        self.assertEqual(root.text, root.TEXT)
Packit Service b74dd5
Packit Service b74dd5
    def test_lookup_tail(self):
Packit Service b74dd5
        el_class = self._buildElementClass()
Packit Service b74dd5
        el_class.TAIL = None
Packit Service b74dd5
        def lookup(doc, el):
Packit Service b74dd5
            if el_class.TAIL is None:
Packit Service b74dd5
                el_class.TAIL = el.tail
Packit Service b74dd5
            return el_class
Packit Service b74dd5
        self._setClassLookup(lookup)
Packit Service b74dd5
        root = self.XML(xml_str)
Packit Service b74dd5
        self.assertEqual(root.tail, root.TAIL)
Packit Service b74dd5
Packit Service b74dd5
    def test_lookup_attrib(self):
Packit Service b74dd5
        el_class = self._buildElementClass()
Packit Service b74dd5
        el_class.ATTRIB = None
Packit Service b74dd5
        def lookup(doc, el):
Packit Service b74dd5
            if el_class.ATTRIB is None:
Packit Service b74dd5
                el_class.ATTRIB = el[0].attrib
Packit Service b74dd5
            return el_class
Packit Service b74dd5
        self._setClassLookup(lookup)
Packit Service b74dd5
        root = self.XML(xml_str)
Packit Service b74dd5
        items1 = list(root[0].attrib.items())
Packit Service b74dd5
        items1.sort()
Packit Service b74dd5
        items2 = list(root.ATTRIB.items())
Packit Service b74dd5
        items2.sort()
Packit Service b74dd5
        self.assertEqual(items1, items2)
Packit Service b74dd5
Packit Service b74dd5
    def test_lookup_prefix(self):
Packit Service b74dd5
        el_class = self._buildElementClass()
Packit Service b74dd5
        el_class.PREFIX = None
Packit Service b74dd5
        def lookup(doc, el):
Packit Service b74dd5
            if el_class.PREFIX is None:
Packit Service b74dd5
                el_class.PREFIX = el.prefix
Packit Service b74dd5
            return el_class
Packit Service b74dd5
        self._setClassLookup(lookup)
Packit Service b74dd5
        root = self.XML(xml_str)
Packit Service b74dd5
        self.assertEqual(root.prefix, root.PREFIX)
Packit Service b74dd5
Packit Service b74dd5
    def test_lookup_sourceline(self):
Packit Service b74dd5
        el_class = self._buildElementClass()
Packit Service b74dd5
        el_class.LINE = None
Packit Service b74dd5
        def lookup(doc, el):
Packit Service b74dd5
            if el_class.LINE is None:
Packit Service b74dd5
                el_class.LINE = el.sourceline
Packit Service b74dd5
            return el_class
Packit Service b74dd5
        self._setClassLookup(lookup)
Packit Service b74dd5
        root = self.XML(xml_str)
Packit Service b74dd5
        self.assertEqual(root.sourceline, root.LINE)
Packit Service b74dd5
Packit Service b74dd5
    def test_lookup_getitem(self):
Packit Service b74dd5
        el_class = self._buildElementClass()
Packit Service b74dd5
        el_class.CHILD_TAG = None
Packit Service b74dd5
        def lookup(doc, el):
Packit Service b74dd5
            el_class.CHILD_TAG = el[0].tag
Packit Service b74dd5
            return el_class
Packit Service b74dd5
        self._setClassLookup(lookup)
Packit Service b74dd5
        root = self.XML(xml_str)
Packit Service b74dd5
        child_tag = root.CHILD_TAG
Packit Service b74dd5
        self.assertNotEqual(None, child_tag)
Packit Service b74dd5
        self.assertEqual(root[0].tag, child_tag)
Packit Service b74dd5
Packit Service b74dd5
    def test_lookup_getitem_neg(self):
Packit Service b74dd5
        el_class = self._buildElementClass()
Packit Service b74dd5
        el_class.CHILD_TAG = None
Packit Service b74dd5
        def lookup(doc, el):
Packit Service b74dd5
            if el_class.CHILD_TAG is None:
Packit Service b74dd5
                el_class.CHILD_TAG = el[-1].tag
Packit Service b74dd5
            return el_class
Packit Service b74dd5
        self._setClassLookup(lookup)
Packit Service b74dd5
        root = self.XML(xml_str)
Packit Service b74dd5
        child_tag = root.CHILD_TAG
Packit Service b74dd5
        self.assertNotEqual(None, child_tag)
Packit Service b74dd5
        self.assertEqual(root[-1].tag, child_tag)
Packit Service b74dd5
Packit Service b74dd5
    def test_lookup_getslice(self):
Packit Service b74dd5
        el_class = self._buildElementClass()
Packit Service b74dd5
        el_class.CHILD_TAGS = None
Packit Service b74dd5
        def lookup(doc, el):
Packit Service b74dd5
            if el_class.CHILD_TAGS is None:
Packit Service b74dd5
                el_class.CHILD_TAGS = [ c.tag for c in el[1:-1] ]
Packit Service b74dd5
            return el_class
Packit Service b74dd5
        self._setClassLookup(lookup)
Packit Service b74dd5
        root = self.XML(xml_str)
Packit Service b74dd5
        child_tags = root.CHILD_TAGS
Packit Service b74dd5
        self.assertNotEqual(None, child_tags)
Packit Service b74dd5
        self.assertEqual([ c.tag for c in root[1:-1] ],
Packit Service b74dd5
                          child_tags)
Packit Service b74dd5
Packit Service b74dd5
    def test_lookup_len(self):
Packit Service b74dd5
        el_class = self._buildElementClass()
Packit Service b74dd5
        el_class.LEN = None
Packit Service b74dd5
        def lookup(doc, el):
Packit Service b74dd5
            if el_class.LEN is None:
Packit Service b74dd5
                el_class.LEN = len(el)
Packit Service b74dd5
            return el_class
Packit Service b74dd5
        self._setClassLookup(lookup)
Packit Service b74dd5
        root = self.XML(xml_str)
Packit Service b74dd5
        self.assertEqual(1, el_class.LEN)
Packit Service b74dd5
Packit Service b74dd5
    def test_lookup_bool(self):
Packit Service b74dd5
        el_class = self._buildElementClass()
Packit Service b74dd5
        el_class.TRUE = None
Packit Service b74dd5
        def lookup(doc, el):
Packit Service b74dd5
            if el_class.TRUE is None:
Packit Service b74dd5
                el_class.TRUE = bool(el)
Packit Service b74dd5
            return el_class
Packit Service b74dd5
        self._setClassLookup(lookup)
Packit Service b74dd5
        root = self.XML(xml_str)
Packit Service b74dd5
        self.assertTrue(el_class.TRUE)
Packit Service b74dd5
Packit Service b74dd5
    def test_lookup_get(self):
Packit Service b74dd5
        el_class = self._buildElementClass()
Packit Service b74dd5
        el_class.VAL = None
Packit Service b74dd5
        def lookup(doc, el):
Packit Service b74dd5
            if el_class.VAL is None:
Packit Service b74dd5
                el_class.VAL = el[0].get('a1')
Packit Service b74dd5
            return el_class
Packit Service b74dd5
        self._setClassLookup(lookup)
Packit Service b74dd5
        root = self.XML(xml_str)
Packit Service b74dd5
        self.assertNotEqual(None, el_class.VAL)
Packit Service b74dd5
        self.assertEqual(root[0].get('a1'), el_class.VAL)
Packit Service b74dd5
Packit Service b74dd5
    def test_lookup_get_default(self):
Packit Service b74dd5
        el_class = self._buildElementClass()
Packit Service b74dd5
        default = str(id(el_class))
Packit Service b74dd5
        el_class.VAL = None
Packit Service b74dd5
        def lookup(doc, el):
Packit Service b74dd5
            if el_class.VAL is None:
Packit Service b74dd5
                el_class.VAL = el[0].get('unknownattribute', default)
Packit Service b74dd5
            return el_class
Packit Service b74dd5
        self._setClassLookup(lookup)
Packit Service b74dd5
        root = self.XML(xml_str)
Packit Service b74dd5
        self.assertEqual(default, el_class.VAL)
Packit Service b74dd5
Packit Service b74dd5
    def test_lookup_getchildren(self):
Packit Service b74dd5
        el_class = self._buildElementClass()
Packit Service b74dd5
        el_class.CHILD_TAGS = None
Packit Service b74dd5
        def lookup(doc, el):
Packit Service b74dd5
            if el_class.CHILD_TAGS is None:
Packit Service b74dd5
                el_class.CHILD_TAGS = [ c.tag for c in el.getchildren() ]
Packit Service b74dd5
            return el_class
Packit Service b74dd5
        self._setClassLookup(lookup)
Packit Service b74dd5
        root = self.XML(xml_str)
Packit Service b74dd5
        child_tags = root.CHILD_TAGS
Packit Service b74dd5
        self.assertNotEqual(None, child_tags)
Packit Service b74dd5
        self.assertEqual([ c.tag for c in root.getchildren() ],
Packit Service b74dd5
                          child_tags)
Packit Service b74dd5
Packit Service b74dd5
    def test_lookup_iter_children(self):
Packit Service b74dd5
        el_class = self._buildElementClass()
Packit Service b74dd5
        el_class.CHILD_TAGS = None
Packit Service b74dd5
        def lookup(doc, el):
Packit Service b74dd5
            if el_class.CHILD_TAGS is None:
Packit Service b74dd5
                el_class.CHILD_TAGS = [ c.tag for c in el ]
Packit Service b74dd5
            return el_class
Packit Service b74dd5
        self._setClassLookup(lookup)
Packit Service b74dd5
        root = self.XML(xml_str)
Packit Service b74dd5
        child_tags = root.CHILD_TAGS
Packit Service b74dd5
        self.assertNotEqual(None, child_tags)
Packit Service b74dd5
        self.assertEqual([ c.tag for c in root.getchildren() ],
Packit Service b74dd5
                          child_tags)
Packit Service b74dd5
Packit Service b74dd5
    def test_lookup_iterchildren(self):
Packit Service b74dd5
        el_class = self._buildElementClass()
Packit Service b74dd5
        el_class.CHILD_TAGS = None
Packit Service b74dd5
        def lookup(doc, el):
Packit Service b74dd5
            if el_class.CHILD_TAGS is None:
Packit Service b74dd5
                el_class.CHILD_TAGS = [ c.tag for c in el.iterchildren() ]
Packit Service b74dd5
            return el_class
Packit Service b74dd5
        self._setClassLookup(lookup)
Packit Service b74dd5
        root = self.XML(xml_str)
Packit Service b74dd5
        child_tags = root.CHILD_TAGS
Packit Service b74dd5
        self.assertNotEqual(None, child_tags)
Packit Service b74dd5
        self.assertEqual([ c.tag for c in root.getchildren() ],
Packit Service b74dd5
                          child_tags)
Packit Service b74dd5
Packit Service b74dd5
    def test_lookup_iterchildren_tag(self):
Packit Service b74dd5
        el_class = self._buildElementClass()
Packit Service b74dd5
        el_class.CHILD_TAGS = None
Packit Service b74dd5
        def lookup(doc, el):
Packit Service b74dd5
            if not el_class.CHILD_TAGS:
Packit Service b74dd5
                el_class.CHILD_TAGS = [
Packit Service b74dd5
                    c.tag for c in el.iterchildren(tag='{objectified}c2') ]
Packit Service b74dd5
            return el_class
Packit Service b74dd5
        self._setClassLookup(lookup)
Packit Service b74dd5
Packit Service b74dd5
        root = self.XML(xml_str)
Packit Service b74dd5
        child_tags = root.CHILD_TAGS
Packit Service b74dd5
        self.assertNotEqual(None, child_tags)
Packit Service b74dd5
        self.assertEqual([], child_tags)
Packit Service b74dd5
Packit Service b74dd5
        c1 = root[0]
Packit Service b74dd5
        child_tags = root.CHILD_TAGS
Packit Service b74dd5
        self.assertNotEqual(None, child_tags)
Packit Service b74dd5
        self.assertNotEqual([], child_tags)
Packit Service b74dd5
        self.assertEqual(
Packit Service b74dd5
            [ c.tag for c in root[0].iterchildren(tag='{objectified}c2') ],
Packit Service b74dd5
            child_tags)
Packit Service b74dd5
Packit Service b74dd5
    def test_lookup_getparent(self):
Packit Service b74dd5
        el_class = self._buildElementClass()
Packit Service b74dd5
        el_class.PARENT = None
Packit Service b74dd5
        def lookup(doc, el):
Packit Service b74dd5
            if el_class.PARENT is None:
Packit Service b74dd5
                el_class.PARENT = el[0].getparent().tag
Packit Service b74dd5
            return el_class
Packit Service b74dd5
        self._setClassLookup(lookup)
Packit Service b74dd5
        root = self.XML(xml_str)
Packit Service b74dd5
        self.assertEqual(root.tag, root.PARENT)
Packit Service b74dd5
Packit Service b74dd5
    def test_lookup_getnext(self):
Packit Service b74dd5
        el_class = self._buildElementClass()
Packit Service b74dd5
        el_class.NEXT = None
Packit Service b74dd5
        def lookup(doc, el):
Packit Service b74dd5
            if el_class.NEXT is None:
Packit Service b74dd5
                el_class.NEXT = el[0][1].getnext().tag
Packit Service b74dd5
            return el_class
Packit Service b74dd5
        self._setClassLookup(lookup)
Packit Service b74dd5
        root = self.XML(xml_str)
Packit Service b74dd5
        self.assertNotEqual(None, el_class.NEXT)
Packit Service b74dd5
        self.assertEqual(root[0][1].getnext().tag, el_class.NEXT)
Packit Service b74dd5
Packit Service b74dd5
    def test_lookup_getprevious(self):
Packit Service b74dd5
        el_class = self._buildElementClass()
Packit Service b74dd5
        el_class.PREV = None
Packit Service b74dd5
        def lookup(doc, el):
Packit Service b74dd5
            if el_class.PREV is None:
Packit Service b74dd5
                el_class.PREV = el[0][1].getprevious().tag
Packit Service b74dd5
            return el_class
Packit Service b74dd5
        self._setClassLookup(lookup)
Packit Service b74dd5
        root = self.XML(xml_str)
Packit Service b74dd5
        self.assertNotEqual(None, el_class.PREV)
Packit Service b74dd5
        self.assertEqual(root[0][1].getprevious().tag, el_class.PREV)
Packit Service b74dd5
Packit Service b74dd5
    def test_comments_fallback(self):
Packit Service b74dd5
        def return_none(*args):
Packit Service b74dd5
            return None
Packit Service b74dd5
Packit Service b74dd5
        self._setClassLookup(return_none)
Packit Service b74dd5
        el = self.XML('')
Packit Service b74dd5
        self.assertEqual(el[0].tag, self.etree.Comment)
Packit Service b74dd5
        self.assertEqual(el[0].text, " hello world ")
Packit Service b74dd5
Packit Service b74dd5
Packit Service b74dd5
def test_suite():
Packit Service b74dd5
    suite = unittest.TestSuite()
Packit Service b74dd5
    suite.addTests([unittest.makeSuite(PyClassLookupTestCase)])
Packit Service b74dd5
    return suite
Packit Service b74dd5
Packit Service b74dd5
if __name__ == '__main__':
Packit Service b74dd5
    print('to test use test.py %s' % __file__)