author | Lennard de Rijk <ljvderijk@gmail.com> |
Wed, 17 Dec 2008 22:25:16 +0000 | |
changeset 758 | 59307ec93f1d |
parent 104 | 5a2786fd5048 |
permissions | -rw-r--r-- |
104
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1 |
""" |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
2 |
Copyright (c) 2007 Gustavo Niemeyer <gustavo@niemeyer.net> |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
3 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
4 |
Graceful platform for test doubles in Python (mocks, stubs, fakes, and dummies). |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
5 |
""" |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
6 |
import __builtin__ |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
7 |
import tempfile |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
8 |
import unittest |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
9 |
import inspect |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
10 |
import shutil |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
11 |
import types |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
12 |
import sys |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
13 |
import os |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
14 |
import gc |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
15 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
16 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
17 |
if sys.version_info < (2, 4): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
18 |
from sets import Set as set # pragma: nocover |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
19 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
20 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
21 |
__all__ = ["Mocker", "expect", "IS", "CONTAINS", "IN", "MATCH", |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
22 |
"ANY", "ARGS", "KWARGS"] |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
23 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
24 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
25 |
__author__ = "Gustavo Niemeyer <gustavo@niemeyer.net>" |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
26 |
__license__ = "PSF License" |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
27 |
__version__ = "0.10.1" |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
28 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
29 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
30 |
ERROR_PREFIX = "[Mocker] " |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
31 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
32 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
33 |
# -------------------------------------------------------------------- |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
34 |
# Exceptions |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
35 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
36 |
class MatchError(AssertionError): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
37 |
"""Raised when an unknown expression is seen in playback mode.""" |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
38 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
39 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
40 |
# -------------------------------------------------------------------- |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
41 |
# Helper for chained-style calling. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
42 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
43 |
class expect(object): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
44 |
"""This is a simple helper that allows a different call-style. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
45 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
46 |
With this class one can comfortably do chaining of calls to the |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
47 |
mocker object responsible by the object being handled. For instance:: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
48 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
49 |
expect(obj.attr).result(3).count(1, 2) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
50 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
51 |
Is the same as:: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
52 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
53 |
obj.attr |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
54 |
mocker.result(3) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
55 |
mocker.count(1, 2) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
56 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
57 |
""" |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
58 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
59 |
def __init__(self, mock, attr=None): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
60 |
self._mock = mock |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
61 |
self._attr = attr |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
62 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
63 |
def __getattr__(self, attr): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
64 |
return self.__class__(self._mock, attr) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
65 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
66 |
def __call__(self, *args, **kwargs): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
67 |
getattr(self._mock.__mocker__, self._attr)(*args, **kwargs) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
68 |
return self |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
69 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
70 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
71 |
# -------------------------------------------------------------------- |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
72 |
# Extensions to Python's unittest. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
73 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
74 |
class MockerTestCase(unittest.TestCase): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
75 |
"""unittest.TestCase subclass with Mocker support. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
76 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
77 |
@ivar mocker: The mocker instance. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
78 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
79 |
This is a convenience only. Mocker may easily be used with the |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
80 |
standard C{unittest.TestCase} class if wanted. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
81 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
82 |
Test methods have a Mocker instance available on C{self.mocker}. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
83 |
At the end of each test method, expectations of the mocker will |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
84 |
be verified, and any requested changes made to the environment |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
85 |
will be restored. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
86 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
87 |
In addition to the integration with Mocker, this class provides |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
88 |
a few additional helper methods. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
89 |
""" |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
90 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
91 |
expect = expect |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
92 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
93 |
def __init__(self, methodName="runTest"): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
94 |
# So here is the trick: we take the real test method, wrap it on |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
95 |
# a function that do the job we have to do, and insert it in the |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
96 |
# *instance* dictionary, so that getattr() will return our |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
97 |
# replacement rather than the class method. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
98 |
test_method = getattr(self, methodName, None) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
99 |
if test_method is not None: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
100 |
def test_method_wrapper(): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
101 |
try: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
102 |
result = test_method() |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
103 |
except: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
104 |
raise |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
105 |
else: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
106 |
if (self.mocker.is_recording() and |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
107 |
self.mocker.get_events()): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
108 |
raise RuntimeError("Mocker must be put in replay " |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
109 |
"mode with self.mocker.replay()") |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
110 |
if (hasattr(result, "addCallback") and |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
111 |
hasattr(result, "addErrback")): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
112 |
def verify(result): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
113 |
self.mocker.verify() |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
114 |
return result |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
115 |
result.addCallback(verify) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
116 |
else: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
117 |
self.mocker.verify() |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
118 |
return result |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
119 |
# Copy all attributes from the original method.. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
120 |
for attr in dir(test_method): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
121 |
# .. unless they're present in our wrapper already. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
122 |
if not hasattr(test_method_wrapper, attr) or attr == "__doc__": |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
123 |
setattr(test_method_wrapper, attr, |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
124 |
getattr(test_method, attr)) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
125 |
setattr(self, methodName, test_method_wrapper) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
126 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
127 |
# We could overload run() normally, but other well-known testing |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
128 |
# frameworks do it as well, and some of them won't call the super, |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
129 |
# which might mean that cleanup wouldn't happen. With that in mind, |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
130 |
# we make integration easier by using the following trick. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
131 |
run_method = self.run |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
132 |
def run_wrapper(*args, **kwargs): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
133 |
try: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
134 |
return run_method(*args, **kwargs) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
135 |
finally: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
136 |
self.__cleanup() |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
137 |
self.run = run_wrapper |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
138 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
139 |
self.mocker = Mocker() |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
140 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
141 |
self.__cleanup_funcs = [] |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
142 |
self.__cleanup_paths = [] |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
143 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
144 |
super(MockerTestCase, self).__init__(methodName) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
145 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
146 |
def __cleanup(self): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
147 |
for path in self.__cleanup_paths: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
148 |
if os.path.isfile(path): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
149 |
os.unlink(path) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
150 |
elif os.path.isdir(path): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
151 |
shutil.rmtree(path) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
152 |
self.mocker.restore() |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
153 |
for func, args, kwargs in self.__cleanup_funcs: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
154 |
func(*args, **kwargs) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
155 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
156 |
def addCleanup(self, func, *args, **kwargs): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
157 |
self.__cleanup_funcs.append((func, args, kwargs)) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
158 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
159 |
def makeFile(self, content=None, suffix="", prefix="tmp", basename=None, |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
160 |
dirname=None, path=None): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
161 |
"""Create a temporary file and return the path to it. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
162 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
163 |
@param content: Initial content for the file. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
164 |
@param suffix: Suffix to be given to the file's basename. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
165 |
@param prefix: Prefix to be given to the file's basename. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
166 |
@param basename: Full basename for the file. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
167 |
@param dirname: Put file inside this directory. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
168 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
169 |
The file is removed after the test runs. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
170 |
""" |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
171 |
if path is not None: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
172 |
self.__cleanup_paths.append(path) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
173 |
elif basename is not None: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
174 |
if dirname is None: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
175 |
dirname = tempfile.mkdtemp() |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
176 |
self.__cleanup_paths.append(dirname) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
177 |
path = os.path.join(dirname, basename) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
178 |
else: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
179 |
fd, path = tempfile.mkstemp(suffix, prefix, dirname) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
180 |
self.__cleanup_paths.append(path) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
181 |
os.close(fd) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
182 |
if content is None: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
183 |
os.unlink(path) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
184 |
if content is not None: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
185 |
file = open(path, "w") |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
186 |
file.write(content) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
187 |
file.close() |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
188 |
return path |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
189 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
190 |
def makeDir(self, suffix="", prefix="tmp", dirname=None, path=None): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
191 |
"""Create a temporary directory and return the path to it. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
192 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
193 |
@param suffix: Suffix to be given to the file's basename. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
194 |
@param prefix: Prefix to be given to the file's basename. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
195 |
@param dirname: Put directory inside this parent directory. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
196 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
197 |
The directory is removed after the test runs. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
198 |
""" |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
199 |
if path is not None: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
200 |
os.makedirs(path) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
201 |
else: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
202 |
path = tempfile.mkdtemp(suffix, prefix, dirname) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
203 |
self.__cleanup_paths.append(path) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
204 |
return path |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
205 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
206 |
def failUnlessIs(self, first, second, msg=None): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
207 |
"""Assert that C{first} is the same object as C{second}.""" |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
208 |
if first is not second: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
209 |
raise self.failureException(msg or "%r is not %r" % (first, second)) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
210 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
211 |
def failIfIs(self, first, second, msg=None): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
212 |
"""Assert that C{first} is not the same object as C{second}.""" |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
213 |
if first is second: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
214 |
raise self.failureException(msg or "%r is %r" % (first, second)) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
215 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
216 |
def failUnlessIn(self, first, second, msg=None): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
217 |
"""Assert that C{first} is contained in C{second}.""" |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
218 |
if first not in second: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
219 |
raise self.failureException(msg or "%r not in %r" % (first, second)) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
220 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
221 |
def failUnlessStartsWith(self, first, second, msg=None): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
222 |
"""Assert that C{first} starts with C{second}.""" |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
223 |
if first[:len(second)] != second: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
224 |
raise self.failureException(msg or "%r doesn't start with %r" % |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
225 |
(first, second)) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
226 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
227 |
def failIfStartsWith(self, first, second, msg=None): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
228 |
"""Assert that C{first} doesn't start with C{second}.""" |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
229 |
if first[:len(second)] == second: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
230 |
raise self.failureException(msg or "%r starts with %r" % |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
231 |
(first, second)) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
232 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
233 |
def failUnlessEndsWith(self, first, second, msg=None): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
234 |
"""Assert that C{first} starts with C{second}.""" |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
235 |
if first[len(first)-len(second):] != second: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
236 |
raise self.failureException(msg or "%r doesn't end with %r" % |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
237 |
(first, second)) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
238 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
239 |
def failIfEndsWith(self, first, second, msg=None): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
240 |
"""Assert that C{first} doesn't start with C{second}.""" |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
241 |
if first[len(first)-len(second):] == second: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
242 |
raise self.failureException(msg or "%r ends with %r" % |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
243 |
(first, second)) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
244 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
245 |
def failIfIn(self, first, second, msg=None): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
246 |
"""Assert that C{first} is not contained in C{second}.""" |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
247 |
if first in second: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
248 |
raise self.failureException(msg or "%r in %r" % (first, second)) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
249 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
250 |
def failUnlessApproximates(self, first, second, tolerance, msg=None): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
251 |
"""Assert that C{first} is near C{second} by at most C{tolerance}.""" |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
252 |
if abs(first - second) > tolerance: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
253 |
raise self.failureException(msg or "abs(%r - %r) > %r" % |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
254 |
(first, second, tolerance)) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
255 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
256 |
def failIfApproximates(self, first, second, tolerance, msg=None): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
257 |
"""Assert that C{first} is far from C{second} by at least C{tolerance}. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
258 |
""" |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
259 |
if abs(first - second) <= tolerance: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
260 |
raise self.failureException(msg or "abs(%r - %r) <= %r" % |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
261 |
(first, second, tolerance)) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
262 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
263 |
def failUnlessMethodsMatch(self, first, second): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
264 |
"""Assert that public methods in C{first} are present in C{second}. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
265 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
266 |
This method asserts that all public methods found in C{first} are also |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
267 |
present in C{second} and accept the same arguments. C{first} may |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
268 |
have its own private methods, though, and may not have all methods |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
269 |
found in C{second}. Note that if a private method in C{first} matches |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
270 |
the name of one in C{second}, their specification is still compared. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
271 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
272 |
This is useful to verify if a fake or stub class have the same API as |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
273 |
the real class being simulated. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
274 |
""" |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
275 |
first_methods = dict(inspect.getmembers(first, inspect.ismethod)) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
276 |
second_methods = dict(inspect.getmembers(second, inspect.ismethod)) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
277 |
for name, first_method in first_methods.items(): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
278 |
first_argspec = inspect.getargspec(first_method) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
279 |
first_formatted = inspect.formatargspec(*first_argspec) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
280 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
281 |
second_method = second_methods.get(name) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
282 |
if second_method is None: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
283 |
if name[:1] == "_": |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
284 |
continue # First may have its own private methods. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
285 |
raise self.failureException("%s.%s%s not present in %s" % |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
286 |
(first.__name__, name, first_formatted, second.__name__)) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
287 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
288 |
second_argspec = inspect.getargspec(second_method) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
289 |
if first_argspec != second_argspec: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
290 |
second_formatted = inspect.formatargspec(*second_argspec) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
291 |
raise self.failureException("%s.%s%s != %s.%s%s" % |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
292 |
(first.__name__, name, first_formatted, |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
293 |
second.__name__, name, second_formatted)) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
294 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
295 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
296 |
assertIs = failUnlessIs |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
297 |
assertIsNot = failIfIs |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
298 |
assertIn = failUnlessIn |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
299 |
assertNotIn = failIfIn |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
300 |
assertStartsWith = failUnlessStartsWith |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
301 |
assertNotStartsWith = failIfStartsWith |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
302 |
assertEndsWith = failUnlessEndsWith |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
303 |
assertNotEndsWith = failIfEndsWith |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
304 |
assertApproximates = failUnlessApproximates |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
305 |
assertNotApproximates = failIfApproximates |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
306 |
assertMethodsMatch = failUnlessMethodsMatch |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
307 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
308 |
# The following are missing in Python < 2.4. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
309 |
assertTrue = unittest.TestCase.failUnless |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
310 |
assertFalse = unittest.TestCase.failIf |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
311 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
312 |
# The following is provided for compatibility with Twisted's trial. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
313 |
assertIdentical = assertIs |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
314 |
assertNotIdentical = assertIsNot |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
315 |
failUnlessIdentical = failUnlessIs |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
316 |
failIfIdentical = failIfIs |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
317 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
318 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
319 |
# -------------------------------------------------------------------- |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
320 |
# Mocker. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
321 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
322 |
class classinstancemethod(object): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
323 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
324 |
def __init__(self, method): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
325 |
self.method = method |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
326 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
327 |
def __get__(self, obj, cls=None): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
328 |
def bound_method(*args, **kwargs): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
329 |
return self.method(cls, obj, *args, **kwargs) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
330 |
return bound_method |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
331 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
332 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
333 |
class MockerBase(object): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
334 |
"""Controller of mock objects. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
335 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
336 |
A mocker instance is used to command recording and replay of |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
337 |
expectations on any number of mock objects. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
338 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
339 |
Expectations should be expressed for the mock object while in |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
340 |
record mode (the initial one) by using the mock object itself, |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
341 |
and using the mocker (and/or C{expect()} as a helper) to define |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
342 |
additional behavior for each event. For instance:: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
343 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
344 |
mock = mocker.mock() |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
345 |
mock.hello() |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
346 |
mocker.result("Hi!") |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
347 |
mocker.replay() |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
348 |
assert mock.hello() == "Hi!" |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
349 |
mock.restore() |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
350 |
mock.verify() |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
351 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
352 |
In this short excerpt a mock object is being created, then an |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
353 |
expectation of a call to the C{hello()} method was recorded, and |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
354 |
when called the method should return the value C{10}. Then, the |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
355 |
mocker is put in replay mode, and the expectation is satisfied by |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
356 |
calling the C{hello()} method, which indeed returns 10. Finally, |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
357 |
a call to the L{restore()} method is performed to undo any needed |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
358 |
changes made in the environment, and the L{verify()} method is |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
359 |
called to ensure that all defined expectations were met. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
360 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
361 |
The same logic can be expressed more elegantly using the |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
362 |
C{with mocker:} statement, as follows:: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
363 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
364 |
mock = mocker.mock() |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
365 |
mock.hello() |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
366 |
mocker.result("Hi!") |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
367 |
with mocker: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
368 |
assert mock.hello() == "Hi!" |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
369 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
370 |
Also, the MockerTestCase class, which integrates the mocker on |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
371 |
a unittest.TestCase subclass, may be used to reduce the overhead |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
372 |
of controlling the mocker. A test could be written as follows:: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
373 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
374 |
class SampleTest(MockerTestCase): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
375 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
376 |
def test_hello(self): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
377 |
mock = self.mocker.mock() |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
378 |
mock.hello() |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
379 |
self.mocker.result("Hi!") |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
380 |
self.mocker.replay() |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
381 |
self.assertEquals(mock.hello(), "Hi!") |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
382 |
""" |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
383 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
384 |
_recorders = [] |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
385 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
386 |
# For convenience only. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
387 |
on = expect |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
388 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
389 |
class __metaclass__(type): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
390 |
def __init__(self, name, bases, dict): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
391 |
# Make independent lists on each subclass, inheriting from parent. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
392 |
self._recorders = list(getattr(self, "_recorders", ())) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
393 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
394 |
def __init__(self): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
395 |
self._recorders = self._recorders[:] |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
396 |
self._events = [] |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
397 |
self._recording = True |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
398 |
self._ordering = False |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
399 |
self._last_orderer = None |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
400 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
401 |
def is_recording(self): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
402 |
"""Return True if in recording mode, False if in replay mode. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
403 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
404 |
Recording is the initial state. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
405 |
""" |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
406 |
return self._recording |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
407 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
408 |
def replay(self): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
409 |
"""Change to replay mode, where recorded events are reproduced. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
410 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
411 |
If already in replay mode, the mocker will be restored, with all |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
412 |
expectations reset, and then put again in replay mode. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
413 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
414 |
An alternative and more comfortable way to replay changes is |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
415 |
using the 'with' statement, as follows:: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
416 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
417 |
mocker = Mocker() |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
418 |
<record events> |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
419 |
with mocker: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
420 |
<reproduce events> |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
421 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
422 |
The 'with' statement will automatically put mocker in replay |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
423 |
mode, and will also verify if all events were correctly reproduced |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
424 |
at the end (using L{verify()}), and also restore any changes done |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
425 |
in the environment (with L{restore()}). |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
426 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
427 |
Also check the MockerTestCase class, which integrates the |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
428 |
unittest.TestCase class with mocker. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
429 |
""" |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
430 |
if not self._recording: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
431 |
for event in self._events: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
432 |
event.restore() |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
433 |
else: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
434 |
self._recording = False |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
435 |
for event in self._events: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
436 |
event.replay() |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
437 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
438 |
def restore(self): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
439 |
"""Restore changes in the environment, and return to recording mode. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
440 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
441 |
This should always be called after the test is complete (succeeding |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
442 |
or not). There are ways to call this method automatically on |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
443 |
completion (e.g. using a C{with mocker:} statement, or using the |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
444 |
L{MockerTestCase} class. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
445 |
""" |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
446 |
if not self._recording: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
447 |
self._recording = True |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
448 |
for event in self._events: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
449 |
event.restore() |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
450 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
451 |
def reset(self): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
452 |
"""Reset the mocker state. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
453 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
454 |
This will restore environment changes, if currently in replay |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
455 |
mode, and then remove all events previously recorded. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
456 |
""" |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
457 |
if not self._recording: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
458 |
self.restore() |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
459 |
self.unorder() |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
460 |
del self._events[:] |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
461 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
462 |
def get_events(self): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
463 |
"""Return all recorded events.""" |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
464 |
return self._events[:] |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
465 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
466 |
def add_event(self, event): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
467 |
"""Add an event. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
468 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
469 |
This method is used internally by the implementation, and |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
470 |
shouldn't be needed on normal mocker usage. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
471 |
""" |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
472 |
self._events.append(event) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
473 |
if self._ordering: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
474 |
orderer = event.add_task(Orderer(event.path)) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
475 |
if self._last_orderer: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
476 |
orderer.add_dependency(self._last_orderer) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
477 |
self._last_orderer = orderer |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
478 |
return event |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
479 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
480 |
def verify(self): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
481 |
"""Check if all expectations were met, and raise AssertionError if not. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
482 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
483 |
The exception message will include a nice description of which |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
484 |
expectations were not met, and why. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
485 |
""" |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
486 |
errors = [] |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
487 |
for event in self._events: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
488 |
try: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
489 |
event.verify() |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
490 |
except AssertionError, e: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
491 |
error = str(e) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
492 |
if not error: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
493 |
raise RuntimeError("Empty error message from %r" |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
494 |
% event) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
495 |
errors.append(error) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
496 |
if errors: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
497 |
message = [ERROR_PREFIX + "Unmet expectations:", ""] |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
498 |
for error in errors: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
499 |
lines = error.splitlines() |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
500 |
message.append("=> " + lines.pop(0)) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
501 |
message.extend([" " + line for line in lines]) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
502 |
message.append("") |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
503 |
raise AssertionError(os.linesep.join(message)) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
504 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
505 |
def mock(self, spec_and_type=None, spec=None, type=None, |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
506 |
name=None, count=True): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
507 |
"""Return a new mock object. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
508 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
509 |
@param spec_and_type: Handy positional argument which sets both |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
510 |
spec and type. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
511 |
@param spec: Method calls will be checked for correctness against |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
512 |
the given class. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
513 |
@param type: If set, the Mock's __class__ attribute will return |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
514 |
the given type. This will make C{isinstance()} calls |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
515 |
on the object work. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
516 |
@param name: Name for the mock object, used in the representation of |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
517 |
expressions. The name is rarely needed, as it's usually |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
518 |
guessed correctly from the variable name used. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
519 |
@param count: If set to false, expressions may be executed any number |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
520 |
of times, unless an expectation is explicitly set using |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
521 |
the L{count()} method. By default, expressions are |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
522 |
expected once. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
523 |
""" |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
524 |
if spec_and_type is not None: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
525 |
spec = type = spec_and_type |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
526 |
return Mock(self, spec=spec, type=type, name=name, count=count) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
527 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
528 |
def proxy(self, object, spec=True, type=True, name=None, count=True, |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
529 |
passthrough=True): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
530 |
"""Return a new mock object which proxies to the given object. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
531 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
532 |
Proxies are useful when only part of the behavior of an object |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
533 |
is to be mocked. Unknown expressions may be passed through to |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
534 |
the real implementation implicitly (if the C{passthrough} argument |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
535 |
is True), or explicitly (using the L{passthrough()} method |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
536 |
on the event). |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
537 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
538 |
@param object: Real object to be proxied, and replaced by the mock |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
539 |
on replay mode. It may also be an "import path", |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
540 |
such as C{"time.time"}, in which case the object |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
541 |
will be the C{time} function from the C{time} module. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
542 |
@param spec: Method calls will be checked for correctness against |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
543 |
the given object, which may be a class or an instance |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
544 |
where attributes will be looked up. Defaults to the |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
545 |
the C{object} parameter. May be set to None explicitly, |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
546 |
in which case spec checking is disabled. Checks may |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
547 |
also be disabled explicitly on a per-event basis with |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
548 |
the L{nospec()} method. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
549 |
@param type: If set, the Mock's __class__ attribute will return |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
550 |
the given type. This will make C{isinstance()} calls |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
551 |
on the object work. Defaults to the type of the |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
552 |
C{object} parameter. May be set to None explicitly. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
553 |
@param name: Name for the mock object, used in the representation of |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
554 |
expressions. The name is rarely needed, as it's usually |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
555 |
guessed correctly from the variable name used. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
556 |
@param count: If set to false, expressions may be executed any number |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
557 |
of times, unless an expectation is explicitly set using |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
558 |
the L{count()} method. By default, expressions are |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
559 |
expected once. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
560 |
@param passthrough: If set to False, passthrough of actions on the |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
561 |
proxy to the real object will only happen when |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
562 |
explicitly requested via the L{passthrough()} |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
563 |
method. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
564 |
""" |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
565 |
if isinstance(object, basestring): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
566 |
if name is None: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
567 |
name = object |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
568 |
import_stack = object.split(".") |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
569 |
attr_stack = [] |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
570 |
while import_stack: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
571 |
module_path = ".".join(import_stack) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
572 |
try: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
573 |
object = __import__(module_path, {}, {}, [""]) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
574 |
except ImportError: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
575 |
attr_stack.insert(0, import_stack.pop()) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
576 |
if not import_stack: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
577 |
raise |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
578 |
continue |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
579 |
else: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
580 |
for attr in attr_stack: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
581 |
object = getattr(object, attr) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
582 |
break |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
583 |
if spec is True: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
584 |
spec = object |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
585 |
if type is True: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
586 |
type = __builtin__.type(object) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
587 |
return Mock(self, spec=spec, type=type, object=object, |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
588 |
name=name, count=count, passthrough=passthrough) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
589 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
590 |
def replace(self, object, spec=True, type=True, name=None, count=True, |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
591 |
passthrough=True): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
592 |
"""Create a proxy, and replace the original object with the mock. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
593 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
594 |
On replay, the original object will be replaced by the returned |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
595 |
proxy in all dictionaries found in the running interpreter via |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
596 |
the garbage collecting system. This should cover module |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
597 |
namespaces, class namespaces, instance namespaces, and so on. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
598 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
599 |
@param object: Real object to be proxied, and replaced by the mock |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
600 |
on replay mode. It may also be an "import path", |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
601 |
such as C{"time.time"}, in which case the object |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
602 |
will be the C{time} function from the C{time} module. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
603 |
@param spec: Method calls will be checked for correctness against |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
604 |
the given object, which may be a class or an instance |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
605 |
where attributes will be looked up. Defaults to the |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
606 |
the C{object} parameter. May be set to None explicitly, |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
607 |
in which case spec checking is disabled. Checks may |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
608 |
also be disabled explicitly on a per-event basis with |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
609 |
the L{nospec()} method. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
610 |
@param type: If set, the Mock's __class__ attribute will return |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
611 |
the given type. This will make C{isinstance()} calls |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
612 |
on the object work. Defaults to the type of the |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
613 |
C{object} parameter. May be set to None explicitly. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
614 |
@param name: Name for the mock object, used in the representation of |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
615 |
expressions. The name is rarely needed, as it's usually |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
616 |
guessed correctly from the variable name used. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
617 |
@param passthrough: If set to False, passthrough of actions on the |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
618 |
proxy to the real object will only happen when |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
619 |
explicitly requested via the L{passthrough()} |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
620 |
method. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
621 |
""" |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
622 |
mock = self.proxy(object, spec, type, name, count, passthrough) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
623 |
event = self._get_replay_restore_event() |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
624 |
event.add_task(ProxyReplacer(mock)) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
625 |
return mock |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
626 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
627 |
def patch(self, object, spec=True): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
628 |
"""Patch an existing object to reproduce recorded events. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
629 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
630 |
@param object: Class or instance to be patched. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
631 |
@param spec: Method calls will be checked for correctness against |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
632 |
the given object, which may be a class or an instance |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
633 |
where attributes will be looked up. Defaults to the |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
634 |
the C{object} parameter. May be set to None explicitly, |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
635 |
in which case spec checking is disabled. Checks may |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
636 |
also be disabled explicitly on a per-event basis with |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
637 |
the L{nospec()} method. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
638 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
639 |
The result of this method is still a mock object, which can be |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
640 |
used like any other mock object to record events. The difference |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
641 |
is that when the mocker is put on replay mode, the *real* object |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
642 |
will be modified to behave according to recorded expectations. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
643 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
644 |
Patching works in individual instances, and also in classes. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
645 |
When an instance is patched, recorded events will only be |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
646 |
considered on this specific instance, and other instances should |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
647 |
behave normally. When a class is patched, the reproduction of |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
648 |
events will be considered on any instance of this class once |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
649 |
created (collectively). |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
650 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
651 |
Observe that, unlike with proxies which catch only events done |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
652 |
through the mock object, *all* accesses to recorded expectations |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
653 |
will be considered; even these coming from the object itself |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
654 |
(e.g. C{self.hello()} is considered if this method was patched). |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
655 |
While this is a very powerful feature, and many times the reason |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
656 |
to use patches in the first place, it's important to keep this |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
657 |
behavior in mind. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
658 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
659 |
Patching of the original object only takes place when the mocker |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
660 |
is put on replay mode, and the patched object will be restored |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
661 |
to its original state once the L{restore()} method is called |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
662 |
(explicitly, or implicitly with alternative conventions, such as |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
663 |
a C{with mocker:} block, or a MockerTestCase class). |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
664 |
""" |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
665 |
if spec is True: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
666 |
spec = object |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
667 |
patcher = Patcher() |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
668 |
event = self._get_replay_restore_event() |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
669 |
event.add_task(patcher) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
670 |
mock = Mock(self, object=object, patcher=patcher, |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
671 |
passthrough=True, spec=spec) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
672 |
object.__mocker_mock__ = mock |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
673 |
return mock |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
674 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
675 |
def act(self, path): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
676 |
"""This is called by mock objects whenever something happens to them. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
677 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
678 |
This method is part of the implementation between the mocker |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
679 |
and mock objects. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
680 |
""" |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
681 |
if self._recording: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
682 |
event = self.add_event(Event(path)) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
683 |
for recorder in self._recorders: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
684 |
recorder(self, event) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
685 |
return Mock(self, path) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
686 |
else: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
687 |
# First run events that may run, then run unsatisfied events, then |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
688 |
# ones not previously run. We put the index in the ordering tuple |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
689 |
# instead of the actual event because we want a stable sort |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
690 |
# (ordering between 2 events is undefined). |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
691 |
events = self._events |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
692 |
order = [(events[i].satisfied()*2 + events[i].has_run(), i) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
693 |
for i in range(len(events))] |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
694 |
order.sort() |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
695 |
postponed = None |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
696 |
for weight, i in order: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
697 |
event = events[i] |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
698 |
if event.matches(path): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
699 |
if event.may_run(path): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
700 |
return event.run(path) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
701 |
elif postponed is None: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
702 |
postponed = event |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
703 |
if postponed is not None: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
704 |
return postponed.run(path) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
705 |
raise MatchError(ERROR_PREFIX + "Unexpected expression: %s" % path) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
706 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
707 |
def get_recorders(cls, self): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
708 |
"""Return recorders associated with this mocker class or instance. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
709 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
710 |
This method may be called on mocker instances and also on mocker |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
711 |
classes. See the L{add_recorder()} method for more information. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
712 |
""" |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
713 |
return (self or cls)._recorders[:] |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
714 |
get_recorders = classinstancemethod(get_recorders) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
715 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
716 |
def add_recorder(cls, self, recorder): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
717 |
"""Add a recorder to this mocker class or instance. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
718 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
719 |
@param recorder: Callable accepting C{(mocker, event)} as parameters. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
720 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
721 |
This is part of the implementation of mocker. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
722 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
723 |
All registered recorders are called for translating events that |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
724 |
happen during recording into expectations to be met once the state |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
725 |
is switched to replay mode. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
726 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
727 |
This method may be called on mocker instances and also on mocker |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
728 |
classes. When called on a class, the recorder will be used by |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
729 |
all instances, and also inherited on subclassing. When called on |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
730 |
instances, the recorder is added only to the given instance. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
731 |
""" |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
732 |
(self or cls)._recorders.append(recorder) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
733 |
return recorder |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
734 |
add_recorder = classinstancemethod(add_recorder) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
735 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
736 |
def remove_recorder(cls, self, recorder): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
737 |
"""Remove the given recorder from this mocker class or instance. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
738 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
739 |
This method may be called on mocker classes and also on mocker |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
740 |
instances. See the L{add_recorder()} method for more information. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
741 |
""" |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
742 |
(self or cls)._recorders.remove(recorder) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
743 |
remove_recorder = classinstancemethod(remove_recorder) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
744 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
745 |
def result(self, value): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
746 |
"""Make the last recorded event return the given value on replay. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
747 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
748 |
@param value: Object to be returned when the event is replayed. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
749 |
""" |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
750 |
self.call(lambda *args, **kwargs: value) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
751 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
752 |
def generate(self, sequence): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
753 |
"""Last recorded event will return a generator with the given sequence. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
754 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
755 |
@param sequence: Sequence of values to be generated. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
756 |
""" |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
757 |
def generate(*args, **kwargs): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
758 |
for value in sequence: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
759 |
yield value |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
760 |
self.call(generate) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
761 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
762 |
def throw(self, exception): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
763 |
"""Make the last recorded event raise the given exception on replay. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
764 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
765 |
@param exception: Class or instance of exception to be raised. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
766 |
""" |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
767 |
def raise_exception(*args, **kwargs): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
768 |
raise exception |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
769 |
self.call(raise_exception) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
770 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
771 |
def call(self, func): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
772 |
"""Make the last recorded event cause the given function to be called. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
773 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
774 |
@param func: Function to be called. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
775 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
776 |
The result of the function will be used as the event result. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
777 |
""" |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
778 |
self._events[-1].add_task(FunctionRunner(func)) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
779 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
780 |
def count(self, min, max=False): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
781 |
"""Last recorded event must be replayed between min and max times. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
782 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
783 |
@param min: Minimum number of times that the event must happen. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
784 |
@param max: Maximum number of times that the event must happen. If |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
785 |
not given, it defaults to the same value of the C{min} |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
786 |
parameter. If set to None, there is no upper limit, and |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
787 |
the expectation is met as long as it happens at least |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
788 |
C{min} times. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
789 |
""" |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
790 |
event = self._events[-1] |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
791 |
for task in event.get_tasks(): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
792 |
if isinstance(task, RunCounter): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
793 |
event.remove_task(task) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
794 |
event.add_task(RunCounter(min, max)) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
795 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
796 |
def is_ordering(self): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
797 |
"""Return true if all events are being ordered. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
798 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
799 |
See the L{order()} method. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
800 |
""" |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
801 |
return self._ordering |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
802 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
803 |
def unorder(self): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
804 |
"""Disable the ordered mode. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
805 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
806 |
See the L{order()} method for more information. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
807 |
""" |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
808 |
self._ordering = False |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
809 |
self._last_orderer = None |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
810 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
811 |
def order(self, *path_holders): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
812 |
"""Create an expectation of order between two or more events. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
813 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
814 |
@param path_holders: Objects returned as the result of recorded events. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
815 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
816 |
By default, mocker won't force events to happen precisely in |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
817 |
the order they were recorded. Calling this method will change |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
818 |
this behavior so that events will only match if reproduced in |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
819 |
the correct order. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
820 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
821 |
There are two ways in which this method may be used. Which one |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
822 |
is used in a given occasion depends only on convenience. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
823 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
824 |
If no arguments are passed, the mocker will be put in a mode where |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
825 |
all the recorded events following the method call will only be met |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
826 |
if they happen in order. When that's used, the mocker may be put |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
827 |
back in unordered mode by calling the L{unorder()} method, or by |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
828 |
using a 'with' block, like so:: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
829 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
830 |
with mocker.ordered(): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
831 |
<record events> |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
832 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
833 |
In this case, only expressions in <record events> will be ordered, |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
834 |
and the mocker will be back in unordered mode after the 'with' block. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
835 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
836 |
The second way to use it is by specifying precisely which events |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
837 |
should be ordered. As an example:: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
838 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
839 |
mock = mocker.mock() |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
840 |
expr1 = mock.hello() |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
841 |
expr2 = mock.world |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
842 |
expr3 = mock.x.y.z |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
843 |
mocker.order(expr1, expr2, expr3) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
844 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
845 |
This method of ordering only works when the expression returns |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
846 |
another object. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
847 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
848 |
Also check the L{after()} and L{before()} methods, which are |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
849 |
alternative ways to perform this. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
850 |
""" |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
851 |
if not path_holders: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
852 |
self._ordering = True |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
853 |
return OrderedContext(self) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
854 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
855 |
last_orderer = None |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
856 |
for path_holder in path_holders: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
857 |
if type(path_holder) is Path: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
858 |
path = path_holder |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
859 |
else: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
860 |
path = path_holder.__mocker_path__ |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
861 |
for event in self._events: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
862 |
if event.path is path: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
863 |
for task in event.get_tasks(): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
864 |
if isinstance(task, Orderer): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
865 |
orderer = task |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
866 |
break |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
867 |
else: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
868 |
orderer = Orderer(path) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
869 |
event.add_task(orderer) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
870 |
if last_orderer: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
871 |
orderer.add_dependency(last_orderer) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
872 |
last_orderer = orderer |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
873 |
break |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
874 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
875 |
def after(self, *path_holders): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
876 |
"""Last recorded event must happen after events referred to. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
877 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
878 |
@param path_holders: Objects returned as the result of recorded events |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
879 |
which should happen before the last recorded event |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
880 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
881 |
As an example, the idiom:: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
882 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
883 |
expect(mock.x).after(mock.y, mock.z) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
884 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
885 |
is an alternative way to say:: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
886 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
887 |
expr_x = mock.x |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
888 |
expr_y = mock.y |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
889 |
expr_z = mock.z |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
890 |
mocker.order(expr_y, expr_x) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
891 |
mocker.order(expr_z, expr_x) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
892 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
893 |
See L{order()} for more information. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
894 |
""" |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
895 |
last_path = self._events[-1].path |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
896 |
for path_holder in path_holders: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
897 |
self.order(path_holder, last_path) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
898 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
899 |
def before(self, *path_holders): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
900 |
"""Last recorded event must happen before events referred to. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
901 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
902 |
@param path_holders: Objects returned as the result of recorded events |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
903 |
which should happen after the last recorded event |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
904 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
905 |
As an example, the idiom:: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
906 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
907 |
expect(mock.x).before(mock.y, mock.z) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
908 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
909 |
is an alternative way to say:: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
910 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
911 |
expr_x = mock.x |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
912 |
expr_y = mock.y |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
913 |
expr_z = mock.z |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
914 |
mocker.order(expr_x, expr_y) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
915 |
mocker.order(expr_x, expr_z) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
916 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
917 |
See L{order()} for more information. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
918 |
""" |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
919 |
last_path = self._events[-1].path |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
920 |
for path_holder in path_holders: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
921 |
self.order(last_path, path_holder) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
922 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
923 |
def nospec(self): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
924 |
"""Don't check method specification of real object on last event. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
925 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
926 |
By default, when using a mock created as the result of a call to |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
927 |
L{proxy()}, L{replace()}, and C{patch()}, or when passing the spec |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
928 |
attribute to the L{mock()} method, method calls on the given object |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
929 |
are checked for correctness against the specification of the real |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
930 |
object (or the explicitly provided spec). |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
931 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
932 |
This method will disable that check specifically for the last |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
933 |
recorded event. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
934 |
""" |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
935 |
event = self._events[-1] |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
936 |
for task in event.get_tasks(): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
937 |
if isinstance(task, SpecChecker): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
938 |
event.remove_task(task) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
939 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
940 |
def passthrough(self, result_callback=None): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
941 |
"""Make the last recorded event run on the real object once seen. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
942 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
943 |
@param result_callback: If given, this function will be called with |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
944 |
the result of the *real* method call as the only argument. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
945 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
946 |
This can only be used on proxies, as returned by the L{proxy()} |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
947 |
and L{replace()} methods, or on mocks representing patched objects, |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
948 |
as returned by the L{patch()} method. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
949 |
""" |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
950 |
event = self._events[-1] |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
951 |
if event.path.root_object is None: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
952 |
raise TypeError("Mock object isn't a proxy") |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
953 |
event.add_task(PathExecuter(result_callback)) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
954 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
955 |
def __enter__(self): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
956 |
"""Enter in a 'with' context. This will run replay().""" |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
957 |
self.replay() |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
958 |
return self |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
959 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
960 |
def __exit__(self, type, value, traceback): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
961 |
"""Exit from a 'with' context. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
962 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
963 |
This will run restore() at all times, but will only run verify() |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
964 |
if the 'with' block itself hasn't raised an exception. Exceptions |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
965 |
in that block are never swallowed. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
966 |
""" |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
967 |
self.restore() |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
968 |
if type is None: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
969 |
self.verify() |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
970 |
return False |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
971 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
972 |
def _get_replay_restore_event(self): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
973 |
"""Return unique L{ReplayRestoreEvent}, creating if needed. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
974 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
975 |
Some tasks only want to replay/restore. When that's the case, |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
976 |
they shouldn't act on other events during replay. Also, they |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
977 |
can all be put in a single event when that's the case. Thus, |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
978 |
we add a single L{ReplayRestoreEvent} as the first element of |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
979 |
the list. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
980 |
""" |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
981 |
if not self._events or type(self._events[0]) != ReplayRestoreEvent: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
982 |
self._events.insert(0, ReplayRestoreEvent()) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
983 |
return self._events[0] |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
984 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
985 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
986 |
class OrderedContext(object): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
987 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
988 |
def __init__(self, mocker): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
989 |
self._mocker = mocker |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
990 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
991 |
def __enter__(self): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
992 |
return None |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
993 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
994 |
def __exit__(self, type, value, traceback): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
995 |
self._mocker.unorder() |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
996 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
997 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
998 |
class Mocker(MockerBase): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
999 |
__doc__ = MockerBase.__doc__ |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1000 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1001 |
# Decorator to add recorders on the standard Mocker class. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1002 |
recorder = Mocker.add_recorder |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1003 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1004 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1005 |
# -------------------------------------------------------------------- |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1006 |
# Mock object. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1007 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1008 |
class Mock(object): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1009 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1010 |
def __init__(self, mocker, path=None, name=None, spec=None, type=None, |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1011 |
object=None, passthrough=False, patcher=None, count=True): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1012 |
self.__mocker__ = mocker |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1013 |
self.__mocker_path__ = path or Path(self, object) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1014 |
self.__mocker_name__ = name |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1015 |
self.__mocker_spec__ = spec |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1016 |
self.__mocker_object__ = object |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1017 |
self.__mocker_passthrough__ = passthrough |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1018 |
self.__mocker_patcher__ = patcher |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1019 |
self.__mocker_replace__ = False |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1020 |
self.__mocker_type__ = type |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1021 |
self.__mocker_count__ = count |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1022 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1023 |
def __mocker_act__(self, kind, args=(), kwargs={}, object=None): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1024 |
if self.__mocker_name__ is None: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1025 |
self.__mocker_name__ = find_object_name(self, 2) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1026 |
action = Action(kind, args, kwargs, self.__mocker_path__) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1027 |
path = self.__mocker_path__ + action |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1028 |
if object is not None: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1029 |
path.root_object = object |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1030 |
try: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1031 |
return self.__mocker__.act(path) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1032 |
except MatchError, exception: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1033 |
root_mock = path.root_mock |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1034 |
if (path.root_object is not None and |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1035 |
root_mock.__mocker_passthrough__): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1036 |
return path.execute(path.root_object) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1037 |
# Reinstantiate to show raise statement on traceback, and |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1038 |
# also to make the traceback shown shorter. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1039 |
raise MatchError(str(exception)) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1040 |
except AssertionError, e: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1041 |
lines = str(e).splitlines() |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1042 |
message = [ERROR_PREFIX + "Unmet expectation:", ""] |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1043 |
message.append("=> " + lines.pop(0)) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1044 |
message.extend([" " + line for line in lines]) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1045 |
message.append("") |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1046 |
raise AssertionError(os.linesep.join(message)) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1047 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1048 |
def __getattribute__(self, name): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1049 |
if name.startswith("__mocker_"): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1050 |
return super(Mock, self).__getattribute__(name) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1051 |
if name == "__class__": |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1052 |
if self.__mocker__.is_recording() or self.__mocker_type__ is None: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1053 |
return type(self) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1054 |
return self.__mocker_type__ |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1055 |
return self.__mocker_act__("getattr", (name,)) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1056 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1057 |
def __setattr__(self, name, value): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1058 |
if name.startswith("__mocker_"): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1059 |
return super(Mock, self).__setattr__(name, value) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1060 |
return self.__mocker_act__("setattr", (name, value)) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1061 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1062 |
def __delattr__(self, name): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1063 |
return self.__mocker_act__("delattr", (name,)) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1064 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1065 |
def __call__(self, *args, **kwargs): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1066 |
return self.__mocker_act__("call", args, kwargs) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1067 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1068 |
def __contains__(self, value): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1069 |
return self.__mocker_act__("contains", (value,)) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1070 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1071 |
def __getitem__(self, key): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1072 |
return self.__mocker_act__("getitem", (key,)) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1073 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1074 |
def __setitem__(self, key, value): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1075 |
return self.__mocker_act__("setitem", (key, value)) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1076 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1077 |
def __delitem__(self, key): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1078 |
return self.__mocker_act__("delitem", (key,)) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1079 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1080 |
def __len__(self): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1081 |
# MatchError is turned on an AttributeError so that list() and |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1082 |
# friends act properly when trying to get length hints on |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1083 |
# something that doesn't offer them. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1084 |
try: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1085 |
result = self.__mocker_act__("len") |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1086 |
except MatchError, e: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1087 |
raise AttributeError(str(e)) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1088 |
if type(result) is Mock: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1089 |
return 0 |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1090 |
return result |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1091 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1092 |
def __nonzero__(self): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1093 |
try: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1094 |
return self.__mocker_act__("nonzero") |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1095 |
except MatchError, e: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1096 |
return True |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1097 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1098 |
def __iter__(self): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1099 |
# XXX On py3k, when next() becomes __next__(), we'll be able |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1100 |
# to return the mock itself because it will be considered |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1101 |
# an iterator (we'll be mocking __next__ as well, which we |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1102 |
# can't now). |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1103 |
result = self.__mocker_act__("iter") |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1104 |
if type(result) is Mock: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1105 |
return iter([]) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1106 |
return result |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1107 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1108 |
# When adding a new action kind here, also add support for it on |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1109 |
# Action.execute() and Path.__str__(). |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1110 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1111 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1112 |
def find_object_name(obj, depth=0): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1113 |
"""Try to detect how the object is named on a previous scope.""" |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1114 |
try: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1115 |
frame = sys._getframe(depth+1) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1116 |
except: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1117 |
return None |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1118 |
for name, frame_obj in frame.f_locals.iteritems(): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1119 |
if frame_obj is obj: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1120 |
return name |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1121 |
self = frame.f_locals.get("self") |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1122 |
if self is not None: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1123 |
try: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1124 |
items = list(self.__dict__.iteritems()) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1125 |
except: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1126 |
pass |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1127 |
else: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1128 |
for name, self_obj in items: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1129 |
if self_obj is obj: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1130 |
return name |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1131 |
return None |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1132 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1133 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1134 |
# -------------------------------------------------------------------- |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1135 |
# Action and path. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1136 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1137 |
class Action(object): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1138 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1139 |
def __init__(self, kind, args, kwargs, path=None): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1140 |
self.kind = kind |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1141 |
self.args = args |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1142 |
self.kwargs = kwargs |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1143 |
self.path = path |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1144 |
self._execute_cache = {} |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1145 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1146 |
def __repr__(self): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1147 |
if self.path is None: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1148 |
return "Action(%r, %r, %r)" % (self.kind, self.args, self.kwargs) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1149 |
return "Action(%r, %r, %r, %r)" % \ |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1150 |
(self.kind, self.args, self.kwargs, self.path) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1151 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1152 |
def __eq__(self, other): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1153 |
return (self.kind == other.kind and |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1154 |
self.args == other.args and |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1155 |
self.kwargs == other.kwargs) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1156 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1157 |
def __ne__(self, other): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1158 |
return not self.__eq__(other) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1159 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1160 |
def matches(self, other): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1161 |
return (self.kind == other.kind and |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1162 |
match_params(self.args, self.kwargs, other.args, other.kwargs)) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1163 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1164 |
def execute(self, object): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1165 |
# This caching scheme may fail if the object gets deallocated before |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1166 |
# the action, as the id might get reused. It's somewhat easy to fix |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1167 |
# that with a weakref callback. For our uses, though, the object |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1168 |
# should never get deallocated before the action itself, so we'll |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1169 |
# just keep it simple. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1170 |
if id(object) in self._execute_cache: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1171 |
return self._execute_cache[id(object)] |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1172 |
execute = getattr(object, "__mocker_execute__", None) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1173 |
if execute is not None: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1174 |
result = execute(self, object) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1175 |
else: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1176 |
kind = self.kind |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1177 |
if kind == "getattr": |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1178 |
result = getattr(object, self.args[0]) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1179 |
elif kind == "setattr": |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1180 |
result = setattr(object, self.args[0], self.args[1]) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1181 |
elif kind == "delattr": |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1182 |
result = delattr(object, self.args[0]) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1183 |
elif kind == "call": |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1184 |
result = object(*self.args, **self.kwargs) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1185 |
elif kind == "contains": |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1186 |
result = self.args[0] in object |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1187 |
elif kind == "getitem": |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1188 |
result = object[self.args[0]] |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1189 |
elif kind == "setitem": |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1190 |
result = object[self.args[0]] = self.args[1] |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1191 |
elif kind == "delitem": |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1192 |
del object[self.args[0]] |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1193 |
result = None |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1194 |
elif kind == "len": |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1195 |
result = len(object) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1196 |
elif kind == "nonzero": |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1197 |
result = bool(object) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1198 |
elif kind == "iter": |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1199 |
result = iter(object) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1200 |
else: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1201 |
raise RuntimeError("Don't know how to execute %r kind." % kind) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1202 |
self._execute_cache[id(object)] = result |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1203 |
return result |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1204 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1205 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1206 |
class Path(object): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1207 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1208 |
def __init__(self, root_mock, root_object=None, actions=()): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1209 |
self.root_mock = root_mock |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1210 |
self.root_object = root_object |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1211 |
self.actions = tuple(actions) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1212 |
self.__mocker_replace__ = False |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1213 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1214 |
def parent_path(self): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1215 |
if not self.actions: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1216 |
return None |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1217 |
return self.actions[-1].path |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1218 |
parent_path = property(parent_path) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1219 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1220 |
def __add__(self, action): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1221 |
"""Return a new path which includes the given action at the end.""" |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1222 |
return self.__class__(self.root_mock, self.root_object, |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1223 |
self.actions + (action,)) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1224 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1225 |
def __eq__(self, other): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1226 |
"""Verify if the two paths are equal. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1227 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1228 |
Two paths are equal if they refer to the same mock object, and |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1229 |
have the actions with equal kind, args and kwargs. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1230 |
""" |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1231 |
if (self.root_mock is not other.root_mock or |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1232 |
self.root_object is not other.root_object or |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1233 |
len(self.actions) != len(other.actions)): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1234 |
return False |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1235 |
for action, other_action in zip(self.actions, other.actions): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1236 |
if action != other_action: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1237 |
return False |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1238 |
return True |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1239 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1240 |
def matches(self, other): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1241 |
"""Verify if the two paths are equivalent. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1242 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1243 |
Two paths are equal if they refer to the same mock object, and |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1244 |
have the same actions performed on them. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1245 |
""" |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1246 |
if (self.root_mock is not other.root_mock or |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1247 |
len(self.actions) != len(other.actions)): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1248 |
return False |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1249 |
for action, other_action in zip(self.actions, other.actions): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1250 |
if not action.matches(other_action): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1251 |
return False |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1252 |
return True |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1253 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1254 |
def execute(self, object): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1255 |
"""Execute all actions sequentially on object, and return result. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1256 |
""" |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1257 |
for action in self.actions: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1258 |
object = action.execute(object) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1259 |
return object |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1260 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1261 |
def __str__(self): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1262 |
"""Transform the path into a nice string such as obj.x.y('z').""" |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1263 |
result = self.root_mock.__mocker_name__ or "<mock>" |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1264 |
for action in self.actions: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1265 |
if action.kind == "getattr": |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1266 |
result = "%s.%s" % (result, action.args[0]) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1267 |
elif action.kind == "setattr": |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1268 |
result = "%s.%s = %r" % (result, action.args[0], action.args[1]) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1269 |
elif action.kind == "delattr": |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1270 |
result = "del %s.%s" % (result, action.args[0]) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1271 |
elif action.kind == "call": |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1272 |
args = [repr(x) for x in action.args] |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1273 |
items = list(action.kwargs.iteritems()) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1274 |
items.sort() |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1275 |
for pair in items: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1276 |
args.append("%s=%r" % pair) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1277 |
result = "%s(%s)" % (result, ", ".join(args)) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1278 |
elif action.kind == "contains": |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1279 |
result = "%r in %s" % (action.args[0], result) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1280 |
elif action.kind == "getitem": |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1281 |
result = "%s[%r]" % (result, action.args[0]) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1282 |
elif action.kind == "setitem": |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1283 |
result = "%s[%r] = %r" % (result, action.args[0], |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1284 |
action.args[1]) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1285 |
elif action.kind == "delitem": |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1286 |
result = "del %s[%r]" % (result, action.args[0]) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1287 |
elif action.kind == "len": |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1288 |
result = "len(%s)" % result |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1289 |
elif action.kind == "nonzero": |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1290 |
result = "bool(%s)" % result |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1291 |
elif action.kind == "iter": |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1292 |
result = "iter(%s)" % result |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1293 |
else: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1294 |
raise RuntimeError("Don't know how to format kind %r" % |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1295 |
action.kind) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1296 |
return result |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1297 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1298 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1299 |
class SpecialArgument(object): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1300 |
"""Base for special arguments for matching parameters.""" |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1301 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1302 |
def __init__(self, object=None): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1303 |
self.object = object |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1304 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1305 |
def __repr__(self): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1306 |
if self.object is None: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1307 |
return self.__class__.__name__ |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1308 |
else: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1309 |
return "%s(%r)" % (self.__class__.__name__, self.object) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1310 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1311 |
def matches(self, other): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1312 |
return True |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1313 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1314 |
def __eq__(self, other): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1315 |
return type(other) == type(self) and self.object == other.object |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1316 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1317 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1318 |
class ANY(SpecialArgument): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1319 |
"""Matches any single argument.""" |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1320 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1321 |
ANY = ANY() |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1322 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1323 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1324 |
class ARGS(SpecialArgument): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1325 |
"""Matches zero or more positional arguments.""" |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1326 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1327 |
ARGS = ARGS() |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1328 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1329 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1330 |
class KWARGS(SpecialArgument): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1331 |
"""Matches zero or more keyword arguments.""" |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1332 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1333 |
KWARGS = KWARGS() |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1334 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1335 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1336 |
class IS(SpecialArgument): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1337 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1338 |
def matches(self, other): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1339 |
return self.object is other |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1340 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1341 |
def __eq__(self, other): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1342 |
return type(other) == type(self) and self.object is other.object |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1343 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1344 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1345 |
class CONTAINS(SpecialArgument): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1346 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1347 |
def matches(self, other): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1348 |
try: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1349 |
other.__contains__ |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1350 |
except AttributeError: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1351 |
try: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1352 |
iter(other) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1353 |
except TypeError: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1354 |
# If an object can't be iterated, and has no __contains__ |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1355 |
# hook, it'd blow up on the test below. We test this in |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1356 |
# advance to prevent catching more errors than we really |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1357 |
# want. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1358 |
return False |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1359 |
return self.object in other |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1360 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1361 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1362 |
class IN(SpecialArgument): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1363 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1364 |
def matches(self, other): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1365 |
return other in self.object |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1366 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1367 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1368 |
class MATCH(SpecialArgument): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1369 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1370 |
def matches(self, other): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1371 |
return bool(self.object(other)) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1372 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1373 |
def __eq__(self, other): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1374 |
return type(other) == type(self) and self.object is other.object |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1375 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1376 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1377 |
def match_params(args1, kwargs1, args2, kwargs2): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1378 |
"""Match the two sets of parameters, considering special parameters.""" |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1379 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1380 |
has_args = ARGS in args1 |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1381 |
has_kwargs = KWARGS in args1 |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1382 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1383 |
if has_kwargs: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1384 |
args1 = [arg1 for arg1 in args1 if arg1 is not KWARGS] |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1385 |
elif len(kwargs1) != len(kwargs2): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1386 |
return False |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1387 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1388 |
if not has_args and len(args1) != len(args2): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1389 |
return False |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1390 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1391 |
# Either we have the same number of kwargs, or unknown keywords are |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1392 |
# accepted (KWARGS was used), so check just the ones in kwargs1. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1393 |
for key, arg1 in kwargs1.iteritems(): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1394 |
if key not in kwargs2: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1395 |
return False |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1396 |
arg2 = kwargs2[key] |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1397 |
if isinstance(arg1, SpecialArgument): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1398 |
if not arg1.matches(arg2): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1399 |
return False |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1400 |
elif arg1 != arg2: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1401 |
return False |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1402 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1403 |
# Keywords match. Now either we have the same number of |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1404 |
# arguments, or ARGS was used. If ARGS wasn't used, arguments |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1405 |
# must match one-on-one necessarily. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1406 |
if not has_args: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1407 |
for arg1, arg2 in zip(args1, args2): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1408 |
if isinstance(arg1, SpecialArgument): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1409 |
if not arg1.matches(arg2): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1410 |
return False |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1411 |
elif arg1 != arg2: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1412 |
return False |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1413 |
return True |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1414 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1415 |
# Easy choice. Keywords are matching, and anything on args is accepted. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1416 |
if (ARGS,) == args1: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1417 |
return True |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1418 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1419 |
# We have something different there. If we don't have positional |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1420 |
# arguments on the original call, it can't match. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1421 |
if not args2: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1422 |
# Unless we have just several ARGS (which is bizarre, but..). |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1423 |
for arg1 in args1: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1424 |
if arg1 is not ARGS: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1425 |
return False |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1426 |
return True |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1427 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1428 |
# Ok, all bets are lost. We have to actually do the more expensive |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1429 |
# matching. This is an algorithm based on the idea of the Levenshtein |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1430 |
# Distance between two strings, but heavily hacked for this purpose. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1431 |
args2l = len(args2) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1432 |
if args1[0] is ARGS: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1433 |
args1 = args1[1:] |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1434 |
array = [0]*args2l |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1435 |
else: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1436 |
array = [1]*args2l |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1437 |
for i in range(len(args1)): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1438 |
last = array[0] |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1439 |
if args1[i] is ARGS: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1440 |
for j in range(1, args2l): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1441 |
last, array[j] = array[j], min(array[j-1], array[j], last) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1442 |
else: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1443 |
array[0] = i or int(args1[i] != args2[0]) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1444 |
for j in range(1, args2l): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1445 |
last, array[j] = array[j], last or int(args1[i] != args2[j]) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1446 |
if 0 not in array: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1447 |
return False |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1448 |
if array[-1] != 0: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1449 |
return False |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1450 |
return True |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1451 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1452 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1453 |
# -------------------------------------------------------------------- |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1454 |
# Event and task base. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1455 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1456 |
class Event(object): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1457 |
"""Aggregation of tasks that keep track of a recorded action. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1458 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1459 |
An event represents something that may or may not happen while the |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1460 |
mocked environment is running, such as an attribute access, or a |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1461 |
method call. The event is composed of several tasks that are |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1462 |
orchestrated together to create a composed meaning for the event, |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1463 |
including for which actions it should be run, what happens when it |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1464 |
runs, and what's the expectations about the actions run. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1465 |
""" |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1466 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1467 |
def __init__(self, path=None): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1468 |
self.path = path |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1469 |
self._tasks = [] |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1470 |
self._has_run = False |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1471 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1472 |
def add_task(self, task): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1473 |
"""Add a new task to this taks.""" |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1474 |
self._tasks.append(task) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1475 |
return task |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1476 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1477 |
def remove_task(self, task): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1478 |
self._tasks.remove(task) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1479 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1480 |
def get_tasks(self): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1481 |
return self._tasks[:] |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1482 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1483 |
def matches(self, path): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1484 |
"""Return true if *all* tasks match the given path.""" |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1485 |
for task in self._tasks: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1486 |
if not task.matches(path): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1487 |
return False |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1488 |
return bool(self._tasks) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1489 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1490 |
def has_run(self): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1491 |
return self._has_run |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1492 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1493 |
def may_run(self, path): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1494 |
"""Verify if any task would certainly raise an error if run. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1495 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1496 |
This will call the C{may_run()} method on each task and return |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1497 |
false if any of them returns false. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1498 |
""" |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1499 |
for task in self._tasks: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1500 |
if not task.may_run(path): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1501 |
return False |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1502 |
return True |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1503 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1504 |
def run(self, path): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1505 |
"""Run all tasks with the given action. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1506 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1507 |
@param path: The path of the expression run. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1508 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1509 |
Running an event means running all of its tasks individually and in |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1510 |
order. An event should only ever be run if all of its tasks claim to |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1511 |
match the given action. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1512 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1513 |
The result of this method will be the last result of a task |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1514 |
which isn't None, or None if they're all None. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1515 |
""" |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1516 |
self._has_run = True |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1517 |
result = None |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1518 |
errors = [] |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1519 |
for task in self._tasks: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1520 |
try: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1521 |
task_result = task.run(path) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1522 |
except AssertionError, e: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1523 |
error = str(e) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1524 |
if not error: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1525 |
raise RuntimeError("Empty error message from %r" % task) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1526 |
errors.append(error) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1527 |
else: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1528 |
if task_result is not None: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1529 |
result = task_result |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1530 |
if errors: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1531 |
message = [str(self.path)] |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1532 |
if str(path) != message[0]: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1533 |
message.append("- Run: %s" % path) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1534 |
for error in errors: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1535 |
lines = error.splitlines() |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1536 |
message.append("- " + lines.pop(0)) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1537 |
message.extend([" " + line for line in lines]) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1538 |
raise AssertionError(os.linesep.join(message)) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1539 |
return result |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1540 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1541 |
def satisfied(self): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1542 |
"""Return true if all tasks are satisfied. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1543 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1544 |
Being satisfied means that there are no unmet expectations. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1545 |
""" |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1546 |
for task in self._tasks: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1547 |
try: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1548 |
task.verify() |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1549 |
except AssertionError: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1550 |
return False |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1551 |
return True |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1552 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1553 |
def verify(self): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1554 |
"""Run verify on all tasks. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1555 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1556 |
The verify method is supposed to raise an AssertionError if the |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1557 |
task has unmet expectations, with a one-line explanation about |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1558 |
why this item is unmet. This method should be safe to be called |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1559 |
multiple times without side effects. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1560 |
""" |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1561 |
errors = [] |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1562 |
for task in self._tasks: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1563 |
try: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1564 |
task.verify() |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1565 |
except AssertionError, e: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1566 |
error = str(e) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1567 |
if not error: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1568 |
raise RuntimeError("Empty error message from %r" % task) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1569 |
errors.append(error) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1570 |
if errors: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1571 |
message = [str(self.path)] |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1572 |
for error in errors: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1573 |
lines = error.splitlines() |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1574 |
message.append("- " + lines.pop(0)) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1575 |
message.extend([" " + line for line in lines]) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1576 |
raise AssertionError(os.linesep.join(message)) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1577 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1578 |
def replay(self): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1579 |
"""Put all tasks in replay mode.""" |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1580 |
self._has_run = False |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1581 |
for task in self._tasks: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1582 |
task.replay() |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1583 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1584 |
def restore(self): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1585 |
"""Restore the state of all tasks.""" |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1586 |
for task in self._tasks: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1587 |
task.restore() |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1588 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1589 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1590 |
class ReplayRestoreEvent(Event): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1591 |
"""Helper event for tasks which need replay/restore but shouldn't match.""" |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1592 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1593 |
def matches(self, path): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1594 |
return False |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1595 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1596 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1597 |
class Task(object): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1598 |
"""Element used to track one specific aspect on an event. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1599 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1600 |
A task is responsible for adding any kind of logic to an event. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1601 |
Examples of that are counting the number of times the event was |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1602 |
made, verifying parameters if any, and so on. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1603 |
""" |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1604 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1605 |
def matches(self, path): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1606 |
"""Return true if the task is supposed to be run for the given path. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1607 |
""" |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1608 |
return True |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1609 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1610 |
def may_run(self, path): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1611 |
"""Return false if running this task would certainly raise an error.""" |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1612 |
return True |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1613 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1614 |
def run(self, path): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1615 |
"""Perform the task item, considering that the given action happened. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1616 |
""" |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1617 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1618 |
def verify(self): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1619 |
"""Raise AssertionError if expectations for this item are unmet. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1620 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1621 |
The verify method is supposed to raise an AssertionError if the |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1622 |
task has unmet expectations, with a one-line explanation about |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1623 |
why this item is unmet. This method should be safe to be called |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1624 |
multiple times without side effects. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1625 |
""" |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1626 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1627 |
def replay(self): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1628 |
"""Put the task in replay mode. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1629 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1630 |
Any expectations of the task should be reset. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1631 |
""" |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1632 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1633 |
def restore(self): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1634 |
"""Restore any environmental changes made by the task. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1635 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1636 |
Verify should continue to work after this is called. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1637 |
""" |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1638 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1639 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1640 |
# -------------------------------------------------------------------- |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1641 |
# Task implementations. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1642 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1643 |
class OnRestoreCaller(Task): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1644 |
"""Call a given callback when restoring.""" |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1645 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1646 |
def __init__(self, callback): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1647 |
self._callback = callback |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1648 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1649 |
def restore(self): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1650 |
self._callback() |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1651 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1652 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1653 |
class PathMatcher(Task): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1654 |
"""Match the action path against a given path.""" |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1655 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1656 |
def __init__(self, path): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1657 |
self.path = path |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1658 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1659 |
def matches(self, path): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1660 |
return self.path.matches(path) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1661 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1662 |
def path_matcher_recorder(mocker, event): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1663 |
event.add_task(PathMatcher(event.path)) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1664 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1665 |
Mocker.add_recorder(path_matcher_recorder) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1666 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1667 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1668 |
class RunCounter(Task): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1669 |
"""Task which verifies if the number of runs are within given boundaries. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1670 |
""" |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1671 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1672 |
def __init__(self, min, max=False): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1673 |
self.min = min |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1674 |
if max is None: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1675 |
self.max = sys.maxint |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1676 |
elif max is False: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1677 |
self.max = min |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1678 |
else: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1679 |
self.max = max |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1680 |
self._runs = 0 |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1681 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1682 |
def replay(self): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1683 |
self._runs = 0 |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1684 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1685 |
def may_run(self, path): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1686 |
return self._runs < self.max |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1687 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1688 |
def run(self, path): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1689 |
self._runs += 1 |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1690 |
if self._runs > self.max: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1691 |
self.verify() |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1692 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1693 |
def verify(self): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1694 |
if not self.min <= self._runs <= self.max: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1695 |
if self._runs < self.min: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1696 |
raise AssertionError("Performed fewer times than expected.") |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1697 |
raise AssertionError("Performed more times than expected.") |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1698 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1699 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1700 |
class ImplicitRunCounter(RunCounter): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1701 |
"""RunCounter inserted by default on any event. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1702 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1703 |
This is a way to differentiate explicitly added counters and |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1704 |
implicit ones. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1705 |
""" |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1706 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1707 |
def run_counter_recorder(mocker, event): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1708 |
"""Any event may be repeated once, unless disabled by default.""" |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1709 |
if event.path.root_mock.__mocker_count__: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1710 |
event.add_task(ImplicitRunCounter(1)) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1711 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1712 |
Mocker.add_recorder(run_counter_recorder) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1713 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1714 |
def run_counter_removal_recorder(mocker, event): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1715 |
""" |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1716 |
Events created by getattr actions which lead to other events |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1717 |
may be repeated any number of times. For that, we remove implicit |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1718 |
run counters of any getattr actions leading to the current one. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1719 |
""" |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1720 |
parent_path = event.path.parent_path |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1721 |
for event in mocker.get_events()[::-1]: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1722 |
if (event.path is parent_path and |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1723 |
event.path.actions[-1].kind == "getattr"): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1724 |
for task in event.get_tasks(): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1725 |
if type(task) is ImplicitRunCounter: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1726 |
event.remove_task(task) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1727 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1728 |
Mocker.add_recorder(run_counter_removal_recorder) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1729 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1730 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1731 |
class MockReturner(Task): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1732 |
"""Return a mock based on the action path.""" |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1733 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1734 |
def __init__(self, mocker): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1735 |
self.mocker = mocker |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1736 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1737 |
def run(self, path): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1738 |
return Mock(self.mocker, path) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1739 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1740 |
def mock_returner_recorder(mocker, event): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1741 |
"""Events that lead to other events must return mock objects.""" |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1742 |
parent_path = event.path.parent_path |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1743 |
for event in mocker.get_events(): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1744 |
if event.path is parent_path: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1745 |
for task in event.get_tasks(): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1746 |
if isinstance(task, MockReturner): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1747 |
break |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1748 |
else: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1749 |
event.add_task(MockReturner(mocker)) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1750 |
break |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1751 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1752 |
Mocker.add_recorder(mock_returner_recorder) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1753 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1754 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1755 |
class FunctionRunner(Task): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1756 |
"""Task that runs a function everything it's run. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1757 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1758 |
Arguments of the last action in the path are passed to the function, |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1759 |
and the function result is also returned. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1760 |
""" |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1761 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1762 |
def __init__(self, func): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1763 |
self._func = func |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1764 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1765 |
def run(self, path): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1766 |
action = path.actions[-1] |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1767 |
return self._func(*action.args, **action.kwargs) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1768 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1769 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1770 |
class PathExecuter(Task): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1771 |
"""Task that executes a path in the real object, and returns the result.""" |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1772 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1773 |
def __init__(self, result_callback=None): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1774 |
self._result_callback = result_callback |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1775 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1776 |
def get_result_callback(self): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1777 |
return self._result_callback |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1778 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1779 |
def run(self, path): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1780 |
result = path.execute(path.root_object) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1781 |
if self._result_callback is not None: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1782 |
self._result_callback(result) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1783 |
return result |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1784 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1785 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1786 |
class Orderer(Task): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1787 |
"""Task to establish an order relation between two events. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1788 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1789 |
An orderer task will only match once all its dependencies have |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1790 |
been run. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1791 |
""" |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1792 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1793 |
def __init__(self, path): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1794 |
self.path = path |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1795 |
self._run = False |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1796 |
self._dependencies = [] |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1797 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1798 |
def replay(self): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1799 |
self._run = False |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1800 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1801 |
def has_run(self): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1802 |
return self._run |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1803 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1804 |
def may_run(self, path): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1805 |
for dependency in self._dependencies: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1806 |
if not dependency.has_run(): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1807 |
return False |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1808 |
return True |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1809 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1810 |
def run(self, path): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1811 |
for dependency in self._dependencies: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1812 |
if not dependency.has_run(): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1813 |
raise AssertionError("Should be after: %s" % dependency.path) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1814 |
self._run = True |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1815 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1816 |
def add_dependency(self, orderer): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1817 |
self._dependencies.append(orderer) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1818 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1819 |
def get_dependencies(self): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1820 |
return self._dependencies |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1821 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1822 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1823 |
class SpecChecker(Task): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1824 |
"""Task to check if arguments of the last action conform to a real method. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1825 |
""" |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1826 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1827 |
def __init__(self, method): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1828 |
self._method = method |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1829 |
self._unsupported = False |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1830 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1831 |
if method: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1832 |
try: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1833 |
self._args, self._varargs, self._varkwargs, self._defaults = \ |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1834 |
inspect.getargspec(method) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1835 |
except TypeError: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1836 |
self._unsupported = True |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1837 |
else: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1838 |
if self._defaults is None: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1839 |
self._defaults = () |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1840 |
if type(method) is type(self.run): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1841 |
self._args = self._args[1:] |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1842 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1843 |
def get_method(self): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1844 |
return self._method |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1845 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1846 |
def _raise(self, message): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1847 |
spec = inspect.formatargspec(self._args, self._varargs, |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1848 |
self._varkwargs, self._defaults) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1849 |
raise AssertionError("Specification is %s%s: %s" % |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1850 |
(self._method.__name__, spec, message)) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1851 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1852 |
def verify(self): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1853 |
if not self._method: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1854 |
raise AssertionError("Method not found in real specification") |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1855 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1856 |
def may_run(self, path): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1857 |
try: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1858 |
self.run(path) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1859 |
except AssertionError: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1860 |
return False |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1861 |
return True |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1862 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1863 |
def run(self, path): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1864 |
if not self._method: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1865 |
raise AssertionError("Method not found in real specification") |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1866 |
if self._unsupported: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1867 |
return # Can't check it. Happens with builtin functions. :-( |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1868 |
action = path.actions[-1] |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1869 |
obtained_len = len(action.args) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1870 |
obtained_kwargs = action.kwargs.copy() |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1871 |
nodefaults_len = len(self._args) - len(self._defaults) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1872 |
for i, name in enumerate(self._args): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1873 |
if i < obtained_len and name in action.kwargs: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1874 |
self._raise("%r provided twice" % name) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1875 |
if (i >= obtained_len and i < nodefaults_len and |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1876 |
name not in action.kwargs): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1877 |
self._raise("%r not provided" % name) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1878 |
obtained_kwargs.pop(name, None) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1879 |
if obtained_len > len(self._args) and not self._varargs: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1880 |
self._raise("too many args provided") |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1881 |
if obtained_kwargs and not self._varkwargs: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1882 |
self._raise("unknown kwargs: %s" % ", ".join(obtained_kwargs)) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1883 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1884 |
def spec_checker_recorder(mocker, event): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1885 |
spec = event.path.root_mock.__mocker_spec__ |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1886 |
if spec: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1887 |
actions = event.path.actions |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1888 |
if len(actions) == 1: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1889 |
if actions[0].kind == "call": |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1890 |
method = getattr(spec, "__call__", None) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1891 |
event.add_task(SpecChecker(method)) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1892 |
elif len(actions) == 2: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1893 |
if actions[0].kind == "getattr" and actions[1].kind == "call": |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1894 |
method = getattr(spec, actions[0].args[0], None) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1895 |
event.add_task(SpecChecker(method)) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1896 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1897 |
Mocker.add_recorder(spec_checker_recorder) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1898 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1899 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1900 |
class ProxyReplacer(Task): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1901 |
"""Task which installs and deinstalls proxy mocks. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1902 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1903 |
This task will replace a real object by a mock in all dictionaries |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1904 |
found in the running interpreter via the garbage collecting system. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1905 |
""" |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1906 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1907 |
def __init__(self, mock): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1908 |
self.mock = mock |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1909 |
self.__mocker_replace__ = False |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1910 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1911 |
def replay(self): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1912 |
global_replace(self.mock.__mocker_object__, self.mock) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1913 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1914 |
def restore(self): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1915 |
global_replace(self.mock, self.mock.__mocker_object__) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1916 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1917 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1918 |
def global_replace(remove, install): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1919 |
"""Replace object 'remove' with object 'install' on all dictionaries.""" |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1920 |
for referrer in gc.get_referrers(remove): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1921 |
if (type(referrer) is dict and |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1922 |
referrer.get("__mocker_replace__", True)): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1923 |
for key, value in referrer.items(): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1924 |
if value is remove: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1925 |
referrer[key] = install |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1926 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1927 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1928 |
class Undefined(object): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1929 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1930 |
def __repr__(self): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1931 |
return "Undefined" |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1932 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1933 |
Undefined = Undefined() |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1934 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1935 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1936 |
class Patcher(Task): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1937 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1938 |
def __init__(self): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1939 |
super(Patcher, self).__init__() |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1940 |
self._monitored = {} # {kind: {id(object): object}} |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1941 |
self._patched = {} |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1942 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1943 |
def is_monitoring(self, obj, kind): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1944 |
monitored = self._monitored.get(kind) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1945 |
if monitored: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1946 |
if id(obj) in monitored: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1947 |
return True |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1948 |
cls = type(obj) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1949 |
if issubclass(cls, type): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1950 |
cls = obj |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1951 |
bases = set([id(base) for base in cls.__mro__]) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1952 |
bases.intersection_update(monitored) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1953 |
return bool(bases) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1954 |
return False |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1955 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1956 |
def monitor(self, obj, kind): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1957 |
if kind not in self._monitored: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1958 |
self._monitored[kind] = {} |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1959 |
self._monitored[kind][id(obj)] = obj |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1960 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1961 |
def patch_attr(self, obj, attr, value): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1962 |
original = obj.__dict__.get(attr, Undefined) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1963 |
self._patched[id(obj), attr] = obj, attr, original |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1964 |
setattr(obj, attr, value) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1965 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1966 |
def get_unpatched_attr(self, obj, attr): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1967 |
cls = type(obj) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1968 |
if issubclass(cls, type): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1969 |
cls = obj |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1970 |
result = Undefined |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1971 |
for mro_cls in cls.__mro__: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1972 |
key = (id(mro_cls), attr) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1973 |
if key in self._patched: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1974 |
result = self._patched[key][2] |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1975 |
if result is not Undefined: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1976 |
break |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1977 |
elif attr in mro_cls.__dict__: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1978 |
result = mro_cls.__dict__.get(attr, Undefined) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1979 |
break |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1980 |
if isinstance(result, object) and hasattr(type(result), "__get__"): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1981 |
if cls is obj: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1982 |
obj = None |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1983 |
return result.__get__(obj, cls) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1984 |
return result |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1985 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1986 |
def _get_kind_attr(self, kind): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1987 |
if kind == "getattr": |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1988 |
return "__getattribute__" |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1989 |
return "__%s__" % kind |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1990 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1991 |
def replay(self): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1992 |
for kind in self._monitored: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1993 |
attr = self._get_kind_attr(kind) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1994 |
seen = set() |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1995 |
for obj in self._monitored[kind].itervalues(): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1996 |
cls = type(obj) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1997 |
if issubclass(cls, type): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1998 |
cls = obj |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
1999 |
if cls not in seen: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
2000 |
seen.add(cls) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
2001 |
unpatched = getattr(cls, attr, Undefined) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
2002 |
self.patch_attr(cls, attr, |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
2003 |
PatchedMethod(kind, unpatched, |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
2004 |
self.is_monitoring)) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
2005 |
self.patch_attr(cls, "__mocker_execute__", |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
2006 |
self.execute) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
2007 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
2008 |
def restore(self): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
2009 |
for obj, attr, original in self._patched.itervalues(): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
2010 |
if original is Undefined: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
2011 |
delattr(obj, attr) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
2012 |
else: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
2013 |
setattr(obj, attr, original) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
2014 |
self._patched.clear() |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
2015 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
2016 |
def execute(self, action, object): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
2017 |
attr = self._get_kind_attr(action.kind) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
2018 |
unpatched = self.get_unpatched_attr(object, attr) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
2019 |
try: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
2020 |
return unpatched(*action.args, **action.kwargs) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
2021 |
except AttributeError: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
2022 |
if action.kind == "getattr": |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
2023 |
# The normal behavior of Python is to try __getattribute__, |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
2024 |
# and if it raises AttributeError, try __getattr__. We've |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
2025 |
# tried the unpatched __getattribute__ above, and we'll now |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
2026 |
# try __getattr__. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
2027 |
try: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
2028 |
__getattr__ = unpatched("__getattr__") |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
2029 |
except AttributeError: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
2030 |
pass |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
2031 |
else: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
2032 |
return __getattr__(*action.args, **action.kwargs) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
2033 |
raise |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
2034 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
2035 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
2036 |
class PatchedMethod(object): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
2037 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
2038 |
def __init__(self, kind, unpatched, is_monitoring): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
2039 |
self._kind = kind |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
2040 |
self._unpatched = unpatched |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
2041 |
self._is_monitoring = is_monitoring |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
2042 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
2043 |
def __get__(self, obj, cls=None): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
2044 |
object = obj or cls |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
2045 |
if not self._is_monitoring(object, self._kind): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
2046 |
return self._unpatched.__get__(obj, cls) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
2047 |
def method(*args, **kwargs): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
2048 |
if self._kind == "getattr" and args[0].startswith("__mocker_"): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
2049 |
return self._unpatched.__get__(obj, cls)(args[0]) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
2050 |
mock = object.__mocker_mock__ |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
2051 |
return mock.__mocker_act__(self._kind, args, kwargs, object) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
2052 |
return method |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
2053 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
2054 |
def __call__(self, obj, *args, **kwargs): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
2055 |
# At least with __getattribute__, Python seems to use *both* the |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
2056 |
# descriptor API and also call the class attribute directly. It |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
2057 |
# looks like an interpreter bug, or at least an undocumented |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
2058 |
# inconsistency. |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
2059 |
return self.__get__(obj)(*args, **kwargs) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
2060 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
2061 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
2062 |
def patcher_recorder(mocker, event): |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
2063 |
mock = event.path.root_mock |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
2064 |
if mock.__mocker_patcher__ and len(event.path.actions) == 1: |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
2065 |
patcher = mock.__mocker_patcher__ |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
2066 |
patcher.monitor(mock.__mocker_object__, event.path.actions[0].kind) |
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
2067 |
|
5a2786fd5048
Add mocker 0.10.1 to trunk/thirdparty, so that it can be used to create mocks
Todd Larsen <tlarsen@google.com>
parents:
diff
changeset
|
2068 |
Mocker.add_recorder(patcher_recorder) |