aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/python/PyHamcrest/py3/patches/02-add-additional-matcher.patch
blob: 03effb4ad1787b09489336cc3945c6fec54f5f48 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
commit d2cd9189374434ea6603b07c67b316c59e6d689f
author: asatarin
date: 2017-06-13T11:54:11+03:00
revision: 2945097

    REVIEW:285653 Add additional capabilities to standard raises() matcher

--- contrib/python/PyHamcrest/py3/hamcrest/core/core/raises.py	(f026926efe42aecf93ac9fb70955b96fbdb35a67)
+++ contrib/python/PyHamcrest/py3/hamcrest/core/core/raises.py	(d2cd9189374434ea6603b07c67b316c59e6d689f)
@@ -10,11 +10,13 @@ __license__ = "BSD, see License.txt"
 
 
 class Raises(BaseMatcher):
-    def __init__(self, expected, pattern=None):
+    def __init__(self, expected, pattern=None, matcher=None):
         self.pattern = pattern
         self.expected = expected
         self.actual = None
         self.function = None
+        self.matcher = matcher
+        self.actual_return_value = None
 
     def _matches(self, function):
         if not is_callable(function):
@@ -26,18 +28,24 @@ class Raises(BaseMatcher):
     def _call_function(self, function):
         self.actual = None
         try:
-            function()
+            self.actual_return_value = function()
         except Exception:
             self.actual = sys.exc_info()[1]
 
             if isinstance(self.actual, self.expected):
                 if self.pattern is not None:
-                    return re.search(self.pattern, str(self.actual)) is not None
-                return True
+                    return (
+                        re.search(self.pattern, str(self.actual)) is not None
+                        and (self.matcher is None or self.matcher.matches(self.actual))
+                    )
+                return self.matcher is None or self.matcher.matches(self.actual)
         return False
 
     def describe_to(self, description):
         description.append_text('Expected a callable raising %s' % self.expected)
+        if self.matcher is not None:
+            description.append_text("\n and ")
+            description.append_description_of(self.matcher)
 
     def describe_mismatch(self, item, description):
         if not is_callable(item):
@@ -51,15 +59,20 @@ class Raises(BaseMatcher):
                 return
 
         if self.actual is None:
-            description.append_text('No exception raised.')
-        elif isinstance(self.actual, self.expected) and self.pattern is not None:
-            description.append_text('Correct assertion type raised, but the expected pattern ("%s") not found.' % self.pattern)
-            description.append_text('\n          message was: "%s"' % str(self.actual))
+            description.append_text('No exception raised and actual return value = ')
+            description.append_value(self.actual_return_value)
+        elif isinstance(self.actual, self.expected):
+            if self.pattern is not None:
+                description.append_text('Correct assertion type raised, but the expected pattern ("%s") not found.' % self.pattern)
+                description.append_text('\n          message was: "%s"' % str(self.actual))
+            if self.matcher is not None:
+                description.append_text("\nAdditional exception matcher: ")
+                self.matcher.describe_mismatch(self.actual, description)
         else:
             description.append_text('%s was raised instead' % type(self.actual))
 
 
-def raises(exception, pattern=None):
+def raises(exception, pattern=None, matcher=None):
     """Matches if the called function raised the expected exception.
 
     :param exception:  The class of the expected exception
@@ -75,7 +88,7 @@ def raises(exception, pattern=None):
         assert_that(calling(int).with_args('q'), raises(TypeError))
         assert_that(calling(parse, broken_input), raises(ValueError))
     """
-    return Raises(exception, pattern)
+    return Raises(exception, pattern, matcher)
 
 
 class DeferredCallable(object):