File: //lib/python3/dist-packages/genshi/tests/core.py
# -*- coding: utf-8 -*-
#
# Copyright (C) 2006-2009 Edgewall Software
# All rights reserved.
#
# This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms
# are also available at http://genshi.edgewall.org/wiki/License.
#
# This software consists of voluntary contributions made by many
# individuals. For the exact contribution history, see the revision
# history and logs, available at http://genshi.edgewall.org/log/.
import pickle
import unittest
from genshi import core
from genshi.core import Markup, Attrs, Namespace, QName, escape, unescape
from genshi.input import XML
from genshi.compat import StringIO, BytesIO, IS_PYTHON2
from genshi.tests.test_utils import doctest_suite
class StreamTestCase(unittest.TestCase):
def test_render_utf8(self):
xml = XML('<li>Über uns</li>')
self.assertEqual(u'<li>Über uns</li>'.encode('utf-8'), xml.render(encoding='utf-8'))
def test_render_unicode(self):
xml = XML('<li>Über uns</li>')
self.assertEqual(u'<li>Über uns</li>', xml.render())
self.assertEqual(u'<li>Über uns</li>', xml.render(encoding=None))
def test_render_ascii(self):
xml = XML('<li>Über uns</li>')
self.assertEqual(u'<li>Über uns</li>'.encode('ascii'), xml.render(encoding='ascii'))
def test_render_output_stream_utf8(self):
xml = XML('<li>Über uns</li>')
strio = BytesIO()
self.assertEqual(None, xml.render(encoding='utf-8', out=strio))
self.assertEqual(u'<li>Über uns</li>'.encode('utf-8'), strio.getvalue())
def test_render_output_stream_unicode(self):
xml = XML('<li>Über uns</li>')
strio = StringIO()
self.assertEqual(None, xml.render(encoding=None, out=strio))
self.assertEqual(u'<li>Über uns</li>', strio.getvalue())
def test_pickle(self):
xml = XML('<li>Foo</li>')
buf = BytesIO()
pickle.dump(xml, buf, 2)
buf.seek(0)
xml = pickle.load(buf)
self.assertEqual('<li>Foo</li>', xml.render(encoding=None))
class MarkupTestCase(unittest.TestCase):
def test_new_with_encoding(self):
markup = Markup(u'Döner'.encode('utf-8'), encoding='utf-8')
# mimic Markup.__repr__ when constructing output for Python 2/3 compatibility
self.assertEqual("<Markup %r>" % u'D\u00f6ner', repr(markup))
def test_repr(self):
markup = Markup('foo')
expected_foo = "u'foo'" if IS_PYTHON2 else "'foo'"
self.assertEqual("<Markup %s>" % expected_foo, repr(markup))
def test_escape(self):
markup = escape('<b>"&"</b>')
assert type(markup) is Markup
self.assertEqual('<b>"&"</b>', markup)
def test_escape_noquotes(self):
markup = escape('<b>"&"</b>', quotes=False)
assert type(markup) is Markup
self.assertEqual('<b>"&"</b>', markup)
def test_unescape_markup(self):
string = '<b>"&"</b>'
markup = Markup.escape(string)
assert type(markup) is Markup
self.assertEqual(string, unescape(markup))
def test_Markup_escape_None_noquotes(self):
markup = Markup.escape(None, False)
assert type(markup) is Markup
self.assertEqual('', markup)
def test_add_str(self):
markup = Markup('<b>foo</b>') + '<br/>'
assert type(markup) is Markup
self.assertEqual('<b>foo</b><br/>', markup)
def test_add_markup(self):
markup = Markup('<b>foo</b>') + Markup('<br/>')
assert type(markup) is Markup
self.assertEqual('<b>foo</b><br/>', markup)
def test_add_reverse(self):
markup = '<br/>' + Markup('<b>bar</b>')
assert type(markup) is Markup
self.assertEqual('<br/><b>bar</b>', markup)
def test_mod(self):
markup = Markup('<b>%s</b>') % '&'
assert type(markup) is Markup
self.assertEqual('<b>&</b>', markup)
def test_mod_multi(self):
markup = Markup('<b>%s</b> %s') % ('&', 'boo')
assert type(markup) is Markup
self.assertEqual('<b>&</b> boo', markup)
def test_mod_mapping(self):
markup = Markup('<b>%(foo)s</b>') % {'foo': '&'}
assert type(markup) is Markup
self.assertEqual('<b>&</b>', markup)
def test_mod_noescape(self):
markup = Markup('<b>%(amp)s</b>') % {'amp': Markup('&')}
assert type(markup) is Markup
self.assertEqual('<b>&</b>', markup)
def test_mul(self):
markup = Markup('<b>foo</b>') * 2
assert type(markup) is Markup
self.assertEqual('<b>foo</b><b>foo</b>', markup)
def test_mul_reverse(self):
markup = 2 * Markup('<b>foo</b>')
assert type(markup) is Markup
self.assertEqual('<b>foo</b><b>foo</b>', markup)
def test_join(self):
markup = Markup('<br />').join(['foo', '<bar />', Markup('<baz />')])
assert type(markup) is Markup
self.assertEqual('foo<br /><bar /><br /><baz />', markup)
def test_join_over_iter(self):
items = ['foo', '<bar />', Markup('<baz />')]
markup = Markup('<br />').join(i for i in items)
self.assertEqual('foo<br /><bar /><br /><baz />', markup)
def test_stripentities_all(self):
markup = Markup('& j').stripentities()
assert type(markup) is Markup
self.assertEqual('& j', markup)
def test_stripentities_keepxml(self):
markup = Markup('& j').stripentities(keepxmlentities=True)
assert type(markup) is Markup
self.assertEqual('& j', markup)
def test_striptags_empty(self):
markup = Markup('<br />').striptags()
assert type(markup) is Markup
self.assertEqual('', markup)
def test_striptags_mid(self):
markup = Markup('<a href="#">fo<br />o</a>').striptags()
assert type(markup) is Markup
self.assertEqual('foo', markup)
def test_pickle(self):
markup = Markup('foo')
buf = BytesIO()
pickle.dump(markup, buf, 2)
buf.seek(0)
expected_foo = "u'foo'" if IS_PYTHON2 else "'foo'"
self.assertEqual("<Markup %s>" % expected_foo, repr(pickle.load(buf)))
class AttrsTestCase(unittest.TestCase):
def test_pickle(self):
attrs = Attrs([("attr1", "foo"), ("attr2", "bar")])
buf = BytesIO()
pickle.dump(attrs, buf, 2)
buf.seek(0)
unpickled = pickle.load(buf)
self.assertEqual("Attrs([('attr1', 'foo'), ('attr2', 'bar')])",
repr(unpickled))
def test_non_ascii(self):
attrs_tuple = Attrs([("attr1", u"föö"), ("attr2", u"bär")]).totuple()
self.assertEqual(u'fööbär', attrs_tuple[1])
class NamespaceTestCase(unittest.TestCase):
def test_repr(self):
self.assertEqual("Namespace('http://www.example.org/namespace')",
repr(Namespace('http://www.example.org/namespace')))
def test_repr_eval(self):
ns = Namespace('http://www.example.org/namespace')
self.assertEqual(eval(repr(ns)), ns)
def test_repr_eval_non_ascii(self):
ns = Namespace(u'http://www.example.org/nämespäcé')
self.assertEqual(eval(repr(ns)), ns)
def test_pickle(self):
ns = Namespace('http://www.example.org/namespace')
buf = BytesIO()
pickle.dump(ns, buf, 2)
buf.seek(0)
unpickled = pickle.load(buf)
self.assertEqual("Namespace('http://www.example.org/namespace')",
repr(unpickled))
self.assertEqual('http://www.example.org/namespace', unpickled.uri)
class QNameTestCase(unittest.TestCase):
def test_pickle(self):
qname = QName('http://www.example.org/namespace}elem')
buf = BytesIO()
pickle.dump(qname, buf, 2)
buf.seek(0)
unpickled = pickle.load(buf)
self.assertEqual('{http://www.example.org/namespace}elem', unpickled)
self.assertEqual('http://www.example.org/namespace',
unpickled.namespace)
self.assertEqual('elem', unpickled.localname)
def test_repr(self):
self.assertEqual("QName('elem')", repr(QName('elem')))
self.assertEqual("QName('http://www.example.org/namespace}elem')",
repr(QName('http://www.example.org/namespace}elem')))
def test_repr_eval(self):
qn = QName('elem')
self.assertEqual(eval(repr(qn)), qn)
def test_repr_eval_non_ascii(self):
qn = QName(u'élem')
self.assertEqual(eval(repr(qn)), qn)
def test_leading_curly_brace(self):
qname = QName('{http://www.example.org/namespace}elem')
self.assertEqual('http://www.example.org/namespace', qname.namespace)
self.assertEqual('elem', qname.localname)
def test_curly_brace_equality(self):
qname1 = QName('{http://www.example.org/namespace}elem')
qname2 = QName('http://www.example.org/namespace}elem')
self.assertEqual(qname1.namespace, qname2.namespace)
self.assertEqual(qname1.localname, qname2.localname)
self.assertEqual(qname1, qname2)
def suite():
suite = unittest.TestSuite()
suite.addTest(unittest.makeSuite(StreamTestCase, 'test'))
suite.addTest(unittest.makeSuite(MarkupTestCase, 'test'))
suite.addTest(unittest.makeSuite(NamespaceTestCase, 'test'))
suite.addTest(unittest.makeSuite(AttrsTestCase, 'test'))
suite.addTest(unittest.makeSuite(QNameTestCase, 'test'))
suite.addTest(doctest_suite(core))
return suite
if __name__ == '__main__':
unittest.main(defaultTest='suite')