diff options
Diffstat (limited to 'src/zope/interface/tests')
| -rw-r--r-- | src/zope/interface/tests/test_exceptions.py | 54 | ||||
| -rw-r--r-- | src/zope/interface/tests/test_verify.py | 33 |
2 files changed, 85 insertions, 2 deletions
diff --git a/src/zope/interface/tests/test_exceptions.py b/src/zope/interface/tests/test_exceptions.py index 34ee071..42ea7eb 100644 --- a/src/zope/interface/tests/test_exceptions.py +++ b/src/zope/interface/tests/test_exceptions.py @@ -85,10 +85,60 @@ class BrokenMethodImplementationTests(unittest.TestCase): dni = self._makeOne() self.assertEqual( str(dni), - "An object violates its contract in 'aMethod': I said so.") + "An object violates the contract of 'aMethod' because I said so.") def test___str__w_candidate(self): dni = self._makeOne('candidate') self.assertEqual( str(dni), - "The object 'candidate' violates its contract in 'aMethod': I said so.") + "The object 'candidate' violates the contract of 'aMethod' because I said so.") + + def test___repr__w_candidate(self): + dni = self._makeOne('candidate') + self.assertEqual( + repr(dni), + "BrokenMethodImplementation('aMethod', 'I said so', 'candidate')" + ) + + +class MultipleInvalidTests(unittest.TestCase): + + def _getTargetClass(self): + from zope.interface.exceptions import MultipleInvalid + return MultipleInvalid + + def _makeOne(self, excs): + iface = _makeIface() + return self._getTargetClass()(iface, 'target', excs) + + def test__str__(self): + from zope.interface.exceptions import BrokenMethodImplementation + excs = [ + BrokenMethodImplementation('aMethod', 'I said so'), + Exception("Regular exception") + ] + dni = self._makeOne(excs) + self.assertEqual( + str(dni), + "The object 'target' has failed to implement interface " + "<InterfaceClass zope.interface.tests.test_exceptions.IDummy>:\n" + " violates the contract of 'aMethod' because I said so\n" + " Regular exception" + ) + + def test__repr__(self): + from zope.interface.exceptions import BrokenMethodImplementation + excs = [ + BrokenMethodImplementation('aMethod', 'I said so'), + # Use multiple arguments to normalize repr; versions of Python + # prior to 3.7 add a trailing comma if there's just one. + Exception("Regular", "exception") + ] + dni = self._makeOne(excs) + self.assertEqual( + repr(dni), + "MultipleInvalid(<InterfaceClass zope.interface.tests.test_exceptions.IDummy>," + " 'target'," + " [BrokenMethodImplementation('aMethod', 'I said so', '<Not Given>')," + " Exception('Regular', 'exception')])" + ) diff --git a/src/zope/interface/tests/test_verify.py b/src/zope/interface/tests/test_verify.py index 65e390a..3a68d20 100644 --- a/src/zope/interface/tests/test_verify.py +++ b/src/zope/interface/tests/test_verify.py @@ -554,6 +554,39 @@ class Test_verifyClass(unittest.TestCase): self._callFUT(IReadSequence, tuple, tentative=True) + def test_multiple_invalid(self): + from zope.interface.exceptions import MultipleInvalid + from zope.interface.exceptions import DoesNotImplement + from zope.interface.exceptions import BrokenImplementation + from zope.interface import Interface + from zope.interface import classImplements + + class ISeveralMethods(Interface): + def meth1(arg1): + "Method 1" + def meth2(arg1): + "Method 2" + + class SeveralMethods(object): + pass + + with self.assertRaises(MultipleInvalid) as exc: + self._callFUT(ISeveralMethods, SeveralMethods) + + ex = exc.exception + self.assertEqual(3, len(ex.exceptions)) + self.assertIsInstance(ex.exceptions[0], DoesNotImplement) + self.assertIsInstance(ex.exceptions[1], BrokenImplementation) + self.assertIsInstance(ex.exceptions[2], BrokenImplementation) + + # If everything else is correct, only the single error is raised without + # the wrapper. + classImplements(SeveralMethods, ISeveralMethods) + SeveralMethods.meth1 = lambda self, arg1: "Hi" + + with self.assertRaises(BrokenImplementation): + self._callFUT(ISeveralMethods, SeveralMethods) + class Test_verifyObject(Test_verifyClass): @classmethod |
