From bb938498b806915cfa6686dcf718925ac4d194d5 Mon Sep 17 00:00:00 2001 From: Tres Seaver Date: Fri, 6 Apr 2012 22:49:03 +0000 Subject: Explicit unittest coverage. Drop doctests, whose examples are now part of the narrative docs. --- src/zope/i18nmessageid/message.py | 81 ++-------------------- src/zope/i18nmessageid/tests.py | 137 +++++++++++++++++++++++++++++--------- 2 files changed, 111 insertions(+), 107 deletions(-) (limited to 'src') diff --git a/src/zope/i18nmessageid/message.py b/src/zope/i18nmessageid/message.py index 8b743d5..88eef4d 100644 --- a/src/zope/i18nmessageid/message.py +++ b/src/zope/i18nmessageid/message.py @@ -11,7 +11,7 @@ # FOR A PARTICULAR PURPOSE. # ############################################################################## -"""I18n Messages +"""I18n Messages and factories. """ __docformat__ = "reStructuredText" @@ -23,77 +23,6 @@ class Message(unicode): display when there is no translation. domain may be None meaning there is no translation domain. default may also be None, in which case the message id itself implicitly serves as the default text. - - These are the doc tests from message.txt. Note that we have to create the - message manually since MessageFactory would return the C implementation. - - >>> from zope.i18nmessageid.message import Message - >>> robot = Message(u"robot-message", 'futurama', u"${name} is a robot.") - - >>> robot == u'robot-message' - True - >>> isinstance(robot, unicode) - True - - >>> robot.default == u'${name} is a robot.' - True - >>> robot.mapping - - >>> robot.domain = "planetexpress" - Traceback (most recent call last): - ... - TypeError: readonly attribute - - >>> robot.default = u"${name} is not a robot." - Traceback (most recent call last): - ... - TypeError: readonly attribute - - >>> robot.mapping = {u'name': u'Bender'} - Traceback (most recent call last): - ... - TypeError: readonly attribute - - >>> new_robot = Message(robot, mapping={u'name': u'Bender'}) - >>> new_robot == u'robot-message' - True - >>> new_robot.domain == 'futurama' - True - >>> new_robot.default == u'${name} is a robot.' - True - >>> new_robot.mapping == {u'name': u'Bender'} - True - - >>> callable, args = new_robot.__reduce__() - >>> callable is Message - True - >>> args == (u'robot-message', - ... 'futurama', - ... u'${name} is a robot.', - ... {u'name': u'Bender'}) - True - - >>> fembot = Message(u'fembot') - >>> callable, args = fembot.__reduce__() - >>> callable is Message - True - >>> args == (u'fembot', None, None, None) - True - - Check if pickling and unpickling works - >>> from pickle import dumps, loads - >>> pystate = dumps(new_robot) - >>> pickle_bot = loads(pystate) - >>> (pickle_bot, - ... pickle_bot.domain, - ... pickle_bot.default, - ... pickle_bot.mapping) == (u'robot-message', - ... 'futurama', - ... u'${name} is a robot.', - ... {u'name': u'Bender'}) - True - >>> pickle_bot.__reduce__()[0] is Message - True """ __slots__ = ('domain', 'default', 'mapping', '_readonly') @@ -125,13 +54,13 @@ class Message(unicode): else: return unicode.__setattr__(self, key, value) - def __reduce__(self): - return self.__class__, self.__getstate__() - def __getstate__(self): return unicode(self), self.domain, self.default, self.mapping -# save a copy for the unit tests + def __reduce__(self): + return self.__class__, self.__getstate__() + +# Name the fallback Python implementation to make it easier to test. pyMessage = Message try: diff --git a/src/zope/i18nmessageid/tests.py b/src/zope/i18nmessageid/tests.py index 4611855..4794cd5 100644 --- a/src/zope/i18nmessageid/tests.py +++ b/src/zope/i18nmessageid/tests.py @@ -14,19 +14,109 @@ """Message ID tests. """ import unittest -from doctest import DocFileSuite -from doctest import DocTestSuite -class PickleEqualityTests(unittest.TestCase): - def setUp(self): - # set the C version up as the used version - import zope.i18nmessageid.message - self.oldMessage = zope.i18nmessageid.message.Message +class PyMessageTests(unittest.TestCase): - def tearDown(self): - # set the original version back up as the used version - import zope.i18nmessageid.message - zope.i18nmessageid.message.Message = self.oldMessage + _TEST_REAOONLY = True + + def _getTargetClass(self): + from zope.i18nmessageid.message import pyMessage + return pyMessage + + def _makeOne(self, *args, **kw): + return self._getTargetClass()(*args, **kw) + + def test_ctor_defaults(self): + message = self._makeOne('testing') + self.assertEqual(message, 'testing') + self.assertEqual(message.domain, None) + self.assertEqual(message.default, None) + self.assertEqual(message.mapping, None) + if self._TEST_REAOONLY: + self.assertTrue(message._readonly) + + def test_ctor_explicit(self): + mapping = {'key': 'value'} + message = self._makeOne('testing', 'domain', 'default', mapping) + self.assertEqual(message, 'testing') + self.assertEqual(message.domain, 'domain') + self.assertEqual(message.default, 'default') + self.assertEqual(message.mapping, mapping) + if self._TEST_REAOONLY: + self.assertTrue(message._readonly) + + def test_ctor_copy(self): + mapping = {'key': 'value'} + source = self._makeOne('testing', 'domain', 'default', mapping) + message = self._makeOne(source) + self.assertEqual(message, 'testing') + self.assertEqual(message.domain, 'domain') + self.assertEqual(message.default, 'default') + self.assertEqual(message.mapping, mapping) + if self._TEST_REAOONLY: + self.assertTrue(message._readonly) + + def test_ctor_copy_w_overrides(self): + mapping = {'key': 'value'} + source = self._makeOne('testing') + message = self._makeOne(source, 'domain', 'default', mapping) + self.assertEqual(message, 'testing') + self.assertEqual(message.domain, 'domain') + self.assertEqual(message.default, 'default') + self.assertEqual(message.mapping, mapping) + if self._TEST_REAOONLY: + self.assertTrue(message._readonly) + + def test_domain_immutable(self): + message = self._makeOne('testing') + def _try(): + message.domain = 'domain' + self.assertRaises(TypeError, _try) + + def test_default_immutable(self): + message = self._makeOne('testing') + def _try(): + message.default = 'default' + self.assertRaises(TypeError, _try) + + def test_mapping_immutable(self): + mapping = {'key': 'value'} + message = self._makeOne('testing') + def _try(): + message.mapping = mapping + self.assertRaises(TypeError, _try) + + def test_unknown_immutable(self): + message = self._makeOne('testing') + def _try(): + message.unknown = 'unknown' + self.assertRaises(TypeError, _try) + + def test___getstate__(self): + mapping = {'key': 'value'} + source = self._makeOne('testing') + message = self._makeOne(source, 'domain', 'default', mapping) + state = message.__getstate__() + self.assertEqual(state, ('testing', 'domain', 'default', mapping)) + + def test___reduce__(self): + mapping = {'key': 'value'} + source = self._makeOne('testing') + message = self._makeOne(source, 'domain', 'default', mapping) + klass, state = message.__reduce__() + self.assertTrue(klass is self._getTargetClass()) + self.assertEqual(state, ('testing', 'domain', 'default', mapping)) + +class MessageTests(PyMessageTests): + + _TEST_REAOONLY = False + + def _getTargetClass(self): + from zope.i18nmessageid.message import Message + return Message + + +class Functional(unittest.TestCase): def test_message_pickling(self): from zope.i18nmessageid.message import pyMessage as Message @@ -117,23 +207,8 @@ class PickleEqualityTests(unittest.TestCase): # Both pickle states should be equal self.assertEqual(pystate, cstate) -try: - from zope.i18nmessageid._zope_i18nmessageid_message import ( - Message as import_test) - def test_suite(): - return unittest.TestSuite(( - DocTestSuite('zope.i18nmessageid.message'), - DocFileSuite('messages.txt', package='zope.i18nmessageid'), - unittest.makeSuite(PickleEqualityTests), - )) -except ImportError, e: # pragma: no cover - print '=' * 80 - print "Could not import C version:" - print e - print '=' * 80 - def test_suite(): - return unittest.TestSuite(( - DocTestSuite('zope.i18nmessageid.message'), - DocFileSuite('messages.txt', package='zope.i18nmessageid'), - )) - + +def test_suite(): + return unittest.TestSuite(( + unittest.makeSuite(PyMessageTests), + )) -- cgit v1.2.1