Blame src/lxml/tests/test_nsclasses.py

Packit Service b74dd5
# -*- coding: utf-8 -*-
Packit Service b74dd5
Packit Service b74dd5
"""
Packit Service b74dd5
Test cases related to namespace implementation classes and the
Packit Service b74dd5
namespace registry mechanism
Packit Service b74dd5
"""
Packit Service b74dd5
Packit Service b74dd5
import unittest, sys, os.path
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, HelperTestCase, _bytes
Packit Service b74dd5
from common_imports import doctest, make_doctest
Packit Service b74dd5
Packit Service b74dd5
class ETreeNamespaceClassesTestCase(HelperTestCase):
Packit Service b74dd5
    
Packit Service b74dd5
    class default_class(etree.ElementBase):
Packit Service b74dd5
        pass
Packit Service b74dd5
    class maeh_class(etree.ElementBase):
Packit Service b74dd5
        def maeh(self):
Packit Service b74dd5
            return 'maeh'
Packit Service b74dd5
    class bluff_class(etree.ElementBase):
Packit Service b74dd5
        def bluff(self):
Packit Service b74dd5
            return 'bluff'
Packit Service b74dd5
Packit Service b74dd5
    def setUp(self):
Packit Service b74dd5
        super(ETreeNamespaceClassesTestCase, self).setUp()
Packit Service b74dd5
        lookup = etree.ElementNamespaceClassLookup()
Packit Service b74dd5
        self.Namespace = lookup.get_namespace
Packit Service b74dd5
        parser = etree.XMLParser()
Packit Service b74dd5
        parser.set_element_class_lookup(lookup)
Packit Service b74dd5
        etree.set_default_parser(parser)
Packit Service b74dd5
Packit Service b74dd5
    def tearDown(self):
Packit Service b74dd5
        etree.set_default_parser()
Packit Service b74dd5
        del self.Namespace
Packit Service b74dd5
        super(ETreeNamespaceClassesTestCase, self).tearDown()
Packit Service b74dd5
Packit Service b74dd5
    def test_registry(self):
Packit Service b74dd5
        ns = self.Namespace('ns01')
Packit Service b74dd5
        ns['maeh'] = self.maeh_class
Packit Service b74dd5
Packit Service b74dd5
        self.Namespace('ns01').clear()
Packit Service b74dd5
Packit Service b74dd5
        self.Namespace('ns02').update({'maeh'  : self.maeh_class})
Packit Service b74dd5
        self.Namespace('ns03').update({'bluff' : self.bluff_class}.items())
Packit Service b74dd5
        self.Namespace('ns02').clear()
Packit Service b74dd5
        self.Namespace('ns03').clear()
Packit Service b74dd5
Packit Service b74dd5
    def test_ns_classes(self):
Packit Service b74dd5
        bluff_dict = {'bluff' : self.bluff_class}
Packit Service b74dd5
        maeh_dict  = {'maeh'  : self.maeh_class}
Packit Service b74dd5
Packit Service b74dd5
        self.Namespace('ns10').update(bluff_dict)
Packit Service b74dd5
Packit Service b74dd5
        tree = self.parse(_bytes('<bluff xmlns="ns10"><ns11:maeh xmlns:ns11="ns11"/></bluff>'))
Packit Service b74dd5
Packit Service b74dd5
        el = tree.getroot()
Packit Service b74dd5
        self.assertTrue(isinstance(el, etree.ElementBase))
Packit Service b74dd5
        self.assertTrue(hasattr(el, 'bluff'))
Packit Service b74dd5
        self.assertFalse(hasattr(el[0], 'maeh'))
Packit Service b74dd5
        self.assertFalse(hasattr(el[0], 'bluff'))
Packit Service b74dd5
        self.assertEqual(el.bluff(), 'bluff')
Packit Service b74dd5
        del el
Packit Service b74dd5
Packit Service b74dd5
        self.Namespace('ns11').update(maeh_dict)
Packit Service b74dd5
        el = tree.getroot()
Packit Service b74dd5
        self.assertTrue(hasattr(el, 'bluff'))
Packit Service b74dd5
        self.assertTrue(hasattr(el[0], 'maeh'))
Packit Service b74dd5
        self.assertEqual(el.bluff(), 'bluff')
Packit Service b74dd5
        self.assertEqual(el[0].maeh(), 'maeh')
Packit Service b74dd5
        del el
Packit Service b74dd5
Packit Service b74dd5
        self.Namespace('ns10').clear()
