133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck# Unit tests for Mox.
233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck#
333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck# Copyright 2008 Google Inc.
433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck#
533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck# Licensed under the Apache License, Version 2.0 (the "License");
633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck# you may not use this file except in compliance with the License.
733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck# You may obtain a copy of the License at
833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck#
933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck#      http://www.apache.org/licenses/LICENSE-2.0
1033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck#
1133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck# Unless required by applicable law or agreed to in writing, software
1233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck# distributed under the License is distributed on an "AS IS" BASIS,
1333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck# See the License for the specific language governing permissions and
1533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck# limitations under the License.
1633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck#
1733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck# This is a fork of the pymox library intended to work with Python 3.
1833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck# The file was modified by quermit@gmail.com and dawid.fatyga@gmail.com
1933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
2033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reckimport io
2133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reckimport re
2233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reckimport sys
2333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
2433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reckfrom mox3 import mox
2533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reckfrom mox3.tests import mox_helper
2633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
2733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reckimport six
2833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reckimport testtools
2933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
3033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
3133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John ReckOS_LISTDIR = mox_helper.os.listdir
3233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
3333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
3433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reckclass ExpectedMethodCallsErrorTest(testtools.TestCase):
3533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    """Test creation and string conversion of ExpectedMethodCallsError."""
3633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
3733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testAtLeastOneMethod(self):
3833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertRaises(ValueError, mox.ExpectedMethodCallsError, [])
3933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
4033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testOneError(self):
4133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        method = mox.MockMethod("testMethod", [], False)
4233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        method(1, 2).AndReturn('output')
4333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        e = mox.ExpectedMethodCallsError([method])
4433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertEqual(
4533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck            "Verify: Expected methods never called:\n"
4633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck            "  0.  testMethod(1, 2) -> 'output'",
4733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck            str(e))
4833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
4933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testManyErrors(self):
5033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        method1 = mox.MockMethod("testMethod", [], False)
5133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        method1(1, 2).AndReturn('output')
5233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        method2 = mox.MockMethod("testMethod", [], False)
5333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        method2(a=1, b=2, c="only named")
5433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        method3 = mox.MockMethod("testMethod2", [], False)
5533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        method3().AndReturn(44)
5633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        method4 = mox.MockMethod("testMethod", [], False)
5733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        method4(1, 2).AndReturn('output')
5833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        e = mox.ExpectedMethodCallsError([method1, method2, method3, method4])
5933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertEqual(
6033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck            "Verify: Expected methods never called:\n"
6133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck            "  0.  testMethod(1, 2) -> 'output'\n"
6233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck            "  1.  testMethod(a=1, b=2, c='only named') -> None\n"
6333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck            "  2.  testMethod2() -> 44\n"
6433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck            "  3.  testMethod(1, 2) -> 'output'",
6533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck            str(e))
6633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
6733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
6833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reckclass OrTest(testtools.TestCase):
6933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    """Test Or correctly chains Comparators."""
7033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
7133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testValidOr(self):
7233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Or should be True if either Comparator returns True."""
7333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertTrue(mox.Or(mox.IsA(dict), mox.IsA(str)) == {})
7433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertTrue(mox.Or(mox.IsA(dict), mox.IsA(str)) == 'test')
7533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertTrue(mox.Or(mox.IsA(str), mox.IsA(str)) == 'test')
7633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
7733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testInvalidOr(self):
7833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Or should be False if both Comparators return False."""
7933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertFalse(mox.Or(mox.IsA(dict), mox.IsA(str)) == 0)
8033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
8133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
8233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reckclass AndTest(testtools.TestCase):
8333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    """Test And correctly chains Comparators."""
8433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
8533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testValidAnd(self):
8633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """And should be True if both Comparators return True."""
8733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertTrue(mox.And(mox.IsA(str), mox.IsA(str)) == '1')
8833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
8933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testClauseOneFails(self):
9033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """And should be False if the first Comparator returns False."""
9133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
9233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertFalse(mox.And(mox.IsA(dict), mox.IsA(str)) == '1')
9333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
9433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testAdvancedUsage(self):
9533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """And should work with other Comparators.
9633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
9733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        Note: this test is reliant on In and ContainsKeyValue.
9833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """
9933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        test_dict = {"mock": "obj", "testing": "isCOOL"}
10033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertTrue(mox.And(mox.In("testing"),
10133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck                        mox.ContainsKeyValue("mock", "obj")) == test_dict)
10233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
10333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testAdvancedUsageFails(self):
10433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Note: this test is reliant on In and ContainsKeyValue."""
10533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        test_dict = {"mock": "obj", "testing": "isCOOL"}
10633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertFalse(mox.And(mox.In("NOTFOUND"),
10733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck                         mox.ContainsKeyValue("mock", "obj")) == test_dict)
10833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
10933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
11033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reckclass FuncTest(testtools.TestCase):
11133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    """Test Func correctly evaluates based upon true-false return."""
11233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
11333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testFuncTrueFalseEvaluation(self):
11433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Should return True if the validating function returns True."""
11533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        equals_one = lambda x: x == 1
11633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        always_none = lambda x: None
11733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
11833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertTrue(mox.Func(equals_one) == 1)
11933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertFalse(mox.Func(equals_one) == 0)
12033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
12133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertFalse(mox.Func(always_none) == 1)
12233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertFalse(mox.Func(always_none) == 0)
12333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertFalse(mox.Func(always_none) is None)
12433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
12533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testFuncExceptionPropagation(self):
12633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Exceptions within the validating function should propagate."""
12733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        class TestException(Exception):
12833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck            pass
12933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
13033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        def raiseExceptionOnNotOne(value):
13133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck            if value != 1:
13233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck                raise TestException
13333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck            else:
13433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck                return True
13533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
13633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertTrue(mox.Func(raiseExceptionOnNotOne) == 1)
13733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertRaises(
13833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck            TestException, mox.Func(raiseExceptionOnNotOne).__eq__, 2)
13933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
14033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
14133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reckclass SameElementsAsTest(testtools.TestCase):
14233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    """SameElementsAs correctly identifies sequences with same elements."""
14333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
14433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testSortedLists(self):
14533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Should return True if two lists are exactly equal."""
14633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertTrue(mox.SameElementsAs([1, 2.0, 'c']) == [1, 2.0, 'c'])
14733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
14833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testUnsortedLists(self):
14933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Should return True if lists are unequal but have same elements."""
15033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertTrue(mox.SameElementsAs([1, 2.0, 'c']) == [2.0, 'c', 1])
15133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
15233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testUnhashableLists(self):
15333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Should return True if lists have the same unhashable elements."""
15433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertTrue(mox.SameElementsAs([{'a': 1}, {2: 'b'}]) ==
15533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck                        [{2: 'b'}, {'a': 1}])
15633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
15733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testEmptyLists(self):
15833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Should return True for two empty lists."""
15933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertTrue(mox.SameElementsAs([]) == [])
16033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
16133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testUnequalLists(self):
16233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Should return False if the lists are not equal."""
16333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertFalse(mox.SameElementsAs([1, 2.0, 'c']) == [2.0, 'c'])
16433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
16533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testUnequalUnhashableLists(self):
16633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Should return False if lists with unhashable items are unequal."""
16733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertFalse(mox.SameElementsAs(
16833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck            [{'a': 1}, {2: 'b'}]) == [{2: 'b'}])
16933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
17033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testActualIsNotASequence(self):
17133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Should return False if the actual object is not a sequence."""
17233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertFalse(mox.SameElementsAs([1]) == object())
17333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
17433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testOneUnhashableObjectInActual(self):
17533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Store the entire iterator for a correct comparison.
17633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
17733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        In a previous version of SameElementsAs, iteration stopped when an
17833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        unhashable object was encountered and then was restarted, so the actual
17933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        list appeared smaller than it was.
18033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """
18133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertFalse(mox.SameElementsAs([1, 2]) == iter([{}, 1, 2]))
18233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
18333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
18433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reckclass ContainsKeyValueTest(testtools.TestCase):
18533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    """Test ContainsKeyValue correctly identifies key/value pairs in a dict.
18633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    """
18733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
18833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testValidPair(self):
18933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Should return True if the key value is in the dict."""
19033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertTrue(mox.ContainsKeyValue("key", 1) == {"key": 1})
19133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
19233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testInvalidValue(self):
19333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Should return False if the value is not correct."""
19433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertFalse(mox.ContainsKeyValue("key", 1) == {"key": 2})
19533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
19633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testInvalidKey(self):
19733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Should return False if they key is not in the dict."""
19833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertFalse(mox.ContainsKeyValue("qux", 1) == {"key": 2})
19933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
20033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
20133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reckclass ContainsAttributeValueTest(testtools.TestCase):
20233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    """Test ContainsAttributeValue identifies properties in an object."""
20333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
20433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def setUp(self):
20533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Create an object to test with."""
20633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
20733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        class TestObject(object):
20833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck            key = 1
20933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
21033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        super(ContainsAttributeValueTest, self).setUp()
21133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.test_object = TestObject()
21233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
21333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testValidPair(self):
21433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Return True if the object has the key attribute that matches."""
21533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertTrue(mox.ContainsAttributeValue("key", 1)
21633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck                        == self.test_object)
21733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
21833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testInvalidValue(self):
21933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Should return False if the value is not correct."""
22033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertFalse(mox.ContainsKeyValue("key", 2) == self.test_object)
22133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
22233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testInvalidKey(self):
22333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Should return False if they the object doesn't have the property."""
22433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertFalse(mox.ContainsKeyValue("qux", 1) == self.test_object)
22533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
22633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
22733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reckclass InTest(testtools.TestCase):
22833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    """Test In correctly identifies a key in a list/dict."""
22933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
23033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testItemInList(self):
23133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Should return True if the item is in the list."""
23233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertTrue(mox.In(1) == [1, 2, 3])
23333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
23433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testKeyInDict(self):
23533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Should return True if the item is a key in a dict."""
23633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertTrue(mox.In("test") == {"test": "module"})
23733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
23833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testItemInTuple(self):
23933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Should return True if the item is in the list."""
24033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertTrue(mox.In(1) == (1, 2, 3))
24133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
24233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testTupleInTupleOfTuples(self):
24333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertTrue(mox.In((1, 2, 3)) == ((1, 2, 3), (1, 2)))
24433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
24533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testItemNotInList(self):
24633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertFalse(mox.In(1) == [2, 3])
24733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
24833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testTupleNotInTupleOfTuples(self):
24933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertFalse(mox.In((1, 2)) == ((1, 2, 3), (4, 5)))
25033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
25133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
25233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reckclass NotTest(testtools.TestCase):
25333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    """Test Not correctly identifies False predicates."""
25433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
25533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testItemInList(self):
25633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Should return True if the item is NOT in the list."""
25733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertTrue(mox.Not(mox.In(42)) == [1, 2, 3])
25833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
25933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testKeyInDict(self):
26033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Should return True if the item is NOT a key in a dict."""
26133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertTrue(mox.Not(mox.In("foo")) == {"key": 42})
26233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
26333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testInvalidKeyWithNot(self):
26433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Should return False if they key is NOT in the dict."""
26533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertTrue(mox.Not(mox.ContainsKeyValue("qux", 1)) == {"key": 2})
26633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
26733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
26833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reckclass StrContainsTest(testtools.TestCase):
26933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    """Test StrContains checks for substring occurrence of a parameter."""
27033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
27133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testValidSubstringAtStart(self):
27233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Should return True if substring is at the start of the string."""
27333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertTrue(mox.StrContains("hello") == "hello world")
27433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
27533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testValidSubstringInMiddle(self):
27633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Should return True if substring is in the middle of the string."""
27733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertTrue(mox.StrContains("lo wo") == "hello world")
27833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
27933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testValidSubstringAtEnd(self):
28033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Should return True if the substring is at the end of the string."""
28133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertTrue(mox.StrContains("ld") == "hello world")
28233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
28333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testInvaildSubstring(self):
28433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Should return False if the substring is not in the string."""
28533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertFalse(mox.StrContains("AAA") == "hello world")
28633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
28733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testMultipleMatches(self):
28833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Should return True if there are multiple occurances of substring."""
28933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertTrue(mox.StrContains("abc") == "ababcabcabcababc")
29033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
29133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
29233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reckclass RegexTest(testtools.TestCase):
29333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    """Test Regex correctly matches regular expressions."""
29433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
29533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testIdentifyBadSyntaxDuringInit(self):
29633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """The user should know immediately if a regex has bad syntax."""
29733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertRaises(re.error, mox.Regex, '(a|b')
29833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
29933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testPatternInMiddle(self):
30033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Return True if the pattern matches at the middle of the string.
30133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
30233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        This ensures that re.search is used (instead of re.find).
30333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """
30433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertTrue(mox.Regex(r"a\s+b") == "x y z a b c")
30533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
30633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testNonMatchPattern(self):
30733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Should return False if the pattern does not match the string."""
30833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertFalse(mox.Regex(r"a\s+b") == "x y z")
30933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
31033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testFlagsPassedCorrectly(self):
31133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Should return True as we pass IGNORECASE flag."""
31233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertTrue(mox.Regex(r"A", re.IGNORECASE) == "a")
31333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
31433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testReprWithoutFlags(self):
31533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """repr should return the regular expression pattern."""
31633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertTrue(
31733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck            repr(mox.Regex(r"a\s+b")) == "<regular expression 'a\s+b'>")
31833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
31933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testReprWithFlags(self):
32033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """repr should return the regular expression pattern and flags."""
32133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertTrue(repr(mox.Regex(r"a\s+b", flags=4)) ==
32233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck                        "<regular expression 'a\s+b', flags=4>")
32333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
32433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
32533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reckclass IsTest(testtools.TestCase):
32633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    """Verify Is correctly checks equality based upon identity, not value."""
32733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
32833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    class AlwaysComparesTrue(object):
32933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        def __eq__(self, other):
33033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck            return True
33133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
33233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        def __cmp__(self, other):
33333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck            return 0
33433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
33533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        def __ne__(self, other):
33633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck            return False
33733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
33833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testEqualityValid(self):
33933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        o1 = self.AlwaysComparesTrue()
34033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertTrue(mox.Is(o1), o1)
34133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
34233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testEqualityInvalid(self):
34333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        o1 = self.AlwaysComparesTrue()
34433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        o2 = self.AlwaysComparesTrue()
34533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertTrue(o1 == o2)
34633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        # but...
34733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertFalse(mox.Is(o1) == o2)
34833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
34933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testInequalityValid(self):
35033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        o1 = self.AlwaysComparesTrue()
35133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        o2 = self.AlwaysComparesTrue()
35233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertTrue(mox.Is(o1) != o2)
35333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
35433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testInequalityInvalid(self):
35533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        o1 = self.AlwaysComparesTrue()
35633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertFalse(mox.Is(o1) != o1)
35733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
35833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testEqualityInListValid(self):
35933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        o1 = self.AlwaysComparesTrue()
36033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        o2 = self.AlwaysComparesTrue()
36133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        isa_list = [mox.Is(o1), mox.Is(o2)]
36233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        str_list = [o1, o2]
36333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertTrue(isa_list == str_list)
36433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
36533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testEquailtyInListInvalid(self):
36633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        o1 = self.AlwaysComparesTrue()
36733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        o2 = self.AlwaysComparesTrue()
36833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        isa_list = [mox.Is(o1), mox.Is(o2)]
36933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mixed_list = [o2, o1]
37033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertFalse(isa_list == mixed_list)
37133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
37233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
37333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reckclass IsATest(testtools.TestCase):
37433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    """Verify IsA correctly checks equality based upon class type not value."""
37533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
37633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testEqualityValid(self):
37733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Verify that == correctly identifies objects of the same type."""
37833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertTrue(mox.IsA(str) == 'test')
37933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
38033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testEqualityInvalid(self):
38133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Verify that == correctly identifies objects of different types."""
38233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertFalse(mox.IsA(str) == 10)
38333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
38433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testInequalityValid(self):
38533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Verify that != identifies objects of different type."""
38633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertTrue(mox.IsA(str) != 10)
38733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
38833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testInequalityInvalid(self):
38933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Verify that != correctly identifies objects of the same type."""
39033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertFalse(mox.IsA(str) != "test")
39133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
39233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testEqualityInListValid(self):
39333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Verify list contents are properly compared."""
39433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        isa_list = [mox.IsA(str), mox.IsA(str)]
39533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        str_list = ["abc", "def"]
39633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertTrue(isa_list == str_list)
39733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
39833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testEquailtyInListInvalid(self):
39933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Verify list contents are properly compared."""
40033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        isa_list = [mox.IsA(str), mox.IsA(str)]
40133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mixed_list = ["abc", 123]
40233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertFalse(isa_list == mixed_list)
40333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
40433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testSpecialTypes(self):
40533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Verify that IsA can handle objects like io.StringIO."""
40633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        isA = mox.IsA(io.StringIO())
40733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        stringIO = io.StringIO()
40833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertTrue(isA == stringIO)
40933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
41033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
41133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reckclass IsAlmostTest(testtools.TestCase):
41233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    """Verify IsAlmost correctly checks equality of floating point numbers."""
41333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
41433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testEqualityValid(self):
41533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Verify that == correctly identifies nearly equivalent floats."""
41633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertEqual(mox.IsAlmost(1.8999999999), 1.9)
41733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
41833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testEqualityInvalid(self):
41933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Verify that == correctly identifies non-equivalent floats."""
42033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertNotEqual(mox.IsAlmost(1.899), 1.9)
42133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
42233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testEqualityWithPlaces(self):
42333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Verify that specifying places has the desired effect."""
42433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertNotEqual(mox.IsAlmost(1.899), 1.9)
42533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertEqual(mox.IsAlmost(1.899, places=2), 1.9)
42633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
42733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testNonNumericTypes(self):
42833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Verify that IsAlmost handles non-numeric types properly."""
42933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
43033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertNotEqual(mox.IsAlmost(1.8999999999), '1.9')
43133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertNotEqual(mox.IsAlmost('1.8999999999'), 1.9)
43233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertNotEqual(mox.IsAlmost('1.8999999999'), '1.9')
43333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
43433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
43533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reckclass ValueRememberTest(testtools.TestCase):
43633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    """Verify comparing argument against remembered value."""
43733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
43833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testValueEquals(self):
43933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Verify that value will compare to stored value."""
44033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        value = mox.Value()
44133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        value.store_value('hello world')
44233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertEqual(value, 'hello world')
44333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
44433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testNoValue(self):
44533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Verify that uninitialized value does not compare to empty values."""
44633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        value = mox.Value()
44733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertNotEqual(value, None)
44833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertNotEqual(value, False)
44933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertNotEqual(value, 0)
45033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertNotEqual(value, '')
45133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertNotEqual(value, ())
45233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertNotEqual(value, [])
45333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertNotEqual(value, {})
45433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertNotEqual(value, object())
45533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertNotEqual(value, set())
45633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
45733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testRememberValue(self):
45833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Verify that comparing against remember will store argument."""
45933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        value = mox.Value()
46033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        remember = mox.Remember(value)
46133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertNotEqual(value, 'hello world')  # value not yet stored.
46233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertEqual(remember, 'hello world')  # store value here.
46333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertEqual(value, 'hello world')  # compare against stored value.
46433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
46533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
46633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reckclass MockMethodTest(testtools.TestCase):
46733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    """Test class to verify that the MockMethod class is working correctly."""
46833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
46933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def setUp(self):
47033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        super(MockMethodTest, self).setUp()
47133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.expected_method = mox.MockMethod(
47233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck            "testMethod", [], False)(['original'])
47333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mock_method = mox.MockMethod(
47433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck            "testMethod", [self.expected_method], True)
47533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
47633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testNameAttribute(self):
47733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Should provide a __name__ attribute."""
47833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertEqual('testMethod', self.mock_method.__name__)
47933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
48033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testAndReturnNoneByDefault(self):
48133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Should return None by default."""
48233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        return_value = self.mock_method(['original'])
48333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertTrue(return_value is None)
48433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
48533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testAndReturnValue(self):
48633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Should return a specificed return value."""
48733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        expected_return_value = "test"
48833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.expected_method.AndReturn(expected_return_value)
48933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        return_value = self.mock_method(['original'])
49033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertTrue(return_value == expected_return_value)
49133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
49233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testAndRaiseException(self):
49333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Should raise a specified exception."""
49433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        class TestException(Exception):
49533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck            pass
49633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
49733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        expected_exception = TestException('test exception')
49833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.expected_method.AndRaise(expected_exception)
49933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertRaises(TestException, self.mock_method, ['original'])
50033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
50133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testWithSideEffects(self):
50233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Should call state modifier."""
50333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        local_list = ['original']
50433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
50533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        def modifier(mutable_list):
50633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck            self.assertTrue(local_list is mutable_list)
50733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck            mutable_list[0] = 'mutation'
50833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
50933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.expected_method.WithSideEffects(modifier).AndReturn(1)
51033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mock_method(local_list)
51133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertEqual('mutation', local_list[0])
51233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
51333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testWithReturningSideEffects(self):
51433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Should call state modifier and propagate its return value."""
51533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        local_list = ['original']
51633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        expected_return = 'expected_return'
51733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
51833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        def modifier_with_return(mutable_list):
51933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck            self.assertTrue(local_list is mutable_list)
52033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck            mutable_list[0] = 'mutation'
52133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck            return expected_return
52233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
52333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.expected_method.WithSideEffects(modifier_with_return)
52433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        actual_return = self.mock_method(local_list)
52533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertEqual('mutation', local_list[0])
52633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertEqual(expected_return, actual_return)
52733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
52833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testWithReturningSideEffectsWithAndReturn(self):
52933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Should call state modifier and ignore its return value."""
53033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        local_list = ['original']
53133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        expected_return = 'expected_return'
53233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        unexpected_return = 'unexpected_return'
53333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
53433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        def modifier_with_return(mutable_list):
53533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck            self.assertTrue(local_list is mutable_list)
53633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck            mutable_list[0] = 'mutation'
53733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck            return unexpected_return
53833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
53933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.expected_method.WithSideEffects(modifier_with_return).AndReturn(
54033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck            expected_return)
54133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        actual_return = self.mock_method(local_list)
54233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertEqual('mutation', local_list[0])
54333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertEqual(expected_return, actual_return)
54433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
54533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testEqualityNoParamsEqual(self):
54633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Methods with the same name and without params should be equal."""
54733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        expected_method = mox.MockMethod("testMethod", [], False)
54833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertEqual(self.mock_method, expected_method)
54933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
55033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testEqualityNoParamsNotEqual(self):
55133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Methods with different names without params should not be equal."""
55233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        expected_method = mox.MockMethod("otherMethod", [], False)
55333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertNotEqual(self.mock_method, expected_method)
55433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
55533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testEqualityParamsEqual(self):
55633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Methods with the same name and parameters should be equal."""
55733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        params = [1, 2, 3]
55833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        expected_method = mox.MockMethod("testMethod", [], False)
55933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        expected_method._params = params
56033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
56133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mock_method._params = params
56233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertEqual(self.mock_method, expected_method)
56333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
56433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testEqualityParamsNotEqual(self):
56533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Methods with same name and different params should not be equal."""
56633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        expected_method = mox.MockMethod("testMethod", [], False)
56733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        expected_method._params = [1, 2, 3]
56833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
56933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mock_method._params = ['a', 'b', 'c']
57033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertNotEqual(self.mock_method, expected_method)
57133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
57233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testEqualityNamedParamsEqual(self):
57333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Methods with the same name and same named params should be equal."""
57433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        named_params = {"input1": "test", "input2": "params"}
57533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        expected_method = mox.MockMethod("testMethod", [], False)
57633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        expected_method._named_params = named_params
57733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
57833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mock_method._named_params = named_params
57933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertEqual(self.mock_method, expected_method)
58033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
58133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testEqualityNamedParamsNotEqual(self):
58233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Methods with same name and diffnamed params should not be equal."""
58333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        expected_method = mox.MockMethod("testMethod", [], False)
58433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        expected_method._named_params = {"input1": "test", "input2": "params"}
58533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
58633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mock_method._named_params = {
58733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck            "input1": "test2", "input2": "params2"}
58833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertNotEqual(self.mock_method, expected_method)
58933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
59033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testEqualityWrongType(self):
59133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Method should not be equal to an object of a different type."""
59233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertNotEqual(self.mock_method, "string?")
59333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
59433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testObjectEquality(self):
59533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Equality of objects should work without a Comparator"""
59633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        instA = TestClass()
59733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        instB = TestClass()
59833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
59933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        params = [instA, ]
60033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        expected_method = mox.MockMethod("testMethod", [], False)
60133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        expected_method._params = params
60233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
60333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mock_method._params = [instB, ]
60433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertEqual(self.mock_method, expected_method)
60533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
60633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testStrConversion(self):
60733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        method = mox.MockMethod("f", [], False)
60833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        method(1, 2, "st", n1=8, n2="st2")
60933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertEqual(str(method),
61033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck                         ("f(1, 2, 'st', n1=8, n2='st2') -> None"))
61133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
61233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        method = mox.MockMethod("testMethod", [], False)
61333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        method(1, 2, "only positional")
61433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertEqual(str(method),
61533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck                         "testMethod(1, 2, 'only positional') -> None")
61633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
61733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        method = mox.MockMethod("testMethod", [], False)
61833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        method(a=1, b=2, c="only named")
61933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertEqual(str(method),
62033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck                         "testMethod(a=1, b=2, c='only named') -> None")
62133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
62233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        method = mox.MockMethod("testMethod", [], False)
62333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        method()
62433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertEqual(str(method), "testMethod() -> None")
62533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
62633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        method = mox.MockMethod("testMethod", [], False)
62733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        method(x="only 1 parameter")
62833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertEqual(str(method),
62933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck                         "testMethod(x='only 1 parameter') -> None")
63033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
63133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        method = mox.MockMethod("testMethod", [], False)
63233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        method().AndReturn('return_value')
63333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertEqual(str(method), "testMethod() -> 'return_value'")
63433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
63533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        method = mox.MockMethod("testMethod", [], False)
63633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        method().AndReturn(('a', {1: 2}))
63733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertEqual(str(method), "testMethod() -> ('a', {1: 2})")
63833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
63933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
64033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reckclass MockAnythingTest(testtools.TestCase):
64133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    """Verify that the MockAnything class works as expected."""
64233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
64333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def setUp(self):
64433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        super(MockAnythingTest, self).setUp()
64533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mock_object = mox.MockAnything()
64633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
64733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testRepr(self):
64833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Calling repr on a MockAnything instance must work."""
64933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertEqual('<MockAnything instance>', repr(self.mock_object))
65033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
65133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testCanMockStr(self):
65233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mock_object.__str__().AndReturn("foo")
65333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mock_object._Replay()
65433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        actual = str(self.mock_object)
65533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mock_object._Verify()
65633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertEqual("foo", actual)
65733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
65833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testSetupMode(self):
65933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Verify the mock will accept any call."""
66033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mock_object.NonsenseCall()
66133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertTrue(len(self.mock_object._expected_calls_queue) == 1)
66233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
66333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testReplayWithExpectedCall(self):
66433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Verify the mock replays method calls as expected."""
66533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mock_object.ValidCall()                    # setup method call
66633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mock_object._Replay()                        # start replay mode
66733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mock_object.ValidCall()                    # make method call
66833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
66933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testReplayWithUnexpectedCall(self):
67033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Unexpected method calls should raise UnexpectedMethodCallError."""
67133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mock_object.ValidCall()                    # setup method call
67233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mock_object._Replay()                         # start replay mode
67333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertRaises(mox.UnexpectedMethodCallError,
67433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck                          self.mock_object.OtherValidCall)
67533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
67633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testVerifyWithCompleteReplay(self):
67733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Verify should not raise an exception for a valid replay."""
67833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mock_object.ValidCall()                    # setup method call
67933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mock_object._Replay()                         # start replay mode
68033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mock_object.ValidCall()                    # make method call
68133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mock_object._Verify()
68233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
68333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testVerifyWithIncompleteReplay(self):
68433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Verify should raise an exception if the replay was not complete."""
68533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mock_object.ValidCall()                    # setup method call
68633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mock_object._Replay()                         # start replay mode
68733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        # ValidCall() is never made
68833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertRaises(
68933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck            mox.ExpectedMethodCallsError, self.mock_object._Verify)
69033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
69133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testSpecialClassMethod(self):
69233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Verify should not raise exception when special methods are used."""
69333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mock_object[1].AndReturn(True)
69433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mock_object._Replay()
69533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        returned_val = self.mock_object[1]
69633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertTrue(returned_val)
69733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mock_object._Verify()
69833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
69933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testNonzero(self):
70033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """You should be able to use the mock object in an if."""
70133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mock_object._Replay()
70233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        if self.mock_object:
70333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck            pass
70433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
70533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testNotNone(self):
70633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Mock should be comparable to None."""
70733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mock_object._Replay()
70833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        if self.mock_object is not None:
70933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck            pass
71033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
71133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        if self.mock_object is None:
71233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck            pass
71333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
71433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testEquals(self):
71533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """A mock should be able to compare itself to another object."""
71633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mock_object._Replay()
71733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertEqual(self.mock_object, self.mock_object)
71833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
71933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testEqualsMockFailure(self):
72033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Verify equals identifies unequal objects."""
72133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mock_object.SillyCall()
72233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mock_object._Replay()
72333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertNotEqual(self.mock_object, mox.MockAnything())
72433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
72533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testEqualsInstanceFailure(self):
72633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Verify equals identifies that objects are different instances."""
72733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mock_object._Replay()
72833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertNotEqual(self.mock_object, TestClass())
72933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
73033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testNotEquals(self):
73133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Verify not equals works."""
73233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mock_object._Replay()
73333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertFalse(self.mock_object != self.mock_object)
73433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
73533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testNestedMockCallsRecordedSerially(self):
73633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Test that nested calls work when recorded serially."""
73733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mock_object.CallInner().AndReturn(1)
73833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mock_object.CallOuter(1)
73933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mock_object._Replay()
74033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
74133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mock_object.CallOuter(self.mock_object.CallInner())
74233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
74333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mock_object._Verify()
74433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
74533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testNestedMockCallsRecordedNested(self):
74633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Test that nested cals work when recorded in a nested fashion."""
74733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mock_object.CallOuter(self.mock_object.CallInner().AndReturn(1))
74833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mock_object._Replay()
74933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
75033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mock_object.CallOuter(self.mock_object.CallInner())
75133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
75233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mock_object._Verify()
75333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
75433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testIsCallable(self):
75533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Test that MockAnything can even mock a simple callable.
75633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
75733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        This is handy for "stubbing out" a method in a module with a mock, and
75833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        verifying that it was called.
75933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """
76033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mock_object().AndReturn('mox0rd')
76133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mock_object._Replay()
76233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
76333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertEqual('mox0rd', self.mock_object())
76433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
76533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mock_object._Verify()
76633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
76733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testIsReprable(self):
76833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Test that MockAnythings can be repr'd without causing a failure."""
76933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertTrue('MockAnything' in repr(self.mock_object))
77033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
77133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
77233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reckclass MethodCheckerTest(testtools.TestCase):
77333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    """Tests MockMethod's use of MethodChecker method."""
77433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
77533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testUnboundMethodsRequiresInstance(self):
77633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        # SKIP TEST IN PYTHON 2.x (Ugly hack for python 2.6)
77733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        # REASON: semantics for unbound methods has changed only in Python 3
77833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        #     so this test in earlier versions is invald
77933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        if sys.version_info < (3, 0):
78033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck            return
78133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
78233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        instance = CheckCallTestClass()
78333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        method = mox.MockMethod('NoParameters', [], False,
78433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck                                CheckCallTestClass.NoParameters)
78533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
78633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertRaises(AttributeError, method)
78733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        method(instance)
78833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertRaises(AttributeError, method, instance, 1)
78933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
79033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testNoParameters(self):
79133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        method = mox.MockMethod('NoParameters', [], False,
79233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck                                CheckCallTestClass.NoParameters,
79333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck                                class_to_bind=CheckCallTestClass)
79433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        method()
79533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertRaises(AttributeError, method, 1)
79633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertRaises(AttributeError, method, 1, 2)
79733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertRaises(AttributeError, method, a=1)
79833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertRaises(AttributeError, method, 1, b=2)
79933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
80033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testOneParameter(self):
80133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        method = mox.MockMethod('OneParameter', [], False,
80233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck                                CheckCallTestClass.OneParameter,
80333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck                                class_to_bind=CheckCallTestClass)
80433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertRaises(AttributeError, method)
80533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        method(1)
80633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        method(a=1)
80733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertRaises(AttributeError, method, b=1)
80833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertRaises(AttributeError, method, 1, 2)
80933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertRaises(AttributeError, method, 1, a=2)
81033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertRaises(AttributeError, method, 1, b=2)
81133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
81233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testTwoParameters(self):
81333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        method = mox.MockMethod('TwoParameters', [], False,
81433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck                                CheckCallTestClass.TwoParameters,
81533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck                                class_to_bind=CheckCallTestClass)
81633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertRaises(AttributeError, method)
81733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertRaises(AttributeError, method, 1)
81833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertRaises(AttributeError, method, a=1)
81933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertRaises(AttributeError, method, b=1)
82033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        method(1, 2)
82133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        method(1, b=2)
82233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        method(a=1, b=2)
82333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        method(b=2, a=1)
82433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertRaises(AttributeError, method, b=2, c=3)
82533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertRaises(AttributeError, method, a=1, b=2, c=3)
82633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertRaises(AttributeError, method, 1, 2, 3)
82733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertRaises(AttributeError, method, 1, 2, 3, 4)
82833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertRaises(AttributeError, method, 3, a=1, b=2)
82933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
83033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testOneDefaultValue(self):
83133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        method = mox.MockMethod('OneDefaultValue', [], False,
83233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck                                CheckCallTestClass.OneDefaultValue,
83333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck                                class_to_bind=CheckCallTestClass)
83433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        method()
83533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        method(1)
83633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        method(a=1)
83733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertRaises(AttributeError, method, b=1)
83833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertRaises(AttributeError, method, 1, 2)
83933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertRaises(AttributeError, method, 1, a=2)
84033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertRaises(AttributeError, method, 1, b=2)
84133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
84233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testTwoDefaultValues(self):
84333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        method = mox.MockMethod('TwoDefaultValues', [], False,
84433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck                                CheckCallTestClass.TwoDefaultValues,
84533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck                                class_to_bind=CheckCallTestClass)
84633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertRaises(AttributeError, method)
84733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertRaises(AttributeError, method, c=3)
84833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertRaises(AttributeError, method, 1)
84933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertRaises(AttributeError, method, 1, d=4)
85033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertRaises(AttributeError, method, 1, d=4, c=3)
85133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        method(1, 2)
85233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        method(a=1, b=2)
85333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        method(1, 2, 3)
85433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        method(1, 2, 3, 4)
85533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        method(1, 2, c=3)
85633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        method(1, 2, c=3, d=4)
85733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        method(1, 2, d=4, c=3)
85833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        method(d=4, c=3, a=1, b=2)
85933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertRaises(AttributeError, method, 1, 2, 3, 4, 5)
86033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertRaises(AttributeError, method, 1, 2, e=9)
86133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertRaises(AttributeError, method, a=1, b=2, e=9)
86233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
86333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testArgs(self):
86433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        method = mox.MockMethod('Args', [], False, CheckCallTestClass.Args,
86533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck                                class_to_bind=CheckCallTestClass)
86633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertRaises(AttributeError, method)
86733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertRaises(AttributeError, method, 1)
86833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        method(1, 2)
86933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        method(a=1, b=2)
87033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        method(1, 2, 3)
87133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        method(1, 2, 3, 4)
87233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertRaises(AttributeError, method, 1, 2, a=3)
87333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertRaises(AttributeError, method, 1, 2, c=3)
87433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
87533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testKwargs(self):
87633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        method = mox.MockMethod('Kwargs', [], False, CheckCallTestClass.Kwargs,
87733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck                                class_to_bind=CheckCallTestClass)
87833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertRaises(AttributeError, method)
87933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        method(1)
88033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        method(1, 2)
88133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        method(a=1, b=2)
88233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        method(b=2, a=1)
88333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertRaises(AttributeError, method, 1, 2, 3)
88433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertRaises(AttributeError, method, 1, 2, a=3)
88533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        method(1, 2, c=3)
88633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        method(a=1, b=2, c=3)
88733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        method(c=3, a=1, b=2)
88833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        method(a=1, b=2, c=3, d=4)
88933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertRaises(AttributeError, method, 1, 2, 3, 4)
89033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
89133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testArgsAndKwargs(self):
89233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        method = mox.MockMethod('ArgsAndKwargs', [], False,
89333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck                                CheckCallTestClass.ArgsAndKwargs,
89433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck                                class_to_bind=CheckCallTestClass)
89533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertRaises(AttributeError, method)
89633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        method(1)
89733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        method(1, 2)
89833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        method(1, 2, 3)
89933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        method(a=1)
90033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        method(1, b=2)
90133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertRaises(AttributeError, method, 1, a=2)
90233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        method(b=2, a=1)
90333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        method(c=3, b=2, a=1)
90433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        method(1, 2, c=3)
90533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
90633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
90733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reckclass CheckCallTestClass(object):
90833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def NoParameters(self):
90933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        pass
91033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
91133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def OneParameter(self, a):
91233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        pass
91333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
91433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def TwoParameters(self, a, b):
91533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        pass
91633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
91733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def OneDefaultValue(self, a=1):
91833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        pass
91933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
92033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def TwoDefaultValues(self, a, b, c=1, d=2):
92133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        pass
92233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
92333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def Args(self, a, b, *args):
92433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        pass
92533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
92633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def Kwargs(self, a, b=2, **kwargs):
92733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        pass
92833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
92933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def ArgsAndKwargs(self, a, *args, **kwargs):
93033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        pass
93133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
93233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
93333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reckclass MockObjectTest(testtools.TestCase):
93433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    """Verify that the MockObject class works as exepcted."""
93533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
93633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def setUp(self):
93733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        super(MockObjectTest, self).setUp()
93833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mock_object = mox.MockObject(TestClass)
93933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
94033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testSetupModeWithValidCall(self):
94133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Verify the mock object properly mocks a basic method call."""
94233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mock_object.ValidCall()
94333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertTrue(len(self.mock_object._expected_calls_queue) == 1)
94433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
94533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testSetupModeWithInvalidCall(self):
94633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Rase UnknownMethodCallError for a non-member method call.
94733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """
94833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        # Note: assertRaises does not catch exceptions thrown by MockObject's
94933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        # __getattr__
95033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        try:
95133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck            self.mock_object.InvalidCall()
95233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck            self.fail("No exception thrown, expected UnknownMethodCallError")
95333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        except mox.UnknownMethodCallError:
95433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck            pass
95533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        except Exception:
95633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck            self.fail("Wrong exception type thrown,"
95733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck                      " expected UnknownMethodCallError")
95833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
95933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testReplayWithInvalidCall(self):
96033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Rase UnknownMethodCallError for a non-member method call.
96133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """
96233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mock_object.ValidCall()  # setup method call
96333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mock_object._Replay()  # start replay mode
96433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        # Note: assertRaises does not catch exceptions thrown by MockObject's
96533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        # __getattr__
96633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        try:
96733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck            self.mock_object.InvalidCall()
96833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck            self.fail("No exception thrown, expected UnknownMethodCallError")
96933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        except mox.UnknownMethodCallError:
97033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck            pass
97133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        except Exception:
97233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck            self.fail("Wrong exception type thrown,"
97333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck                      " expected UnknownMethodCallError")
97433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
97533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testIsInstance(self):
97633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Mock should be able to pass as an instance of the mocked class."""
97733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertTrue(isinstance(self.mock_object, TestClass))
97833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
97933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testFindValidMethods(self):
98033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Mock should be able to mock all public methods."""
98133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertTrue('ValidCall' in self.mock_object._known_methods)
98233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertTrue('OtherValidCall' in self.mock_object._known_methods)
98333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertTrue('MyClassMethod' in self.mock_object._known_methods)
98433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertTrue('MyStaticMethod' in self.mock_object._known_methods)
98533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertTrue('_ProtectedCall' in self.mock_object._known_methods)
98633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertTrue('__PrivateCall' not in self.mock_object._known_methods)
98733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertTrue(
98833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck            '_TestClass__PrivateCall' in self.mock_object._known_methods)
98933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
99033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testFindsSuperclassMethods(self):
99133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Mock should be able to mock superclasses methods."""
99233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mock_object = mox.MockObject(ChildClass)
99333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertTrue('ValidCall' in self.mock_object._known_methods)
99433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertTrue('OtherValidCall' in self.mock_object._known_methods)
99533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertTrue('MyClassMethod' in self.mock_object._known_methods)
99633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertTrue('ChildValidCall' in self.mock_object._known_methods)
99733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
99833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testAccessClassVariables(self):
99933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Class variables should be accessible through the mock."""
100033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertTrue('SOME_CLASS_VAR' in self.mock_object._known_vars)
100133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertTrue('_PROTECTED_CLASS_VAR' in self.mock_object._known_vars)
100233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertEqual('test_value', self.mock_object.SOME_CLASS_VAR)
100333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
100433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testEquals(self):
100533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """A mock should be able to compare itself to another object."""
100633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mock_object._Replay()
100733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertEqual(self.mock_object, self.mock_object)
100833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
100933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testEqualsMockFailure(self):
101033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Verify equals identifies unequal objects."""
101133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mock_object.ValidCall()
101233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mock_object._Replay()
101333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertNotEqual(self.mock_object, mox.MockObject(TestClass))
101433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
101533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testEqualsInstanceFailure(self):
101633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Verify equals identifies that objects are different instances."""
101733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mock_object._Replay()
101833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertNotEqual(self.mock_object, TestClass())
101933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
102033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testNotEquals(self):
102133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Verify not equals works."""
102233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mock_object._Replay()
102333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertFalse(self.mock_object != self.mock_object)
102433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
102533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testMockSetItem_ExpectedSetItem_Success(self):
102633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Test that __setitem__() gets mocked in Dummy.
102733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
102833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        In this test, _Verify() succeeds.
102933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """
103033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        dummy = mox.MockObject(TestClass)
103133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        dummy['X'] = 'Y'
103233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
103333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        dummy._Replay()
103433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
103533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        dummy['X'] = 'Y'
103633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
103733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        dummy._Verify()
103833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
103933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testMockSetItem_ExpectedSetItem_NoSuccess(self):
104033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Test that __setitem__() gets mocked in Dummy.
104133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
104233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        In this test, _Verify() fails.
104333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """
104433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        dummy = mox.MockObject(TestClass)
104533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        dummy['X'] = 'Y'
104633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
104733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        dummy._Replay()
104833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
104933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        # NOT doing dummy['X'] = 'Y'
105033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
105133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertRaises(mox.ExpectedMethodCallsError, dummy._Verify)
105233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
105333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testMockSetItem_ExpectedNoSetItem_Success(self):
105433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Test that __setitem__() gets mocked in Dummy."""
105533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        dummy = mox.MockObject(TestClass)
105633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        # NOT doing dummy['X'] = 'Y'
105733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
105833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        dummy._Replay()
105933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
106033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        def call():
106133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck            dummy['X'] = 'Y'
106233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
106333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertRaises(mox.UnexpectedMethodCallError, call)
106433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
106533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testMockSetItem_ExpectedNoSetItem_NoSuccess(self):
106633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Test that __setitem__() gets mocked in Dummy.
106733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
106833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        In this test, _Verify() fails.
106933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """
107033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        dummy = mox.MockObject(TestClass)
107133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        # NOT doing dummy['X'] = 'Y'
107233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
107333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        dummy._Replay()
107433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
107533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        # NOT doing dummy['X'] = 'Y'
107633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
107733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        dummy._Verify()
107833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
107933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testMockSetItem_ExpectedSetItem_NonmatchingParameters(self):
108033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Test that __setitem__() fails if other parameters are expected."""
108133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        dummy = mox.MockObject(TestClass)
108233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        dummy['X'] = 'Y'
108333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
108433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        dummy._Replay()
108533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
108633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        def call():
108733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck            dummy['wrong'] = 'Y'
108833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
108933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertRaises(mox.UnexpectedMethodCallError, call)
109033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
109133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        dummy._Verify()
109233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
109333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testMockSetItem_WithSubClassOfNewStyleClass(self):
109433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        class NewStyleTestClass(object):
109533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck            def __init__(self):
109633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck                self.my_dict = {}
109733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
109833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck            def __setitem__(self, key, value):
109933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck                self.my_dict[key], value
110033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
110133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        class TestSubClass(NewStyleTestClass):
110233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck            pass
110333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
110433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        dummy = mox.MockObject(TestSubClass)
110533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        dummy[1] = 2
110633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        dummy._Replay()
110733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        dummy[1] = 2
110833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        dummy._Verify()
110933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
111033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testMockGetItem_ExpectedGetItem_Success(self):
111133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Test that __getitem__() gets mocked in Dummy.
111233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
111333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        In this test, _Verify() succeeds.
111433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """
111533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        dummy = mox.MockObject(TestClass)
111633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        dummy['X'].AndReturn('value')
111733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
111833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        dummy._Replay()
111933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
112033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertEqual(dummy['X'], 'value')
112133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
112233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        dummy._Verify()
112333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
112433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testMockGetItem_ExpectedGetItem_NoSuccess(self):
112533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Test that __getitem__() gets mocked in Dummy.
112633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
112733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        In this test, _Verify() fails.
112833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """
112933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        dummy = mox.MockObject(TestClass)
113033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        dummy['X'].AndReturn('value')
113133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
113233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        dummy._Replay()
113333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
113433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        # NOT doing dummy['X']
113533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
113633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertRaises(mox.ExpectedMethodCallsError, dummy._Verify)
113733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
113833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testMockGetItem_ExpectedNoGetItem_NoSuccess(self):
113933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Test that __getitem__() gets mocked in Dummy."""
114033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        dummy = mox.MockObject(TestClass)
114133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        # NOT doing dummy['X']
114233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
114333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        dummy._Replay()
114433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
114533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        def call():
114633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck            return dummy['X']
114733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
114833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertRaises(mox.UnexpectedMethodCallError, call)
114933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
115033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testMockGetItem_ExpectedGetItem_NonmatchingParameters(self):
115133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Test that __getitem__() fails if other parameters are expected."""
115233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        dummy = mox.MockObject(TestClass)
115333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        dummy['X'].AndReturn('value')
115433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
115533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        dummy._Replay()
115633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
115733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        def call():
115833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck            return dummy['wrong']
115933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
116033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertRaises(mox.UnexpectedMethodCallError, call)
116133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
116233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        dummy._Verify()
116333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
116433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testMockGetItem_WithSubClassOfNewStyleClass(self):
116533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        class NewStyleTestClass(object):
116633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck            def __getitem__(self, key):
116733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck                return {1: '1', 2: '2'}[key]
116833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
116933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        class TestSubClass(NewStyleTestClass):
117033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck            pass
117133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
117233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        dummy = mox.MockObject(TestSubClass)
117333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        dummy[1].AndReturn('3')
117433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
117533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        dummy._Replay()
117633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertEqual('3', dummy.__getitem__(1))
117733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        dummy._Verify()
117833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
117933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testMockIter_ExpectedIter_Success(self):
118033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Test that __iter__() gets mocked in Dummy.
118133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
118233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        In this test, _Verify() succeeds.
118333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """
118433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        dummy = mox.MockObject(TestClass)
118533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        iter(dummy).AndReturn(iter(['X', 'Y']))
118633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
118733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        dummy._Replay()
118833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
118933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertEqual([x for x in dummy], ['X', 'Y'])
119033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
119133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        dummy._Verify()
119233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
119333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testMockContains_ExpectedContains_Success(self):
119433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Test that __contains__ gets mocked in Dummy.
119533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
119633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        In this test, _Verify() succeeds.
119733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """
119833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        dummy = mox.MockObject(TestClass)
119933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        dummy.__contains__('X').AndReturn(True)
120033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
120133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        dummy._Replay()
120233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
120333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertTrue('X' in dummy)
120433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
120533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        dummy._Verify()
120633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
120733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testMockContains_ExpectedContains_NoSuccess(self):
120833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Test that __contains__() gets mocked in Dummy.
120933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
121033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        In this test, _Verify() fails.
121133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """
121233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        dummy = mox.MockObject(TestClass)
121333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        dummy.__contains__('X').AndReturn('True')
121433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
121533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        dummy._Replay()
121633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
121733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        # NOT doing 'X' in dummy
121833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
121933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertRaises(mox.ExpectedMethodCallsError, dummy._Verify)
122033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
122133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testMockContains_ExpectedContains_NonmatchingParameter(self):
122233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Test that __contains__ fails if other parameters are expected."""
122333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        dummy = mox.MockObject(TestClass)
122433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        dummy.__contains__('X').AndReturn(True)
122533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
122633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        dummy._Replay()
122733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
122833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        def call():
122933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck            return 'Y' in dummy
123033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
123133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertRaises(mox.UnexpectedMethodCallError, call)
123233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
123333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        dummy._Verify()
123433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
123533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testMockIter_ExpectedIter_NoSuccess(self):
123633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Test that __iter__() gets mocked in Dummy.
123733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
123833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        In this test, _Verify() fails.
123933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """
124033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        dummy = mox.MockObject(TestClass)
124133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        iter(dummy).AndReturn(iter(['X', 'Y']))
124233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
124333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        dummy._Replay()
124433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
124533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        # NOT doing self.assertEqual([x for x in dummy], ['X', 'Y'])
124633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
124733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertRaises(mox.ExpectedMethodCallsError, dummy._Verify)
124833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
124933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testMockIter_ExpectedNoIter_NoSuccess(self):
125033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Test that __iter__() gets mocked in Dummy."""
125133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        dummy = mox.MockObject(TestClass)
125233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        # NOT doing iter(dummy)
125333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
125433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        dummy._Replay()
125533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
125633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        def call():
125733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck            return [x for x in dummy]
125833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertRaises(mox.UnexpectedMethodCallError, call)
125933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
126033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testMockIter_ExpectedGetItem_Success(self):
126133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Test that __iter__() gets mocked in Dummy using getitem."""
126233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        dummy = mox.MockObject(SubscribtableNonIterableClass)
126333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        dummy[0].AndReturn('a')
126433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        dummy[1].AndReturn('b')
126533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        dummy[2].AndRaise(IndexError)
126633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
126733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        dummy._Replay()
126833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertEqual(['a', 'b'], [x for x in dummy])
126933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        dummy._Verify()
127033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
127133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testMockIter_ExpectedNoGetItem_NoSuccess(self):
127233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Test that __iter__() gets mocked in Dummy using getitem."""
127333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        dummy = mox.MockObject(SubscribtableNonIterableClass)
127433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        # NOT doing dummy[index]
127533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
127633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        dummy._Replay()
127733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        function = lambda: [x for x in dummy]
127833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertRaises(mox.UnexpectedMethodCallError, function)
127933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
128033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testMockGetIter_WithSubClassOfNewStyleClass(self):
128133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        class NewStyleTestClass(object):
128233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck            def __iter__(self):
128333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck                return iter([1, 2, 3])
128433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
128533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        class TestSubClass(NewStyleTestClass):
128633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck            pass
128733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
128833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        dummy = mox.MockObject(TestSubClass)
128933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        iter(dummy).AndReturn(iter(['a', 'b']))
129033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        dummy._Replay()
129133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertEqual(['a', 'b'], [x for x in dummy])
129233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        dummy._Verify()
129333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
129433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testInstantiationWithAdditionalAttributes(self):
129533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_object = mox.MockObject(TestClass, attrs={"attr1": "value"})
129633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertEqual(mock_object.attr1, "value")
129733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
129833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testCantOverrideMethodsWithAttributes(self):
129933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertRaises(ValueError, mox.MockObject, TestClass,
130033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck                          attrs={"ValidCall": "value"})
130133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
130233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testCantMockNonPublicAttributes(self):
130333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertRaises(mox.PrivateAttributeError, mox.MockObject, TestClass,
130433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck                          attrs={"_protected": "value"})
130533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertRaises(mox.PrivateAttributeError, mox.MockObject, TestClass,
130633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck                          attrs={"__private": "value"})
130733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
130833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
130933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reckclass MoxTest(testtools.TestCase):
131033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    """Verify Mox works correctly."""
131133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
131233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def setUp(self):
131333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        super(MoxTest, self).setUp()
131433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox = mox.Mox()
131533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
131633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testCreateObject(self):
131733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Mox should create a mock object."""
131833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.CreateMock(TestClass)
131933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
132033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testVerifyObjectWithCompleteReplay(self):
132133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Mox should replay and verify all objects it created."""
132233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj = self.mox.CreateMock(TestClass)
132333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj.ValidCall()
132433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj.ValidCallWithArgs(mox.IsA(TestClass))
132533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.ReplayAll()
132633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj.ValidCall()
132733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj.ValidCallWithArgs(TestClass("some_value"))
132833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.VerifyAll()
132933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
133033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testVerifyObjectWithIncompleteReplay(self):
133133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Mox should raise an exception if a mock didn't replay completely."""
133233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj = self.mox.CreateMock(TestClass)
133333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj.ValidCall()
133433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.ReplayAll()
133533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        # ValidCall() is never made
133633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertRaises(mox.ExpectedMethodCallsError, self.mox.VerifyAll)
133733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
133833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testEntireWorkflow(self):
133933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Test the whole work flow."""
134033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj = self.mox.CreateMock(TestClass)
134133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj.ValidCall().AndReturn("yes")
134233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.ReplayAll()
134333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
134433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        ret_val = mock_obj.ValidCall()
134533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertEqual("yes", ret_val)
134633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.VerifyAll()
134733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
134833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testSignatureMatchingWithComparatorAsFirstArg(self):
134933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Test that the first argument can be a comparator."""
135033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
135133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        def VerifyLen(val):
135233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck            """This will raise an exception when not given a list.
135333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
135433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck            This exception will be raised when trying to infer/validate the
135533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck            method signature.
135633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck            """
135733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck            return len(val) != 1
135833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
135933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj = self.mox.CreateMock(TestClass)
136033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        # This intentionally does not name the 'nine' param so it triggers
136133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        # deeper inspection.
136233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj.MethodWithArgs(mox.Func(VerifyLen), mox.IgnoreArg(), None)
136333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.ReplayAll()
136433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
136533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj.MethodWithArgs([1, 2], "foo", None)
136633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
136733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.VerifyAll()
136833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
136933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testCallableObject(self):
137033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Test recording calls to a callable object works."""
137133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj = self.mox.CreateMock(CallableClass)
137233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj("foo").AndReturn("qux")
137333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.ReplayAll()
137433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
137533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        ret_val = mock_obj("foo")
137633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertEqual("qux", ret_val)
137733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.VerifyAll()
137833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
137933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testInheritedCallableObject(self):
138033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Recording calls to an object inheriting from a callable object."""
138133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj = self.mox.CreateMock(InheritsFromCallable)
138233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj("foo").AndReturn("qux")
138333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.ReplayAll()
138433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
138533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        ret_val = mock_obj("foo")
138633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertEqual("qux", ret_val)
138733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.VerifyAll()
138833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
138933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testCallOnNonCallableObject(self):
139033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Test that you cannot call a non-callable object."""
139133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj = self.mox.CreateMock("string is not callable")
139233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertRaises(TypeError, mock_obj)
139333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
139433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testCallableObjectWithBadCall(self):
139533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Test verifying calls to a callable object works."""
139633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj = self.mox.CreateMock(CallableClass)
139733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj("foo").AndReturn("qux")
139833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.ReplayAll()
139933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
140033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertRaises(mox.UnexpectedMethodCallError, mock_obj, "ZOOBAZ")
140133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
140233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testCallableObjectVerifiesSignature(self):
140333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj = self.mox.CreateMock(CallableClass)
140433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        # Too many arguments
140533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertRaises(AttributeError, mock_obj, "foo", "bar")
140633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
140733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testUnorderedGroup(self):
140833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Test that using one unordered group works."""
140933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj = self.mox.CreateMockAnything()
141033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj.Method(1).InAnyOrder()
141133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj.Method(2).InAnyOrder()
141233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.ReplayAll()
141333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
141433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj.Method(2)
141533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj.Method(1)
141633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
141733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.VerifyAll()
141833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
141933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testUnorderedGroupsInline(self):
142033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Unordered groups should work in the context of ordered calls."""
142133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj = self.mox.CreateMockAnything()
142233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj.Open()
142333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj.Method(1).InAnyOrder()
142433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj.Method(2).InAnyOrder()
142533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj.Close()
142633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.ReplayAll()
142733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
142833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj.Open()
142933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj.Method(2)
143033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj.Method(1)
143133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj.Close()
143233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
143333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.VerifyAll()
143433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
143533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testMultipleUnorderdGroups(self):
143633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Multiple unoreded groups should work."""
143733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj = self.mox.CreateMockAnything()
143833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj.Method(1).InAnyOrder()
143933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj.Method(2).InAnyOrder()
144033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj.Foo().InAnyOrder('group2')
144133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj.Bar().InAnyOrder('group2')
144233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.ReplayAll()
144333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
144433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj.Method(2)
144533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj.Method(1)
144633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj.Bar()
144733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj.Foo()
144833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
144933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.VerifyAll()
145033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
145133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testMultipleUnorderdGroupsOutOfOrder(self):
145233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Multiple unordered groups should maintain external order"""
145333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj = self.mox.CreateMockAnything()
145433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj.Method(1).InAnyOrder()
145533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj.Method(2).InAnyOrder()
145633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj.Foo().InAnyOrder('group2')
145733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj.Bar().InAnyOrder('group2')
145833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.ReplayAll()
145933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
146033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj.Method(2)
146133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertRaises(mox.UnexpectedMethodCallError, mock_obj.Bar)
146233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
146333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testUnorderedGroupWithReturnValue(self):
146433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Unordered groups should work with return values."""
146533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj = self.mox.CreateMockAnything()
146633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj.Open()
146733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj.Method(1).InAnyOrder().AndReturn(9)
146833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj.Method(2).InAnyOrder().AndReturn(10)
146933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj.Close()
147033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.ReplayAll()
147133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
147233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj.Open()
147333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        actual_two = mock_obj.Method(2)
147433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        actual_one = mock_obj.Method(1)
147533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj.Close()
147633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
147733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertEqual(9, actual_one)
147833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertEqual(10, actual_two)
147933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
148033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.VerifyAll()
148133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
148233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testUnorderedGroupWithComparator(self):
148333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Unordered groups should work with comparators."""
148433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
148533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        def VerifyOne(cmd):
148633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck            if not isinstance(cmd, str):
148733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck                self.fail('Unexpected type passed to comparator: ' + str(cmd))
148833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck            return cmd == 'test'
148933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
149033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        def VerifyTwo(cmd):
149133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck            return True
149233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
149333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj = self.mox.CreateMockAnything()
149433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj.Foo(['test'], mox.Func(VerifyOne), bar=1).InAnyOrder().\
149533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck            AndReturn('yes test')
149633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj.Foo(['test'], mox.Func(VerifyTwo), bar=1).InAnyOrder().\
149733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck            AndReturn('anything')
149833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
149933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.ReplayAll()
150033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
150133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj.Foo(['test'], 'anything', bar=1)
150233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj.Foo(['test'], 'test', bar=1)
150333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
150433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.VerifyAll()
150533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
150633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testMultipleTimes(self):
150733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Test if MultipleTimesGroup works."""
150833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj = self.mox.CreateMockAnything()
150933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj.Method(1).MultipleTimes().AndReturn(9)
151033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj.Method(2).AndReturn(10)
151133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj.Method(3).MultipleTimes().AndReturn(42)
151233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.ReplayAll()
151333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
151433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        actual_one = mock_obj.Method(1)
151533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        second_one = mock_obj.Method(1)    # This tests MultipleTimes.
151633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        actual_two = mock_obj.Method(2)
151733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        actual_three = mock_obj.Method(3)
151833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj.Method(3)
151933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj.Method(3)
152033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
152133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.VerifyAll()
152233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
152333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertEqual(9, actual_one)
152433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        # Repeated calls should return same number.
152533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertEqual(9, second_one)
152633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertEqual(10, actual_two)
152733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertEqual(42, actual_three)
152833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
152933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testMultipleTimesUsingIsAParameter(self):
153033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Test if MultipleTimesGroup works with a IsA parameter."""
153133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj = self.mox.CreateMockAnything()
153233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj.Open()
153333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj.Method(mox.IsA(str)).MultipleTimes("IsA").AndReturn(9)
153433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj.Close()
153533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.ReplayAll()
153633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
153733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj.Open()
153833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        actual_one = mock_obj.Method("1")
153933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        second_one = mock_obj.Method("2")    # This tests MultipleTimes.
154033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj.Close()
154133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
154233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.VerifyAll()
154333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
154433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertEqual(9, actual_one)
154533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        # Repeated calls should return same number.
154633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertEqual(9, second_one)
154733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
154833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testMutlipleTimesUsingFunc(self):
154933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Test that the Func is not evaluated more times than necessary.
155033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
155133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        If a Func() has side effects, it can cause a passing test to fail.
155233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """
155333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
155433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.counter = 0
155533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
155633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        def MyFunc(actual_str):
155733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck            """Increment the counter if actual_str == 'foo'."""
155833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck            if actual_str == 'foo':
155933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck                self.counter += 1
156033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck            return True
156133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
156233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj = self.mox.CreateMockAnything()
156333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj.Open()
156433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj.Method(mox.Func(MyFunc)).MultipleTimes()
156533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj.Close()
156633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.ReplayAll()
156733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
156833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj.Open()
156933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj.Method('foo')
157033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj.Method('foo')
157133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj.Method('not-foo')
157233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj.Close()
157333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
157433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.VerifyAll()
157533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
157633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertEqual(2, self.counter)
157733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
157833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testMultipleTimesThreeMethods(self):
157933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Test if MultipleTimesGroup works with three or more methods."""
158033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj = self.mox.CreateMockAnything()
158133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj.Open()
158233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj.Method(1).MultipleTimes().AndReturn(9)
158333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj.Method(2).MultipleTimes().AndReturn(8)
158433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj.Method(3).MultipleTimes().AndReturn(7)
158533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj.Method(4).AndReturn(10)
158633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj.Close()
158733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.ReplayAll()
158833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
158933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj.Open()
159033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        actual_three = mock_obj.Method(3)
159133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj.Method(1)
159233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        actual_two = mock_obj.Method(2)
159333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj.Method(3)
159433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        actual_one = mock_obj.Method(1)
159533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        actual_four = mock_obj.Method(4)
159633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj.Close()
159733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
159833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertEqual(9, actual_one)
159933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertEqual(8, actual_two)
160033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertEqual(7, actual_three)
160133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertEqual(10, actual_four)
160233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
160333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.VerifyAll()
160433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
160533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testMultipleTimesMissingOne(self):
160633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Test if MultipleTimesGroup fails if one method is missing."""
160733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj = self.mox.CreateMockAnything()
160833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj.Open()
160933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj.Method(1).MultipleTimes().AndReturn(9)
161033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj.Method(2).MultipleTimes().AndReturn(8)
161133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj.Method(3).MultipleTimes().AndReturn(7)
161233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj.Method(4).AndReturn(10)
161333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj.Close()
161433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.ReplayAll()
161533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
161633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj.Open()
161733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj.Method(3)
161833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj.Method(2)
161933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj.Method(3)
162033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj.Method(3)
162133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj.Method(2)
162233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
162333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertRaises(mox.UnexpectedMethodCallError, mock_obj.Method, 4)
162433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
162533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testMultipleTimesTwoGroups(self):
162633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Test if MultipleTimesGroup works with a group after a
162733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        MultipleTimesGroup.
162833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """
162933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj = self.mox.CreateMockAnything()
163033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj.Open()
163133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj.Method(1).MultipleTimes().AndReturn(9)
163233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj.Method(3).MultipleTimes("nr2").AndReturn(42)
163333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj.Close()
163433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.ReplayAll()
163533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
163633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj.Open()
163733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        actual_one = mock_obj.Method(1)
163833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj.Method(1)
163933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        actual_three = mock_obj.Method(3)
164033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj.Method(3)
164133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj.Close()
164233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
164333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertEqual(9, actual_one)
164433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertEqual(42, actual_three)
164533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
164633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.VerifyAll()
164733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
164833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testMultipleTimesTwoGroupsFailure(self):
164933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Test if MultipleTimesGroup fails with a group after a
165033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        MultipleTimesGroup.
165133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """
165233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj = self.mox.CreateMockAnything()
165333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj.Open()
165433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj.Method(1).MultipleTimes().AndReturn(9)
165533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj.Method(3).MultipleTimes("nr2").AndReturn(42)
165633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj.Close()
165733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.ReplayAll()
165833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
165933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj.Open()
166033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj.Method(1)
166133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj.Method(1)
166233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj.Method(3)
166333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
166433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertRaises(mox.UnexpectedMethodCallError, mock_obj.Method, 1)
166533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
166633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testWithSideEffects(self):
166733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Test side effect operations actually modify their target objects."""
166833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        def modifier(mutable_list):
166933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck            mutable_list[0] = 'mutated'
167033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj = self.mox.CreateMockAnything()
167133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj.ConfigureInOutParameter(
167233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck            ['original']).WithSideEffects(modifier)
167333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj.WorkWithParameter(['mutated'])
167433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.ReplayAll()
167533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
167633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        local_list = ['original']
167733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj.ConfigureInOutParameter(local_list)
167833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj.WorkWithParameter(local_list)
167933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
168033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.VerifyAll()
168133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
168233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testWithSideEffectsException(self):
168333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Test side effect operations actually modify their target objects."""
168433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        class TestException(Exception):
168533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck            pass
168633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
168733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        def modifier(mutable_list):
168833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck            mutable_list[0] = 'mutated'
168933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj = self.mox.CreateMockAnything()
169033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        method = mock_obj.ConfigureInOutParameter(['original'])
169133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        method.WithSideEffects(modifier).AndRaise(TestException('exception'))
169233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj.WorkWithParameter(['mutated'])
169333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.ReplayAll()
169433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
169533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        local_list = ['original']
169633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertRaises(TestException,
169733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck                          mock_obj.ConfigureInOutParameter,
169833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck                          local_list)
169933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj.WorkWithParameter(local_list)
170033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
170133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.VerifyAll()
170233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
170333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testStubOutMethod(self):
170433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Test that a method is replaced with a MockObject."""
170533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        test_obj = TestClass()
170633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        method_type = type(test_obj.OtherValidCall)
170733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        # Replace OtherValidCall with a mock.
170833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.StubOutWithMock(test_obj, 'OtherValidCall')
170933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertTrue(isinstance(test_obj.OtherValidCall, mox.MockObject))
171033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertFalse(type(test_obj.OtherValidCall) is method_type)
171133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
171233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        test_obj.OtherValidCall().AndReturn('foo')
171333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.ReplayAll()
171433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
171533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        actual = test_obj.OtherValidCall()
171633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
171733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.VerifyAll()
171833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.UnsetStubs()
171933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertEqual('foo', actual)
172033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertTrue(type(test_obj.OtherValidCall) is method_type)
172133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
172233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testStubOutMethod_Unbound_Comparator(self):
172333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        instance = TestClass()
172433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.StubOutWithMock(TestClass, 'OtherValidCall')
172533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
172633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        TestClass.OtherValidCall(mox.IgnoreArg()).AndReturn('foo')
172733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.ReplayAll()
172833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
172933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        actual = TestClass.OtherValidCall(instance)
173033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
173133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.VerifyAll()
173233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.UnsetStubs()
173333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertEqual('foo', actual)
173433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
173533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testStubOutMethod_Unbound_Subclass_Comparator(self):
173633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.StubOutWithMock(
173733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck            mox_helper.TestClassFromAnotherModule, 'Value')
173833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mox_helper.TestClassFromAnotherModule.Value(
173933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck            mox.IsA(mox_helper.ChildClassFromAnotherModule)).AndReturn('foo')
174033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.ReplayAll()
174133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
174233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        instance = mox_helper.ChildClassFromAnotherModule()
174333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        actual = mox_helper.TestClassFromAnotherModule.Value(instance)
174433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
174533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.VerifyAll()
174633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.UnsetStubs()
174733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertEqual('foo', actual)
174833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
174933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testStubOuMethod_Unbound_WithOptionalParams(self):
175033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox = mox.Mox()
175133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.StubOutWithMock(TestClass, 'OptionalArgs')
175233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        TestClass.OptionalArgs(mox.IgnoreArg(), foo=2)
175333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.ReplayAll()
175433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
175533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        t = TestClass()
175633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        TestClass.OptionalArgs(t, foo=2)
175733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
175833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.VerifyAll()
175933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.UnsetStubs()
176033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
176133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testStubOutMethod_Unbound_ActualInstance(self):
176233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        instance = TestClass()
176333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.StubOutWithMock(TestClass, 'OtherValidCall')
176433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
176533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        TestClass.OtherValidCall(instance).AndReturn('foo')
176633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.ReplayAll()
176733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
176833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        actual = TestClass.OtherValidCall(instance)
176933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
177033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.VerifyAll()
177133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.UnsetStubs()
177233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertEqual('foo', actual)
177333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
177433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testStubOutMethod_Unbound_DifferentInstance(self):
177533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        instance = TestClass()
177633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.StubOutWithMock(TestClass, 'OtherValidCall')
177733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
177833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        TestClass.OtherValidCall(instance).AndReturn('foo')
177933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.ReplayAll()
178033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
178133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        # This should fail, since the instances are different
178233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertRaises(mox.UnexpectedMethodCallError,
178333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck                          TestClass.OtherValidCall, "wrong self")
178433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
178533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.VerifyAll()
178633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.UnsetStubs()
178733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
178833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testStubOutMethod_Unbound_NamedUsingPositional(self):
178933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Check positional parameters can be matched to keyword arguments."""
179033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.StubOutWithMock(mox_helper.ExampleClass, 'NamedParams')
179133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        instance = mox_helper.ExampleClass()
179233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mox_helper.ExampleClass.NamedParams(instance, 'foo', baz=None)
179333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.ReplayAll()
179433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
179533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mox_helper.ExampleClass.NamedParams(instance, 'foo', baz=None)
179633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
179733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.VerifyAll()
179833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.UnsetStubs()
179933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
180033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testStubOutMethod_Unbound_NamedUsingPositional_SomePositional(self):
180133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Check positional parameters can be matched to keyword arguments."""
180233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.StubOutWithMock(mox_helper.ExampleClass, 'TestMethod')
180333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        instance = mox_helper.ExampleClass()
180433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mox_helper.ExampleClass.TestMethod(instance, 'one', 'two', 'nine')
180533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.ReplayAll()
180633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
180733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mox_helper.ExampleClass.TestMethod(instance, 'one', 'two', 'nine')
180833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
180933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.VerifyAll()
181033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.UnsetStubs()
181133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
181233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testStubOutMethod_Unbound_SpecialArgs(self):
181333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.StubOutWithMock(mox_helper.ExampleClass, 'SpecialArgs')
181433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        instance = mox_helper.ExampleClass()
181533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mox_helper.ExampleClass.SpecialArgs(instance, 'foo', None, bar='bar')
181633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.ReplayAll()
181733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
181833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mox_helper.ExampleClass.SpecialArgs(instance, 'foo', None, bar='bar')
181933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
182033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.VerifyAll()
182133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.UnsetStubs()
182233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
182333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testStubOutMethod_Bound_SimpleTest(self):
182433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        t = self.mox.CreateMock(TestClass)
182533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
182633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        t.MethodWithArgs(mox.IgnoreArg(), mox.IgnoreArg()).AndReturn('foo')
182733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.ReplayAll()
182833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
182933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        actual = t.MethodWithArgs(None, None)
183033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
183133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.VerifyAll()
183233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.UnsetStubs()
183333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertEqual('foo', actual)
183433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
183533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testStubOutMethod_Bound_NamedUsingPositional(self):
183633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Check positional parameters can be matched to keyword arguments."""
183733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.StubOutWithMock(mox_helper.ExampleClass, 'NamedParams')
183833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        instance = mox_helper.ExampleClass()
183933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        instance.NamedParams('foo', baz=None)
184033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.ReplayAll()
184133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
184233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        instance.NamedParams('foo', baz=None)
184333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
184433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.VerifyAll()
184533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.UnsetStubs()
184633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
184733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testStubOutMethod_Bound_NamedUsingPositional_SomePositional(self):
184833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Check positional parameters can be matched to keyword arguments."""
184933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.StubOutWithMock(mox_helper.ExampleClass, 'TestMethod')
185033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        instance = mox_helper.ExampleClass()
185133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        instance.TestMethod(instance, 'one', 'two', 'nine')
185233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.ReplayAll()
185333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
185433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        instance.TestMethod(instance, 'one', 'two', 'nine')
185533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
185633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.VerifyAll()
185733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.UnsetStubs()
185833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
185933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testStubOutMethod_Bound_SpecialArgs(self):
186033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.StubOutWithMock(mox_helper.ExampleClass, 'SpecialArgs')
186133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        instance = mox_helper.ExampleClass()
186233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        instance.SpecialArgs(instance, 'foo', None, bar='bar')
186333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.ReplayAll()
186433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
186533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        instance.SpecialArgs(instance, 'foo', None, bar='bar')
186633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
186733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.VerifyAll()
186833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.UnsetStubs()
186933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
187033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testStubOutMethod_Func_PropgatesExceptions(self):
187133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Errors in Func comparator should propagate to the calling method."""
187233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        class TestException(Exception):
187333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck            pass
187433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
187533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        def raiseExceptionOnNotOne(value):
187633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck            if value == 1:
187733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck                return True
187833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck            else:
187933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck                raise TestException
188033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
188133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        test_obj = TestClass()
188233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.StubOutWithMock(test_obj, 'MethodWithArgs')
188333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        test_obj.MethodWithArgs(
188433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck            mox.IgnoreArg(), mox.Func(raiseExceptionOnNotOne)).AndReturn(1)
188533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        test_obj.MethodWithArgs(
188633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck            mox.IgnoreArg(), mox.Func(raiseExceptionOnNotOne)).AndReturn(1)
188733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.ReplayAll()
188833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
188933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertEqual(test_obj.MethodWithArgs('ignored', 1), 1)
189033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertRaises(TestException,
189133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck                          test_obj.MethodWithArgs, 'ignored', 2)
189233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
189333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.VerifyAll()
189433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.UnsetStubs()
189533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
189633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testStubOut_SignatureMatching_init_(self):
189733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.StubOutWithMock(mox_helper.ExampleClass, '__init__')
189833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mox_helper.ExampleClass.__init__(mox.IgnoreArg())
189933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.ReplayAll()
190033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
190133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        # Create an instance of a child class, which calls the parent
190233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        # __init__
190333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mox_helper.ChildExampleClass()
190433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
190533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.VerifyAll()
190633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.UnsetStubs()
190733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
190833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    # FIXME(dhellmann): Skip this test until someone can debug why it
190933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    # fails on python 3.4.
191033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
191133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    @testtools.skipIf(six.PY3, "This test needs to be fixed for python 3")
191233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testStubOutClass_OldStyle(self):
191333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Test a mocked class whose __init__ returns a Mock."""
191433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.StubOutWithMock(mox_helper, 'TestClassFromAnotherModule')
191533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertTrue(isinstance(mox_helper.TestClassFromAnotherModule,
191633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck                                   mox.MockObject))
191733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
191833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_instance = self.mox.CreateMock(
191933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck            mox_helper.TestClassFromAnotherModule)
192033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mox_helper.TestClassFromAnotherModule().AndReturn(mock_instance)
192133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_instance.Value().AndReturn('mock instance')
192233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
192333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.ReplayAll()
192433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
192533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        a_mock = mox_helper.TestClassFromAnotherModule()
192633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        actual = a_mock.Value()
192733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
192833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.VerifyAll()
192933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.UnsetStubs()
193033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertEqual('mock instance', actual)
193133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
193233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testStubOutClass(self):
193333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.StubOutClassWithMocks(mox_helper, 'CallableClass')
193433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
193533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        # Instance one
193633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_one = mox_helper.CallableClass(1, 2)
193733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_one.Value().AndReturn('mock')
193833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
193933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        # Instance two
194033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_two = mox_helper.CallableClass(8, 9)
194133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_two('one').AndReturn('called mock')
194233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
194333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.ReplayAll()
194433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
194533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        one = mox_helper.CallableClass(1, 2)
194633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        actual_one = one.Value()
194733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
194833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        two = mox_helper.CallableClass(8, 9)
194933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        actual_two = two('one')
195033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
195133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.VerifyAll()
195233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.UnsetStubs()
195333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
195433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        # Verify the correct mocks were returned
195533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertEqual(mock_one, one)
195633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertEqual(mock_two, two)
195733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
195833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        # Verify
195933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertEqual('mock', actual_one)
196033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertEqual('called mock', actual_two)
196133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
196233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testStubOutClass_NotAClass(self):
196333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertRaises(TypeError, self.mox.StubOutClassWithMocks,
196433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck                          mox_helper, 'MyTestFunction')
196533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
196633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testStubOutClassNotEnoughCreated(self):
196733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.StubOutClassWithMocks(mox_helper, 'CallableClass')
196833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
196933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mox_helper.CallableClass(1, 2)
197033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mox_helper.CallableClass(8, 9)
197133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
197233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.ReplayAll()
197333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mox_helper.CallableClass(1, 2)
197433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
197533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertRaises(mox.ExpectedMockCreationError, self.mox.VerifyAll)
197633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.UnsetStubs()
197733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
197833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testStubOutClassWrongSignature(self):
197933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.StubOutClassWithMocks(mox_helper, 'CallableClass')
198033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
198133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertRaises(AttributeError, mox_helper.CallableClass)
198233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
198333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.UnsetStubs()
198433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
198533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testStubOutClassWrongParameters(self):
198633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.StubOutClassWithMocks(mox_helper, 'CallableClass')
198733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
198833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mox_helper.CallableClass(1, 2)
198933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
199033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.ReplayAll()
199133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
199233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertRaises(mox.UnexpectedMethodCallError,
199333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck                          mox_helper.CallableClass, 8, 9)
199433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.UnsetStubs()
199533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
199633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testStubOutClassTooManyCreated(self):
199733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.StubOutClassWithMocks(mox_helper, 'CallableClass')
199833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
199933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mox_helper.CallableClass(1, 2)
200033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
200133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.ReplayAll()
200233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mox_helper.CallableClass(1, 2)
200333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertRaises(mox.UnexpectedMockCreationError,
200433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck                          mox_helper.CallableClass, 8, 9)
200533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
200633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.UnsetStubs()
200733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
200833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testWarnsUserIfMockingMock(self):
200933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Test that user is warned if they try to stub out a MockAnything."""
201033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.StubOutWithMock(TestClass, 'MyStaticMethod')
201133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertRaises(TypeError, self.mox.StubOutWithMock, TestClass,
201233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck                          'MyStaticMethod')
201333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
201433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testStubOutFirstClassMethodVerifiesSignature(self):
201533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.StubOutWithMock(mox_helper, 'MyTestFunction')
201633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
201733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        # Wrong number of arguments
201833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertRaises(AttributeError, mox_helper.MyTestFunction, 1)
201933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.UnsetStubs()
202033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
202133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def _testMethodSignatureVerification(self, stubClass):
202233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        # If stubClass is true, the test is run against an a stubbed out class,
202333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        # else the test is run against a stubbed out instance.
202433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        if stubClass:
202533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck            self.mox.StubOutWithMock(mox_helper.ExampleClass, "TestMethod")
202633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck            obj = mox_helper.ExampleClass()
202733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        else:
202833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck            obj = mox_helper.ExampleClass()
202933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck            self.mox.StubOutWithMock(mox_helper.ExampleClass, "TestMethod")
203033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertRaises(AttributeError, obj.TestMethod)
203133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertRaises(AttributeError, obj.TestMethod, 1)
203233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertRaises(AttributeError, obj.TestMethod, nine=2)
203333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        obj.TestMethod(1, 2)
203433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        obj.TestMethod(1, 2, 3)
203533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        obj.TestMethod(1, 2, nine=3)
203633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertRaises(AttributeError, obj.TestMethod, 1, 2, 3, 4)
203733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.UnsetStubs()
203833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
203933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testStubOutClassMethodVerifiesSignature(self):
204033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self._testMethodSignatureVerification(stubClass=True)
204133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
204233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testStubOutObjectMethodVerifiesSignature(self):
204333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self._testMethodSignatureVerification(stubClass=False)
204433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
204533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testStubOutObject(self):
204633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Test than object is replaced with a Mock."""
204733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
204833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        class Foo(object):
204933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck            def __init__(self):
205033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck                self.obj = TestClass()
205133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
205233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        foo = Foo()
205333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.StubOutWithMock(foo, "obj")
205433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertTrue(isinstance(foo.obj, mox.MockObject))
205533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        foo.obj.ValidCall()
205633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.ReplayAll()
205733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
205833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        foo.obj.ValidCall()
205933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
206033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.VerifyAll()
206133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.UnsetStubs()
206233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertFalse(isinstance(foo.obj, mox.MockObject))
206333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
206433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testForgotReplayHelpfulMessage(self):
206533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """If there is an AttributeError on a MockMethod, give helpful msg."""
206633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        foo = self.mox.CreateMockAnything()
206733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        bar = self.mox.CreateMockAnything()
206833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        foo.GetBar().AndReturn(bar)
206933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        bar.ShowMeTheMoney()
207033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        # Forgot to replay!
207133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        try:
207233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck            foo.GetBar().ShowMeTheMoney()
207333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        except AttributeError as e:
207433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck            self.assertEqual(
207533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck                'MockMethod has no attribute "ShowMeTheMoney". '
207633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck                'Did you remember to put your mocks in replay mode?', str(e))
207733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
207833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
207933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reckclass ReplayTest(testtools.TestCase):
208033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    """Verify Replay works properly."""
208133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
208233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testReplay(self):
208333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Replay should put objects into replay mode."""
208433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj = mox.MockObject(TestClass)
208533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertFalse(mock_obj._replay_mode)
208633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mox.Replay(mock_obj)
208733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertTrue(mock_obj._replay_mode)
208833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
208933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
209033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reckclass MoxTestBaseTest(testtools.TestCase):
209133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    """Verify that all tests in class derived from MoxTestBase are wrapped."""
209233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
209333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def setUp(self):
209433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        super(MoxTestBaseTest, self).setUp()
209533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox = mox.Mox()
209633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.addCleanup(self.mox.UnsetStubs)
209733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.test_mox = mox.Mox()
209833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.addCleanup(self.test_mox.UnsetStubs)
209933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.test_stubs = mox.stubout.StubOutForTesting()
210033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.addCleanup(self.test_stubs.UnsetAll)
210133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.addCleanup(self.test_stubs.SmartUnsetAll)
210233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.result = testtools.TestResult()
210333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
210433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def _setUpTestClass(self):
210533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Replacement for setUp in the test class instance.
210633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
210733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        Assigns a mox.Mox instance as the mox attribute of the test instance.
210833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        Replacement Mox instance is under our control before setUp is called
210933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        in the test class instance.
211033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """
211133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.test.mox = self.test_mox
211233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.test.stubs = self.test_stubs
211333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
211433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def _CreateTest(self, test_name):
211533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Create a test from our example mox class.
211633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
211733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        The created test instance is assigned to this instances test attribute.
211833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """
211933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.test = mox_helper.ExampleMoxTest(test_name)
212033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.stubs.Set(self.test, 'setUp', self._setUpTestClass)
212133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
212233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def _VerifySuccess(self):
212333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Run the checks to confirm test method completed successfully."""
212433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.StubOutWithMock(self.test_mox, 'UnsetStubs')
212533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.StubOutWithMock(self.test_mox, 'VerifyAll')
212633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.StubOutWithMock(self.test_stubs, 'UnsetAll')
212733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.StubOutWithMock(self.test_stubs, 'SmartUnsetAll')
212833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.test_mox.UnsetStubs()
212933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.test_mox.VerifyAll()
213033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.test_stubs.UnsetAll()
213133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.test_stubs.SmartUnsetAll()
213233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.ReplayAll()
213333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.test.run(result=self.result)
213433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertTrue(self.result.wasSuccessful())
213533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.VerifyAll()
213633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.UnsetStubs()    # Needed to call the real VerifyAll() below.
213733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.test_mox.VerifyAll()
213833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
213933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testSuccess(self):
214033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Successful test method execution test."""
214133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self._CreateTest('testSuccess')
214233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self._VerifySuccess()
214333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
214433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testSuccessNoMocks(self):
214533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """testSuccess() unsets all the mocks. Vverify they've been unset."""
214633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self._CreateTest('testSuccess')
214733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.test.run(result=self.result)
214833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertTrue(self.result.wasSuccessful())
214933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertEqual(OS_LISTDIR, mox_helper.os.listdir)
215033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
215133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testStubs(self):
215233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Test that "self.stubs" is provided as is useful."""
215333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self._CreateTest('testHasStubs')
215433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self._VerifySuccess()
215533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
215633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testStubsNoMocks(self):
215733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Let testHasStubs() unset the stubs by itself."""
215833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self._CreateTest('testHasStubs')
215933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.test.run(result=self.result)
216033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertTrue(self.result.wasSuccessful())
216133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertEqual(OS_LISTDIR, mox_helper.os.listdir)
216233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
216333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testExpectedNotCalled(self):
216433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Stubbed out method is not called."""
216533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self._CreateTest('testExpectedNotCalled')
216633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.StubOutWithMock(self.test_mox, 'UnsetStubs')
216733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.StubOutWithMock(self.test_stubs, 'UnsetAll')
216833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.StubOutWithMock(self.test_stubs, 'SmartUnsetAll')
216933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        # Don't stub out VerifyAll - that's what causes the test to fail
217033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.test_mox.UnsetStubs()
217133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.test_stubs.UnsetAll()
217233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.test_stubs.SmartUnsetAll()
217333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.ReplayAll()
217433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.test.run(result=self.result)
217533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertFalse(self.result.wasSuccessful())
217633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.VerifyAll()
217733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
217833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testExpectedNotCalledNoMocks(self):
217933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Let testExpectedNotCalled() unset all the mocks by itself."""
218033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self._CreateTest('testExpectedNotCalled')
218133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.test.run(result=self.result)
218233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertFalse(self.result.wasSuccessful())
218333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertEqual(OS_LISTDIR, mox_helper.os.listdir)
218433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
218533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testUnexpectedCall(self):
218633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Stubbed out method is called with unexpected arguments."""
218733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self._CreateTest('testUnexpectedCall')
218833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.StubOutWithMock(self.test_mox, 'UnsetStubs')
218933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.StubOutWithMock(self.test_stubs, 'UnsetAll')
219033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.StubOutWithMock(self.test_stubs, 'SmartUnsetAll')
219133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        # Ensure no calls are made to VerifyAll()
219233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.StubOutWithMock(self.test_mox, 'VerifyAll')
219333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.test_mox.UnsetStubs()
219433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.test_stubs.UnsetAll()
219533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.test_stubs.SmartUnsetAll()
219633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.ReplayAll()
219733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.test.run(result=self.result)
219833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertFalse(self.result.wasSuccessful())
219933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.VerifyAll()
220033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
220133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testFailure(self):
220233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Failing assertion in test method."""
220333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self._CreateTest('testFailure')
220433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.StubOutWithMock(self.test_mox, 'UnsetStubs')
220533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.StubOutWithMock(self.test_stubs, 'UnsetAll')
220633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.StubOutWithMock(self.test_stubs, 'SmartUnsetAll')
220733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        # Ensure no calls are made to VerifyAll()
220833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.StubOutWithMock(self.test_mox, 'VerifyAll')
220933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.test_mox.UnsetStubs()
221033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.test_stubs.UnsetAll()
221133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.test_stubs.SmartUnsetAll()
221233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.ReplayAll()
221333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.test.run(result=self.result)
221433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertFalse(self.result.wasSuccessful())
221533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.mox.VerifyAll()
221633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
221733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testMixin(self):
221833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Run test from mix-in test class, ensure it passes."""
221933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self._CreateTest('testStat')
222033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self._VerifySuccess()
222133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
222233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testMixinAgain(self):
222333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Run same test as above but from the current test class.
222433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
222533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        Ensures metaclass properly wrapped test methods from all base classes.
222633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        If unsetting of stubs doesn't happen, this will fail.
222733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """
222833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self._CreateTest('testStatOther')
222933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self._VerifySuccess()
223033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
223133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
223233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reckclass VerifyTest(testtools.TestCase):
223333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    """Verify Verify works properly."""
223433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
223533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testVerify(self):
223633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Verify should be called for all objects.
223733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
223833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        Should throw an exception because the expected behavior did not occur.
223933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """
224033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj = mox.MockObject(TestClass)
224133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj.ValidCall()
224233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj._Replay()
224333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertRaises(mox.ExpectedMethodCallsError, mox.Verify, mock_obj)
224433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
224533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
224633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reckclass ResetTest(testtools.TestCase):
224733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    """Verify Reset works properly."""
224833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
224933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testReset(self):
225033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Should empty all queues and put mocks in record mode."""
225133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj = mox.MockObject(TestClass)
225233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj.ValidCall()
225333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertFalse(mock_obj._replay_mode)
225433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mock_obj._Replay()
225533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertTrue(mock_obj._replay_mode)
225633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertEqual(1, len(mock_obj._expected_calls_queue))
225733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
225833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        mox.Reset(mock_obj)
225933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertFalse(mock_obj._replay_mode)
226033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertEqual(0, len(mock_obj._expected_calls_queue))
226133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
226233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
226333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reckclass MyTestCase(testtools.TestCase):
226433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    """Simulate the use of a fake wrapper around Python's unittest library."""
226533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
226633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def setUp(self):
226733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        super(MyTestCase, self).setUp()
226833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.critical_variable = 42
226933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.another_critical_variable = 42
227033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
227133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testMethodOverride(self):
227233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Should be properly overriden in a derived class."""
227333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertEqual(42, self.another_critical_variable)
227433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.another_critical_variable += 1
227533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
227633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
227733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reckclass MoxTestBaseMultipleInheritanceTest(mox.MoxTestBase, MyTestCase):
227833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    """Test that multiple inheritance can be used with MoxTestBase."""
227933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
228033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def setUp(self):
228133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        super(MoxTestBaseMultipleInheritanceTest, self).setUp()
228233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.another_critical_variable = 99
228333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
228433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testMultipleInheritance(self):
228533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Should be able to access members created by all parent setUp()."""
228633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertTrue(isinstance(self.mox, mox.Mox))
228733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertEqual(42, self.critical_variable)
228833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
228933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def testMethodOverride(self):
229033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Should run before MyTestCase.testMethodOverride."""
229133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertEqual(99, self.another_critical_variable)
229233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.another_critical_variable = 42
229333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        super(MoxTestBaseMultipleInheritanceTest, self).testMethodOverride()
229433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.assertEqual(43, self.another_critical_variable)
229533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
229633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
229733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reckclass MoxTestDontMockProperties(MoxTestBaseTest):
229833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        def testPropertiesArentMocked(self):
229933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck                mock_class = self.mox.CreateMock(ClassWithProperties)
230033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck                self.assertRaises(mox.UnknownMethodCallError,
230133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck                                  lambda: mock_class.prop_attr)
230233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
230333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
230433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reckclass TestClass(object):
230533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    """This class is used only for testing the mock framework."""
230633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
230733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    SOME_CLASS_VAR = "test_value"
230833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    _PROTECTED_CLASS_VAR = "protected value"
230933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
231033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def __init__(self, ivar=None):
231133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.__ivar = ivar
231233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
231333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def __eq__(self, rhs):
231433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        return self.__ivar == rhs
231533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
231633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def __ne__(self, rhs):
231733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        return not self.__eq__(rhs)
231833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
231933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def ValidCall(self):
232033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        pass
232133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
232233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def MethodWithArgs(self, one, two, nine=None):
232333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        pass
232433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
232533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def OtherValidCall(self):
232633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        pass
232733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
232833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def OptionalArgs(self, foo='boom'):
232933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        pass
233033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
233133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def ValidCallWithArgs(self, *args, **kwargs):
233233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        pass
233333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
233433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    @classmethod
233533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def MyClassMethod(cls):
233633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        pass
233733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
233833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    @staticmethod
233933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def MyStaticMethod():
234033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        pass
234133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
234233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def _ProtectedCall(self):
234333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        pass
234433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
234533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def __PrivateCall(self):
234633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        pass
234733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
234833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def __DoNotMock(self):
234933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        pass
235033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
235133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def __getitem__(self, key):
235233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Return the value for key."""
235333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        return self.d[key]
235433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
235533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def __setitem__(self, key, value):
235633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Set the value for key to value."""
235733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.d[key] = value
235833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
235933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def __contains__(self, key):
236033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        """Returns True if d contains the key."""
236133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        return key in self.d
236233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
236333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def __iter__(self):
236433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        pass
236533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
236633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
236733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reckclass ChildClass(TestClass):
236833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    """This inherits from TestClass."""
236933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def __init__(self):
237033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        TestClass.__init__(self)
237133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
237233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def ChildValidCall(self):
237333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        pass
237433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
237533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
237633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reckclass CallableClass(object):
237733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    """This class is callable, and that should be mockable!"""
237833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
237933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def __init__(self):
238033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        pass
238133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
238233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def __call__(self, param):
238333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        return param
238433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
238533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
238633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reckclass ClassWithProperties(object):
238733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        def setter_attr(self, value):
238833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck                pass
238933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
239033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        def getter_attr(self):
239133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck                pass
239233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
239333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        prop_attr = property(getter_attr, setter_attr)
239433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
239533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
239633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reckclass SubscribtableNonIterableClass(object):
239733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def __getitem__(self, index):
239833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        raise IndexError
239933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
240033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
240133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reckclass InheritsFromCallable(CallableClass):
240233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    """This class should be mockable; it inherits from a callable class."""
240333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
240433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    pass
240533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
240633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
240733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reckif __name__ == '__main__':
240833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    testtools.main()
2409