thirdparty/mocker/mocker.py
author Todd Larsen <tlarsen@google.com>
Tue, 14 Oct 2008 21:39:57 +0000
changeset 329 2d90d49ce78a
parent 104 5a2786fd5048
permissions -rw-r--r--
Add is_featured boolean property to the Work model, so that Works can be designated as "featured" items in various places in the UI. This will be used to allow Sponsors, Programs, and Organizations to select Documents that should be included in their sidebar menus. Perhaps featured "site" Documents, such as site-wide Terms of Service, should probably be listed below the "User (sign-out)" menu, since the User will have to read and agree to these before being allowed to use the site. A collapsable Javascript sidebar is probably going to be needed soon... Patch by: Todd Larsen Review by: to-be-reviewed
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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)