Packit Service b74dd5
Packit Service b74dd5
        tree = self.parse(_bytes('<bluff xmlns="ns10"><ns11:maeh xmlns:ns11="ns11"/></bluff>'))
Packit Service b74dd5
        el = tree.getroot()
Packit Service b74dd5
        self.assertFalse(hasattr(el, 'bluff'))
Packit Service b74dd5
        self.assertFalse(hasattr(el, 'maeh'))
Packit Service b74dd5
        self.assertFalse(hasattr(el[0], 'bluff'))
Packit Service b74dd5
        self.assertTrue(hasattr(el[0], 'maeh'))
Packit Service b74dd5
Packit Service b74dd5
        self.Namespace('ns11').clear()
Packit Service b74dd5
Packit Service b74dd5
    def test_default_tagname(self):
Packit Service b74dd5
        bluff_dict = {
Packit Service b74dd5
            None   : self.bluff_class,
Packit Service b74dd5
            'maeh' : self.maeh_class
Packit Service b74dd5
            }
Packit Service b74dd5
Packit Service b74dd5
        ns = self.Namespace("uri:nsDefClass")
Packit Service b74dd5
        ns.update(bluff_dict)
Packit Service b74dd5
Packit Service b74dd5
        tree = self.parse(_bytes('''
Packit Service b74dd5
            <test xmlns="bla" xmlns:ns1="uri:nsDefClass" xmlns:ns2="uri:nsDefClass">
Packit Service b74dd5
              <ns2:el1/><ns1:el2/><ns1:maeh/><ns2:maeh/><maeh/>
Packit Service b74dd5
            </test>
Packit Service b74dd5
            '''))
Packit Service b74dd5
Packit Service b74dd5
        el = tree.getroot()
Packit Service b74dd5
        self.assertFalse(isinstance(el, etree.ElementBase))
Packit Service b74dd5
        for child in el[:-1]:
Packit Service b74dd5
            self.assertTrue(isinstance(child, etree.ElementBase), child.tag)
Packit Service b74dd5
        self.assertFalse(isinstance(el[-1], etree.ElementBase))
Packit Service b74dd5
Packit Service b74dd5
        self.assertTrue(hasattr(el[0], 'bluff'))
Packit Service b74dd5
        self.assertTrue(hasattr(el[1], 'bluff'))
Packit Service b74dd5
        self.assertTrue(hasattr(el[2], 'maeh'))
Packit Service b74dd5
        self.assertTrue(hasattr(el[3], 'maeh'))
Packit Service b74dd5
        self.assertFalse(hasattr(el[4], 'maeh'))
Packit Service b74dd5
        del el
Packit Service b74dd5
Packit Service b74dd5
        ns.clear()
Packit Service b74dd5
Packit Service b74dd5
    def test_create_element(self):
Packit Service b74dd5
        bluff_dict = {'bluff' : self.bluff_class}
Packit Service b74dd5
        self.Namespace('ns20').update(bluff_dict)
Packit Service b74dd5
Packit Service b74dd5
        maeh_dict  = {'maeh'  : self.maeh_class}
Packit Service b74dd5
        self.Namespace('ns21').update(maeh_dict)
Packit Service b74dd5
Packit Service b74dd5
        el = etree.Element("{ns20}bluff")
Packit Service b74dd5
        self.assertTrue(hasattr(el, 'bluff'))
Packit Service b74dd5
Packit Service b74dd5
        child = etree.SubElement(el, "{ns21}maeh")
Packit Service b74dd5
        self.assertTrue(hasattr(child, 'maeh'))
Packit Service b74dd5
        child = etree.SubElement(el, "{ns20}bluff")
Packit Service b74dd5
        self.assertTrue(hasattr(child, 'bluff'))
Packit Service b74dd5
        child = etree.SubElement(el, "{ns21}bluff")
Packit Service b74dd5
        self.assertFalse(hasattr(child, 'bluff'))
Packit Service b74dd5
        self.assertFalse(hasattr(child, 'maeh'))
Packit Service b74dd5
Packit Service b74dd5
        self.assertTrue(hasattr(el[0], 'maeh'))
Packit Service b74dd5
        self.assertTrue(hasattr(el[1], 'bluff'))
Packit Service b74dd5
        self.assertFalse(hasattr(el[2], 'bluff'))
Packit Service b74dd5
        self.assertFalse(hasattr(el[2], 'maeh'))
Packit Service b74dd5
Packit Service b74dd5
        self.assertEqual(el.bluff(), 'bluff')
