14710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"""Unit tests for the copy module."""
24710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
34710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport copy
44710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport copy_reg
54710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport weakref
64710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
74710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport unittest
84710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfrom test import test_support
94710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestCopy(unittest.TestCase):
114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # Attempt full line coverage of copy.py from top to bottom
134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_exceptions(self):
154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertTrue(copy.Error is copy.error)
164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertTrue(issubclass(copy.Error, Exception))
174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # The copy() method
194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_copy_basic(self):
214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = 42
224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        y = copy.copy(x)
234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(x, y)
244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_copy_copy(self):
264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        class C(object):
274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def __init__(self, foo):
284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                self.foo = foo
294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def __copy__(self):
304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return C(self.foo)
314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = C(42)
324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        y = copy.copy(x)
334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(y.__class__, x.__class__)
344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(y.foo, x.foo)
354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_copy_registry(self):
374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        class C(object):
384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def __new__(cls, foo):
394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                obj = object.__new__(cls)
404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                obj.foo = foo
414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return obj
424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        def pickle_C(obj):
434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return (C, (obj.foo,))
444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = C(42)
454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertRaises(TypeError, copy.copy, x)
464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        copy_reg.pickle(C, pickle_C, C)
474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        y = copy.copy(x)
484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_copy_reduce_ex(self):
504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        class C(object):
514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def __reduce_ex__(self, proto):
524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return ""
534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def __reduce__(self):
544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                raise test_support.TestFailed, "shouldn't call this"
554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = C()
564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        y = copy.copy(x)
574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertTrue(y is x)
584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_copy_reduce(self):
604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        class C(object):
614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def __reduce__(self):
624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return ""
634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = C()
644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        y = copy.copy(x)
654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertTrue(y is x)
664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_copy_cant(self):
684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        class C(object):
694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def __getattribute__(self, name):
704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if name.startswith("__reduce"):
714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    raise AttributeError, name
724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return object.__getattribute__(self, name)
734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = C()
744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertRaises(copy.Error, copy.copy, x)
754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # Type-specific _copy_xxx() methods
774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_copy_atomic(self):
794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        class Classic:
804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            pass
814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        class NewStyle(object):
824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            pass
834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        def f():
844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            pass
854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        tests = [None, 42, 2L**100, 3.14, True, False, 1j,
864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                 "hello", u"hello\u1234", f.func_code,
874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                 NewStyle, xrange(10), Classic, max]
884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        for x in tests:
894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self.assertTrue(copy.copy(x) is x, repr(x))
904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_copy_list(self):
924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = [1, 2, 3]
934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(copy.copy(x), x)
944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_copy_tuple(self):
964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = (1, 2, 3)
974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(copy.copy(x), x)
984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_copy_dict(self):
1004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = {"foo": 1, "bar": 2}
1014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(copy.copy(x), x)
1024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_copy_inst_vanilla(self):
1044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        class C:
1054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def __init__(self, foo):
1064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                self.foo = foo
1074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def __cmp__(self, other):
1084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return cmp(self.foo, other.foo)
1094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = C(42)
1104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(copy.copy(x), x)
1114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_copy_inst_copy(self):
1134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        class C:
1144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def __init__(self, foo):
1154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                self.foo = foo
1164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def __copy__(self):
1174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return C(self.foo)
1184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def __cmp__(self, other):
1194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return cmp(self.foo, other.foo)
1204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = C(42)
1214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(copy.copy(x), x)
1224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_copy_inst_getinitargs(self):
1244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        class C:
1254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def __init__(self, foo):
1264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                self.foo = foo
1274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def __getinitargs__(self):
1284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return (self.foo,)
1294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def __cmp__(self, other):
1304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return cmp(self.foo, other.foo)
1314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = C(42)
1324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(copy.copy(x), x)
1334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_copy_inst_getstate(self):
1354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        class C:
1364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def __init__(self, foo):
1374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                self.foo = foo
1384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def __getstate__(self):
1394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return {"foo": self.foo}
1404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def __cmp__(self, other):
1414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return cmp(self.foo, other.foo)
1424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = C(42)
1434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(copy.copy(x), x)
1444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_copy_inst_setstate(self):
1464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        class C:
1474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def __init__(self, foo):
1484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                self.foo = foo
1494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def __setstate__(self, state):
1504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                self.foo = state["foo"]
1514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def __cmp__(self, other):
1524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return cmp(self.foo, other.foo)
1534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = C(42)
1544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(copy.copy(x), x)
1554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_copy_inst_getstate_setstate(self):
1574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        class C:
1584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def __init__(self, foo):
1594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                self.foo = foo
1604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def __getstate__(self):
1614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return self.foo
1624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def __setstate__(self, state):
1634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                self.foo = state
1644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def __cmp__(self, other):
1654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return cmp(self.foo, other.foo)
1664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = C(42)
1674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(copy.copy(x), x)
1684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # The deepcopy() method
1704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_deepcopy_basic(self):
1724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = 42
1734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        y = copy.deepcopy(x)
1744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(y, x)
1754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_deepcopy_memo(self):
1774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # Tests of reflexive objects are under type-specific sections below.
1784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # This tests only repetitions of objects.
1794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = []
1804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = [x, x]
1814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        y = copy.deepcopy(x)
1824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(y, x)
1834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertTrue(y is not x)
1844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertTrue(y[0] is not x[0])
1854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertTrue(y[0] is y[1])
1864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_deepcopy_issubclass(self):
1884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # XXX Note: there's no way to test the TypeError coming out of
1894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # issubclass() -- this can only happen when an extension
1904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # module defines a "type" that doesn't formally inherit from
1914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # type.
1924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        class Meta(type):
1934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            pass
1944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        class C:
1954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            __metaclass__ = Meta
1964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(copy.deepcopy(C), C)
1974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_deepcopy_deepcopy(self):
1994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        class C(object):
2004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def __init__(self, foo):
2014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                self.foo = foo
2024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def __deepcopy__(self, memo=None):
2034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return C(self.foo)
2044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = C(42)
2054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        y = copy.deepcopy(x)
2064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(y.__class__, x.__class__)
2074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(y.foo, x.foo)
2084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_deepcopy_registry(self):
2104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        class C(object):
2114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def __new__(cls, foo):
2124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                obj = object.__new__(cls)
2134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                obj.foo = foo
2144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return obj
2154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        def pickle_C(obj):
2164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return (C, (obj.foo,))
2174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = C(42)
2184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertRaises(TypeError, copy.deepcopy, x)
2194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        copy_reg.pickle(C, pickle_C, C)
2204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        y = copy.deepcopy(x)
2214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_deepcopy_reduce_ex(self):
2234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        class C(object):
2244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def __reduce_ex__(self, proto):
2254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return ""
2264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def __reduce__(self):
2274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                raise test_support.TestFailed, "shouldn't call this"
2284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = C()
2294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        y = copy.deepcopy(x)
2304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertTrue(y is x)
2314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_deepcopy_reduce(self):
2334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        class C(object):
2344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def __reduce__(self):
2354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return ""
2364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = C()
2374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        y = copy.deepcopy(x)
2384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertTrue(y is x)
2394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_deepcopy_cant(self):
2414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        class C(object):
2424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def __getattribute__(self, name):
2434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if name.startswith("__reduce"):
2444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    raise AttributeError, name
2454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return object.__getattribute__(self, name)
2464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = C()
2474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertRaises(copy.Error, copy.deepcopy, x)
2484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # Type-specific _deepcopy_xxx() methods
2504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_deepcopy_atomic(self):
2524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        class Classic:
2534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            pass
2544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        class NewStyle(object):
2554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            pass
2564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        def f():
2574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            pass
2584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        tests = [None, 42, 2L**100, 3.14, True, False, 1j,
2594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                 "hello", u"hello\u1234", f.func_code,
2604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                 NewStyle, xrange(10), Classic, max]
2614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        for x in tests:
2624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self.assertTrue(copy.deepcopy(x) is x, repr(x))
2634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_deepcopy_list(self):
2654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = [[1, 2], 3]
2664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        y = copy.deepcopy(x)
2674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(y, x)
2684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertTrue(x is not y)
2694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertTrue(x[0] is not y[0])
2704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_deepcopy_reflexive_list(self):
2724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = []
2734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x.append(x)
2744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        y = copy.deepcopy(x)
2754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertRaises(RuntimeError, cmp, y, x)
2764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertTrue(y is not x)
2774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertTrue(y[0] is y)
2784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(len(y), 1)
2794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_deepcopy_tuple(self):
2814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = ([1, 2], 3)
2824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        y = copy.deepcopy(x)
2834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(y, x)
2844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertTrue(x is not y)
2854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertTrue(x[0] is not y[0])
2864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_deepcopy_reflexive_tuple(self):
2884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = ([],)
2894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x[0].append(x)
2904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        y = copy.deepcopy(x)
2914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertRaises(RuntimeError, cmp, y, x)
2924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertTrue(y is not x)
2934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertTrue(y[0] is not x[0])
2944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertTrue(y[0][0] is y)
2954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_deepcopy_dict(self):
2974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = {"foo": [1, 2], "bar": 3}
2984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        y = copy.deepcopy(x)
2994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(y, x)
3004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertTrue(x is not y)
3014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertTrue(x["foo"] is not y["foo"])
3024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_deepcopy_reflexive_dict(self):
3044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = {}
3054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x['foo'] = x
3064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        y = copy.deepcopy(x)
3074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertRaises(RuntimeError, cmp, y, x)
3084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertTrue(y is not x)
3094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertTrue(y['foo'] is y)
3104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(len(y), 1)
3114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_deepcopy_keepalive(self):
3134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        memo = {}
3144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = 42
3154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        y = copy.deepcopy(x, memo)
3164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertTrue(memo[id(x)] is x)
3174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_deepcopy_inst_vanilla(self):
3194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        class C:
3204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def __init__(self, foo):
3214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                self.foo = foo
3224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def __cmp__(self, other):
3234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return cmp(self.foo, other.foo)
3244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = C([42])
3254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        y = copy.deepcopy(x)
3264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(y, x)
3274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertTrue(y.foo is not x.foo)
3284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_deepcopy_inst_deepcopy(self):
3304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        class C:
3314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def __init__(self, foo):
3324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                self.foo = foo
3334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def __deepcopy__(self, memo):
3344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return C(copy.deepcopy(self.foo, memo))
3354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def __cmp__(self, other):
3364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return cmp(self.foo, other.foo)
3374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = C([42])
3384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        y = copy.deepcopy(x)
3394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(y, x)
3404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertTrue(y is not x)
3414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertTrue(y.foo is not x.foo)
3424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_deepcopy_inst_getinitargs(self):
3444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        class C:
3454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def __init__(self, foo):
3464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                self.foo = foo
3474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def __getinitargs__(self):
3484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return (self.foo,)
3494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def __cmp__(self, other):
3504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return cmp(self.foo, other.foo)
3514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = C([42])
3524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        y = copy.deepcopy(x)
3534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(y, x)
3544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertTrue(y is not x)
3554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertTrue(y.foo is not x.foo)
3564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_deepcopy_inst_getstate(self):
3584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        class C:
3594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def __init__(self, foo):
3604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                self.foo = foo
3614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def __getstate__(self):
3624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return {"foo": self.foo}
3634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def __cmp__(self, other):
3644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return cmp(self.foo, other.foo)
3654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = C([42])
3664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        y = copy.deepcopy(x)
3674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(y, x)
3684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertTrue(y is not x)
3694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertTrue(y.foo is not x.foo)
3704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_deepcopy_inst_setstate(self):
3724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        class C:
3734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def __init__(self, foo):
3744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                self.foo = foo
3754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def __setstate__(self, state):
3764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                self.foo = state["foo"]
3774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def __cmp__(self, other):
3784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return cmp(self.foo, other.foo)
3794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = C([42])
3804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        y = copy.deepcopy(x)
3814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(y, x)
3824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertTrue(y is not x)
3834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertTrue(y.foo is not x.foo)
3844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_deepcopy_inst_getstate_setstate(self):
3864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        class C:
3874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def __init__(self, foo):
3884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                self.foo = foo
3894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def __getstate__(self):
3904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return self.foo
3914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def __setstate__(self, state):
3924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                self.foo = state
3934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def __cmp__(self, other):
3944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return cmp(self.foo, other.foo)
3954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = C([42])
3964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        y = copy.deepcopy(x)
3974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(y, x)
3984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertTrue(y is not x)
3994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertTrue(y.foo is not x.foo)
4004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_deepcopy_reflexive_inst(self):
4024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        class C:
4034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            pass
4044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = C()
4054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x.foo = x
4064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        y = copy.deepcopy(x)
4074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertTrue(y is not x)
4084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertTrue(y.foo is y)
4094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # _reconstruct()
4114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_reconstruct_string(self):
4134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        class C(object):
4144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def __reduce__(self):
4154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return ""
4164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = C()
4174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        y = copy.copy(x)
4184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertTrue(y is x)
4194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        y = copy.deepcopy(x)
4204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertTrue(y is x)
4214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_reconstruct_nostate(self):
4234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        class C(object):
4244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def __reduce__(self):
4254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return (C, ())
4264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = C()
4274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x.foo = 42
4284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        y = copy.copy(x)
4294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertTrue(y.__class__ is x.__class__)
4304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        y = copy.deepcopy(x)
4314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertTrue(y.__class__ is x.__class__)
4324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_reconstruct_state(self):
4344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        class C(object):
4354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def __reduce__(self):
4364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return (C, (), self.__dict__)
4374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def __cmp__(self, other):
4384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return cmp(self.__dict__, other.__dict__)
4394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            __hash__ = None # Silence Py3k warning
4404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = C()
4414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x.foo = [42]
4424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        y = copy.copy(x)
4434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(y, x)
4444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        y = copy.deepcopy(x)
4454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(y, x)
4464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertTrue(y.foo is not x.foo)
4474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_reconstruct_state_setstate(self):
4494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        class C(object):
4504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def __reduce__(self):
4514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return (C, (), self.__dict__)
4524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def __setstate__(self, state):
4534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                self.__dict__.update(state)
4544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def __cmp__(self, other):
4554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return cmp(self.__dict__, other.__dict__)
4564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            __hash__ = None # Silence Py3k warning
4574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = C()
4584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x.foo = [42]
4594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        y = copy.copy(x)
4604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(y, x)
4614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        y = copy.deepcopy(x)
4624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(y, x)
4634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertTrue(y.foo is not x.foo)
4644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_reconstruct_reflexive(self):
4664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        class C(object):
4674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            pass
4684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = C()
4694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x.foo = x
4704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        y = copy.deepcopy(x)
4714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertTrue(y is not x)
4724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertTrue(y.foo is y)
4734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # Additions for Python 2.3 and pickle protocol 2
4754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_reduce_4tuple(self):
4774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        class C(list):
4784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def __reduce__(self):
4794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return (C, (), self.__dict__, iter(self))
4804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def __cmp__(self, other):
4814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return (cmp(list(self), list(other)) or
4824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        cmp(self.__dict__, other.__dict__))
4834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            __hash__ = None # Silence Py3k warning
4844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = C([[1, 2], 3])
4854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        y = copy.copy(x)
4864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(x, y)
4874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertTrue(x is not y)
4884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertTrue(x[0] is y[0])
4894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        y = copy.deepcopy(x)
4904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(x, y)
4914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertTrue(x is not y)
4924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertTrue(x[0] is not y[0])
4934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_reduce_5tuple(self):
4954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        class C(dict):
4964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def __reduce__(self):
4974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return (C, (), self.__dict__, None, self.iteritems())
4984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def __cmp__(self, other):
4994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return (cmp(dict(self), list(dict)) or
5004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        cmp(self.__dict__, other.__dict__))
5014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            __hash__ = None # Silence Py3k warning
5024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = C([("foo", [1, 2]), ("bar", 3)])
5034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        y = copy.copy(x)
5044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(x, y)
5054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertTrue(x is not y)
5064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertTrue(x["foo"] is y["foo"])
5074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        y = copy.deepcopy(x)
5084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(x, y)
5094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertTrue(x is not y)
5104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertTrue(x["foo"] is not y["foo"])
5114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_copy_slots(self):
5134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        class C(object):
5144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            __slots__ = ["foo"]
5154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = C()
5164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x.foo = [42]
5174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        y = copy.copy(x)
5184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertTrue(x.foo is y.foo)
5194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_deepcopy_slots(self):
5214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        class C(object):
5224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            __slots__ = ["foo"]
5234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = C()
5244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x.foo = [42]
5254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        y = copy.deepcopy(x)
5264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(x.foo, y.foo)
5274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertTrue(x.foo is not y.foo)
5284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_deepcopy_dict_subclass(self):
5304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        class C(dict):
5314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def __init__(self, d=None):
5324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if not d:
5334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    d = {}
5344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                self._keys = list(d.keys())
5354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                dict.__init__(self, d)
5364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def __setitem__(self, key, item):
5374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                dict.__setitem__(self, key, item)
5384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if key not in self._keys:
5394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    self._keys.append(key)
5404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = C(d={'foo':0})
5414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        y = copy.deepcopy(x)
5424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(x, y)
5434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(x._keys, y._keys)
5444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertTrue(x is not y)
5454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x['bar'] = 1
5464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertNotEqual(x, y)
5474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertNotEqual(x._keys, y._keys)
5484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_copy_list_subclass(self):
5504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        class C(list):
5514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            pass
5524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = C([[1, 2], 3])
5534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x.foo = [4, 5]
5544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        y = copy.copy(x)
5554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(list(x), list(y))
5564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(x.foo, y.foo)
5574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertTrue(x[0] is y[0])
5584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertTrue(x.foo is y.foo)
5594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_deepcopy_list_subclass(self):
5614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        class C(list):
5624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            pass
5634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = C([[1, 2], 3])
5644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x.foo = [4, 5]
5654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        y = copy.deepcopy(x)
5664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(list(x), list(y))
5674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(x.foo, y.foo)
5684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertTrue(x[0] is not y[0])
5694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertTrue(x.foo is not y.foo)
5704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_copy_tuple_subclass(self):
5724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        class C(tuple):
5734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            pass
5744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = C([1, 2, 3])
5754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(tuple(x), (1, 2, 3))
5764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        y = copy.copy(x)
5774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(tuple(y), (1, 2, 3))
5784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_deepcopy_tuple_subclass(self):
5804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        class C(tuple):
5814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            pass
5824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = C([[1, 2], 3])
5834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(tuple(x), ([1, 2], 3))
5844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        y = copy.deepcopy(x)
5854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(tuple(y), ([1, 2], 3))
5864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertTrue(x is not y)
5874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertTrue(x[0] is not y[0])
5884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_getstate_exc(self):
5904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        class EvilState(object):
5914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def __getstate__(self):
5924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                raise ValueError, "ain't got no stickin' state"
5934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertRaises(ValueError, copy.copy, EvilState())
5944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
5954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_copy_function(self):
5964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(copy.copy(global_foo), global_foo)
5974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        def foo(x, y): return x+y
5984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(copy.copy(foo), foo)
5994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        bar = lambda: None
6004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(copy.copy(bar), bar)
6014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_deepcopy_function(self):
6034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(copy.deepcopy(global_foo), global_foo)
6044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        def foo(x, y): return x+y
6054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(copy.deepcopy(foo), foo)
6064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        bar = lambda: None
6074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(copy.deepcopy(bar), bar)
6084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def _check_weakref(self, _copy):
6104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        class C(object):
6114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            pass
6124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        obj = C()
6134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x = weakref.ref(obj)
6144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        y = _copy(x)
6154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertTrue(y is x)
6164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        del obj
6174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        y = _copy(x)
6184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertTrue(y is x)
6194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_copy_weakref(self):
6214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self._check_weakref(copy.copy)
6224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_deepcopy_weakref(self):
6244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self._check_weakref(copy.deepcopy)
6254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def _check_copy_weakdict(self, _dicttype):
6274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        class C(object):
6284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            pass
6294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        a, b, c, d = [C() for i in xrange(4)]
6304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        u = _dicttype()
6314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        u[a] = b
6324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        u[c] = d
6334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        v = copy.copy(u)
6344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertFalse(v is u)
6354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(v, u)
6364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(v[a], b)
6374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(v[c], d)
6384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(len(v), 2)
6394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        del c, d
6404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(len(v), 1)
6414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        x, y = C(), C()
6424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # The underlying containers are decoupled
6434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        v[x] = y
6444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertNotIn(x, u)
6454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_copy_weakkeydict(self):
6474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self._check_copy_weakdict(weakref.WeakKeyDictionary)
6484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_copy_weakvaluedict(self):
6504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self._check_copy_weakdict(weakref.WeakValueDictionary)
6514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_deepcopy_weakkeydict(self):
6534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        class C(object):
6544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def __init__(self, i):
6554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                self.i = i
6564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        a, b, c, d = [C(i) for i in xrange(4)]
6574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        u = weakref.WeakKeyDictionary()
6584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        u[a] = b
6594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        u[c] = d
6604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # Keys aren't copied, values are
6614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        v = copy.deepcopy(u)
6624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertNotEqual(v, u)
6634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(len(v), 2)
6644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertFalse(v[a] is b)
6654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertFalse(v[c] is d)
6664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(v[a].i, b.i)
6674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(v[c].i, d.i)
6684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        del c
6694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(len(v), 1)
6704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_deepcopy_weakvaluedict(self):
6724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        class C(object):
6734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def __init__(self, i):
6744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                self.i = i
6754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        a, b, c, d = [C(i) for i in xrange(4)]
6764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        u = weakref.WeakValueDictionary()
6774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        u[a] = b
6784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        u[c] = d
6794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # Keys are copied, values aren't
6804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        v = copy.deepcopy(u)
6814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertNotEqual(v, u)
6824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(len(v), 2)
6834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        (x, y), (z, t) = sorted(v.items(), key=lambda pair: pair[0].i)
6844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertFalse(x is a)
6854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(x.i, a.i)
6864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertTrue(y is b)
6874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertFalse(z is c)
6884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(z.i, c.i)
6894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertTrue(t is d)
6904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        del x, y, z, t
6914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        del d
6924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(len(v), 1)
6934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
6944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_deepcopy_bound_method(self):
6954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        class Foo(object):
6964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def m(self):
6974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                pass
6984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        f = Foo()
6994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        f.b = f.m
7004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        g = copy.deepcopy(f)
7014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(g.m, g.b)
7024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertTrue(g.b.im_self is g)
7034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        g.b()
7044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef global_foo(x, y): return x+y
7074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef test_main():
7094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    test_support.run_unittest(TestCopy)
7104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
7114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmif __name__ == "__main__":
7124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    test_main()
713