summaryrefslogtreecommitdiffstats
path: root/Lib
diff options
context:
space:
mode:
authorMichael Foord <fuzzyman@voidspace.org.uk>2009-04-02 05:51:54 (GMT)
committerMichael Foord <fuzzyman@voidspace.org.uk>2009-04-02 05:51:54 (GMT)
commite2942d073d4b8a1f9b5f48c73855f409e6b900b2 (patch)
tree1649336e68d7b466e35528c8e191d40e6e3d7cd2 /Lib
parent7152f6d9156a19a9f1b31e313d2c19d840dc089d (diff)
downloadcpython-e2942d073d4b8a1f9b5f48c73855f409e6b900b2.zip
cpython-e2942d073d4b8a1f9b5f48c73855f409e6b900b2.tar.gz
cpython-e2942d073d4b8a1f9b5f48c73855f409e6b900b2.tar.bz2
Store the functions in the _type_equality_funcs as wrapped objects that are deep copyable.
This allows for the deep copying of TestCase instances. Issue 5660
Diffstat (limited to 'Lib')
-rw-r--r--Lib/test/test_unittest.py12
-rw-r--r--Lib/unittest.py19
2 files changed, 27 insertions, 4 deletions
diff --git a/Lib/test/test_unittest.py b/Lib/test/test_unittest.py
index c16327e..38c4f8f 100644
--- a/Lib/test/test_unittest.py
+++ b/Lib/test/test_unittest.py
@@ -11,6 +11,7 @@ from test import test_support
import unittest
from unittest import TestCase
import types
+from copy import deepcopy
### Support code
################################################################
@@ -2688,6 +2689,17 @@ test case
self.failUnlessRaises(TypeError, lambda _: 3.14 + u'spam')
self.failIf(False)
+ def testDeepcopy(self):
+ # Issue: 5660
+ class TestableTest(TestCase):
+ def testNothing(self):
+ pass
+
+ test = TestableTest('testNothing')
+
+ # This shouldn't blow up
+ deepcopy(test)
+
class Test_TestSkipping(TestCase):
diff --git a/Lib/unittest.py b/Lib/unittest.py
index b6b96b3..3eedd56 100644
--- a/Lib/unittest.py
+++ b/Lib/unittest.py
@@ -160,7 +160,6 @@ def expectedFailure(func):
raise _UnexpectedSuccess
return wrapper
-
__unittest = 1
class TestResult(object):
@@ -289,6 +288,16 @@ class _AssertRaisesContext(object):
return True
+class _AssertWrapper(object):
+ """Wrap entries in the _type_equality_funcs registry to make them deep
+ copyable."""
+
+ def __init__(self, function):
+ self.function = function
+
+ def __deepcopy__(self, memo):
+ memo[id(self)] = self
+
class TestCase(object):
"""A class whose instances are single test cases.
@@ -361,7 +370,7 @@ class TestCase(object):
msg= argument that raises self.failureException with a
useful error message when the two arguments are not equal.
"""
- self._type_equality_funcs[typeobj] = function
+ self._type_equality_funcs[typeobj] = _AssertWrapper(function)
def setUp(self):
"Hook method for setting up the test fixture before exercising it."
@@ -542,8 +551,10 @@ class TestCase(object):
# See the discussion in http://bugs.python.org/issue2578.
#
if type(first) is type(second):
- return self._type_equality_funcs.get(type(first),
- self._baseAssertEqual)
+ asserter = self._type_equality_funcs.get(type(first))
+ if asserter is not None:
+ return asserter.function
+
return self._baseAssertEqual
def _baseAssertEqual(self, first, second, msg=None):