summaryrefslogtreecommitdiffstats
path: root/lib/testtools/testtools/matchers.py
diff options
context:
space:
mode:
Diffstat (limited to 'lib/testtools/testtools/matchers.py')
-rw-r--r--lib/testtools/testtools/matchers.py36
1 files changed, 18 insertions, 18 deletions
diff --git a/lib/testtools/testtools/matchers.py b/lib/testtools/testtools/matchers.py
index 50cc50d31df..06b348c6d98 100644
--- a/lib/testtools/testtools/matchers.py
+++ b/lib/testtools/testtools/matchers.py
@@ -32,6 +32,8 @@ import operator
from pprint import pformat
import sys
+from testtools.compat import classtypes, _error_repr, isbaseexception
+
class Matcher(object):
"""A pattern matcher.
@@ -314,7 +316,7 @@ class MismatchesAll(Mismatch):
descriptions = ["Differences: ["]
for mismatch in self.mismatches:
descriptions.append(mismatch.describe())
- descriptions.append("]\n")
+ descriptions.append("]")
return '\n'.join(descriptions)
@@ -359,25 +361,24 @@ class MatchesException(Matcher):
"""
Matcher.__init__(self)
self.expected = exception
-
- def _expected_type(self):
- if type(self.expected) is type:
- return self.expected
- return type(self.expected)
+ self._is_instance = type(self.expected) not in classtypes()
def match(self, other):
if type(other) != tuple:
return Mismatch('%r is not an exc_info tuple' % other)
- if not issubclass(other[0], self._expected_type()):
- return Mismatch('%r is not a %r' % (
- other[0], self._expected_type()))
- if (type(self.expected) is not type and
- other[1].args != self.expected.args):
- return Mismatch('%r has different arguments to %r.' % (
- other[1], self.expected))
+ expected_class = self.expected
+ if self._is_instance:
+ expected_class = expected_class.__class__
+ if not issubclass(other[0], expected_class):
+ return Mismatch('%r is not a %r' % (other[0], expected_class))
+ if self._is_instance and other[1].args != self.expected.args:
+ return Mismatch('%s has different arguments to %s.' % (
+ _error_repr(other[1]), _error_repr(self.expected)))
def __str__(self):
- return "MatchesException(%r)" % self.expected
+ if self._is_instance:
+ return "MatchesException(%s)" % _error_repr(self.expected)
+ return "MatchesException(%s)" % repr(self.expected)
class StartsWith(Matcher):
@@ -501,7 +502,6 @@ class Raises(Matcher):
# Catch all exceptions: Raises() should be able to match a
# KeyboardInterrupt or SystemExit.
except:
- exc_info = sys.exc_info()
if self.exception_matcher:
mismatch = self.exception_matcher.match(sys.exc_info())
if not mismatch:
@@ -510,9 +510,9 @@ class Raises(Matcher):
mismatch = None
# The exception did not match, or no explicit matching logic was
# performed. If the exception is a non-user exception (that is, not
- # a subclass of Exception) then propogate it.
- if not issubclass(exc_info[0], Exception):
- raise exc_info[0], exc_info[1], exc_info[2]
+ # a subclass of Exception on Python 2.5+) then propogate it.
+ if isbaseexception(sys.exc_info()[1]):
+ raise
return mismatch
def __str__(self):