Packit Service b74dd5
        self.assertEqual(el[0].maeh(), 'maeh')
Packit Service b74dd5
        self.assertEqual(el[1].bluff(), 'bluff')
Packit Service b74dd5
Packit Service b74dd5
        self.Namespace('ns20').clear()
Packit Service b74dd5
        self.Namespace('ns21').clear()
Packit Service b74dd5
Packit Service b74dd5
    def test_create_element_default(self):
Packit Service b74dd5
        bluff_dict = {None : self.bluff_class}
Packit Service b74dd5
        self.Namespace('ns30').update(bluff_dict)
Packit Service b74dd5
Packit Service b74dd5
        maeh_dict  = {'maeh'  : self.maeh_class}
Packit Service b74dd5
        self.Namespace(None).update(maeh_dict)
Packit Service b74dd5
Packit Service b74dd5
        el = etree.Element("{ns30}bluff")
Packit Service b74dd5
        etree.SubElement(el, "maeh")
Packit Service b74dd5
        self.assertTrue(hasattr(el, 'bluff'))
Packit Service b74dd5
        self.assertTrue(hasattr(el[0], 'maeh'))
Packit Service b74dd5
        self.assertEqual(el.bluff(), 'bluff')
Packit Service b74dd5
        self.assertEqual(el[0].maeh(), 'maeh')
Packit Service b74dd5
Packit Service b74dd5
        self.Namespace(None).clear()
Packit Service b74dd5
        self.Namespace('ns30').clear()
Packit Service b74dd5
Packit Service b74dd5
    def test_element_creation(self):
Packit Service b74dd5
        default, bluff, maeh = (
Packit Service b74dd5
            self.default_class, self.bluff_class, self.maeh_class)
Packit Service b74dd5
Packit Service b74dd5
        class honk(etree.ElementBase):
Packit Service b74dd5
            TAG = 'HONK'
Packit Service b74dd5
            NAMESPACE = 'http://a.b/c'
Packit Service b74dd5
Packit Service b74dd5
        el = default(
Packit Service b74dd5
            "test",
Packit Service b74dd5
            "text",
Packit Service b74dd5
            bluff(honk, "TaIL", maeh),
Packit Service b74dd5
            maeh("TeXT", bluff, honk(), "TAiL"),
Packit Service b74dd5
            "Tail")
Packit Service b74dd5
Packit Service b74dd5
        self.assertEqual('default_class', el.tag)
Packit Service b74dd5
        self.assertEqual('testtext', el.text)
Packit Service b74dd5
        self.assertEqual(None, el.tail)
Packit Service b74dd5
        self.assertEqual(2, len(el))
Packit Service b74dd5
        self.assertEqual(7, len(list(el.iter())))
Packit Service b74dd5
Packit Service b74dd5
        self.assertEqual('bluff_class', el[0].tag)
Packit Service b74dd5
        self.assertEqual('TaIL', el[0][0].tail)
Packit Service b74dd5
        self.assertEqual('TaIL', ''.join(el[0].itertext()))
Packit Service b74dd5
        self.assertEqual('{http://a.b/c}HONK',
Packit Service b74dd5
                          el[0][0].tag)
Packit Service b74dd5
        self.assertEqual('maeh_class',
Packit Service b74dd5
                          el[0][1].tag)
Packit Service b74dd5
Packit Service b74dd5
        self.assertEqual('maeh_class', el[1].tag)
Packit Service b74dd5
        self.assertEqual('TeXT', el[1].text)
Packit Service b74dd5
        self.assertEqual('bluff_class', el[1][0].tag)
Packit Service b74dd5
        self.assertEqual('{http://a.b/c}HONK', el[1][1].tag)
Packit Service b74dd5
        self.assertEqual('TAiL', el[1][1].tail)
Packit Service b74dd5
Packit Service b74dd5
        self.assertEqual('TeXTTAiL',
Packit Service b74dd5
                          ''.join(el[1].itertext()))
Packit Service b74dd5
        self.assertEqual('Tail', el[1].tail)
Packit Service b74dd5
        self.assertEqual('TAiL', el[1][1].tail)
Packit Service b74dd5
        self.assertEqual('bluff_class', el[1][0].tag)
Packit Service b74dd5
        self.assertEqual('{http://a.b/c}HONK', el[1][1].tag)
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(ETreeNamespaceClassesTestCase)])
Packit Service b74dd5
    suite.addTests(
Packit Service b74dd5
        [make_doctest('../../../doc/element_classes.txt')])
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__)