summaryrefslogtreecommitdiffstats
path: root/Lib/test/test_copy.py
diff options
context:
space:
mode:
authorAntoine Pitrou <solipsis@pitrou.net>2009-05-15 17:04:50 (GMT)
committerAntoine Pitrou <solipsis@pitrou.net>2009-05-15 17:04:50 (GMT)
commit6e61006cc2dfa6c07fa84126622685769bac635d (patch)
tree4ec0f42d852421dac3776e533f51278f5259791e /Lib/test/test_copy.py
parentbd3da6b9804fafe6a730883d96bada52388e9835 (diff)
downloadcpython-6e61006cc2dfa6c07fa84126622685769bac635d.zip
cpython-6e61006cc2dfa6c07fa84126622685769bac635d.tar.gz
cpython-6e61006cc2dfa6c07fa84126622685769bac635d.tar.bz2
Merged revisions 72669 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk ........ r72669 | antoine.pitrou | 2009-05-15 18:54:52 +0200 (ven., 15 mai 2009) | 3 lines Issue #2116: Weak references and weak dictionaries now support copy()ing and deepcopy()ing. ........
Diffstat (limited to 'Lib/test/test_copy.py')
-rw-r--r--Lib/test/test_copy.py88
1 files changed, 88 insertions, 0 deletions
diff --git a/Lib/test/test_copy.py b/Lib/test/test_copy.py
index 133c888..502bf3f 100644
--- a/Lib/test/test_copy.py
+++ b/Lib/test/test_copy.py
@@ -2,7 +2,9 @@
import copy
import copyreg
+import weakref
from operator import le, lt, ge, gt, eq, ne
+
import unittest
from test import support
@@ -590,6 +592,92 @@ class TestCopy(unittest.TestCase):
bar = lambda: None
self.assertEqual(copy.deepcopy(bar), bar)
+ def _check_weakref(self, _copy):
+ class C(object):
+ pass
+ obj = C()
+ x = weakref.ref(obj)
+ y = _copy(x)
+ self.assertTrue(y is x)
+ del obj
+ y = _copy(x)
+ self.assertTrue(y is x)
+
+ def test_copy_weakref(self):
+ self._check_weakref(copy.copy)
+
+ def test_deepcopy_weakref(self):
+ self._check_weakref(copy.deepcopy)
+
+ def _check_copy_weakdict(self, _dicttype):
+ class C(object):
+ pass
+ a, b, c, d = [C() for i in range(4)]
+ u = _dicttype()
+ u[a] = b
+ u[c] = d
+ v = copy.copy(u)
+ self.assertFalse(v is u)
+ self.assertEqual(v, u)
+ self.assertEqual(v[a], b)
+ self.assertEqual(v[c], d)
+ self.assertEqual(len(v), 2)
+ del c, d
+ self.assertEqual(len(v), 1)
+ x, y = C(), C()
+ # The underlying containers are decoupled
+ v[x] = y
+ self.assertFalse(x in u)
+
+ def test_copy_weakkeydict(self):
+ self._check_copy_weakdict(weakref.WeakKeyDictionary)
+
+ def test_copy_weakvaluedict(self):
+ self._check_copy_weakdict(weakref.WeakValueDictionary)
+
+ def test_deepcopy_weakkeydict(self):
+ class C(object):
+ def __init__(self, i):
+ self.i = i
+ a, b, c, d = [C(i) for i in range(4)]
+ u = weakref.WeakKeyDictionary()
+ u[a] = b
+ u[c] = d
+ # Keys aren't copied, values are
+ v = copy.deepcopy(u)
+ self.assertNotEqual(v, u)
+ self.assertEqual(len(v), 2)
+ self.assertFalse(v[a] is b)
+ self.assertFalse(v[c] is d)
+ self.assertEqual(v[a].i, b.i)
+ self.assertEqual(v[c].i, d.i)
+ del c
+ self.assertEqual(len(v), 1)
+
+ def test_deepcopy_weakvaluedict(self):
+ class C(object):
+ def __init__(self, i):
+ self.i = i
+ a, b, c, d = [C(i) for i in range(4)]
+ u = weakref.WeakValueDictionary()
+ u[a] = b
+ u[c] = d
+ # Keys are copied, values aren't
+ v = copy.deepcopy(u)
+ self.assertNotEqual(v, u)
+ self.assertEqual(len(v), 2)
+ (x, y), (z, t) = sorted(v.items(), key=lambda pair: pair[0].i)
+ self.assertFalse(x is a)
+ self.assertEqual(x.i, a.i)
+ self.assertTrue(y is b)
+ self.assertFalse(z is c)
+ self.assertEqual(z.i, c.i)
+ self.assertTrue(t is d)
+ del x, y, z, t
+ del d
+ self.assertEqual(len(v), 1)
+
+
def global_foo(x, y): return x+y
def test_main():