blob: 498c270dd2415494ed342568e2b91c9cfc7c0b4b [file] [log] [blame]
Guido van Rossum581cb932003-02-06 17:52:15 +00001"""Unit tests for the copy module."""
2
Guido van Rossum581cb932003-02-06 17:52:15 +00003import copy
Alexandre Vassalottif7fa63d2008-05-11 08:55:36 +00004import copyreg
Antoine Pitrou6e610062009-05-15 17:04:50 +00005import weakref
Alexandre Vassalotti5c1c3b42013-12-01 13:25:26 -08006import abc
Mark Dickinsona56c4672009-01-27 18:17:45 +00007from operator import le, lt, ge, gt, eq, ne
Antoine Pitrou6e610062009-05-15 17:04:50 +00008
Guido van Rossum581cb932003-02-06 17:52:15 +00009import unittest
Benjamin Petersonee8712c2008-05-20 21:35:26 +000010from test import support
Guido van Rossum581cb932003-02-06 17:52:15 +000011
Mark Dickinsona56c4672009-01-27 18:17:45 +000012order_comparisons = le, lt, ge, gt
13equality_comparisons = eq, ne
14comparisons = order_comparisons + equality_comparisons
15
Guido van Rossum581cb932003-02-06 17:52:15 +000016class TestCopy(unittest.TestCase):
17
18 # Attempt full line coverage of copy.py from top to bottom
19
20 def test_exceptions(self):
Sandro Tosi4dc9c842011-08-05 23:05:35 +020021 self.assertIs(copy.Error, copy.error)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +000022 self.assertTrue(issubclass(copy.Error, Exception))
Guido van Rossum581cb932003-02-06 17:52:15 +000023
24 # The copy() method
25
26 def test_copy_basic(self):
27 x = 42
28 y = copy.copy(x)
29 self.assertEqual(x, y)
30
31 def test_copy_copy(self):
32 class C(object):
33 def __init__(self, foo):
34 self.foo = foo
35 def __copy__(self):
36 return C(self.foo)
37 x = C(42)
38 y = copy.copy(x)
39 self.assertEqual(y.__class__, x.__class__)
40 self.assertEqual(y.foo, x.foo)
41
Guido van Rossumc06e3ac2003-02-07 17:30:18 +000042 def test_copy_registry(self):
43 class C(object):
44 def __new__(cls, foo):
45 obj = object.__new__(cls)
46 obj.foo = foo
47 return obj
48 def pickle_C(obj):
49 return (C, (obj.foo,))
50 x = C(42)
51 self.assertRaises(TypeError, copy.copy, x)
Alexandre Vassalottif7fa63d2008-05-11 08:55:36 +000052 copyreg.pickle(C, pickle_C, C)
Guido van Rossumc06e3ac2003-02-07 17:30:18 +000053 y = copy.copy(x)
54
Guido van Rossume6908832003-02-19 01:19:28 +000055 def test_copy_reduce_ex(self):
56 class C(object):
57 def __reduce_ex__(self, proto):
Sandro Tosi4dc9c842011-08-05 23:05:35 +020058 c.append(1)
Guido van Rossume6908832003-02-19 01:19:28 +000059 return ""
60 def __reduce__(self):
Sandro Tosi4dc9c842011-08-05 23:05:35 +020061 self.fail("shouldn't call this")
62 c = []
Guido van Rossume6908832003-02-19 01:19:28 +000063 x = C()
64 y = copy.copy(x)
Sandro Tosi4dc9c842011-08-05 23:05:35 +020065 self.assertIs(y, x)
66 self.assertEqual(c, [1])
Guido van Rossume6908832003-02-19 01:19:28 +000067
Guido van Rossum581cb932003-02-06 17:52:15 +000068 def test_copy_reduce(self):
69 class C(object):
70 def __reduce__(self):
Sandro Tosi4dc9c842011-08-05 23:05:35 +020071 c.append(1)
Guido van Rossum581cb932003-02-06 17:52:15 +000072 return ""
Sandro Tosi4dc9c842011-08-05 23:05:35 +020073 c = []
Guido van Rossum581cb932003-02-06 17:52:15 +000074 x = C()
75 y = copy.copy(x)
Sandro Tosi4dc9c842011-08-05 23:05:35 +020076 self.assertIs(y, x)
77 self.assertEqual(c, [1])
Guido van Rossum581cb932003-02-06 17:52:15 +000078
79 def test_copy_cant(self):
Guido van Rossume6908832003-02-19 01:19:28 +000080 class C(object):
Guido van Rossum581cb932003-02-06 17:52:15 +000081 def __getattribute__(self, name):
Guido van Rossume6908832003-02-19 01:19:28 +000082 if name.startswith("__reduce"):
Collin Winter3add4d72007-08-29 23:37:32 +000083 raise AttributeError(name)
Guido van Rossum581cb932003-02-06 17:52:15 +000084 return object.__getattribute__(self, name)
85 x = C()
86 self.assertRaises(copy.Error, copy.copy, x)
87
88 # Type-specific _copy_xxx() methods
89
90 def test_copy_atomic(self):
91 class Classic:
92 pass
93 class NewStyle(object):
94 pass
95 def f():
96 pass
Alexandre Vassalotti5c1c3b42013-12-01 13:25:26 -080097 class WithMetaclass(metaclass=abc.ABCMeta):
98 pass
Guido van Rossume2a383d2007-01-15 16:59:06 +000099 tests = [None, 42, 2**100, 3.14, True, False, 1j,
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000100 "hello", "hello\u1234", f.__code__,
Antoine Pitroudc9215f2014-02-27 22:14:31 +0100101 b"world", bytes(range(256)),
Alexandre Vassalotti5c1c3b42013-12-01 13:25:26 -0800102 NewStyle, range(10), Classic, max, WithMetaclass]
Guido van Rossum581cb932003-02-06 17:52:15 +0000103 for x in tests:
Sandro Tosi4dc9c842011-08-05 23:05:35 +0200104 self.assertIs(copy.copy(x), x)
Guido van Rossum581cb932003-02-06 17:52:15 +0000105
106 def test_copy_list(self):
107 x = [1, 2, 3]
108 self.assertEqual(copy.copy(x), x)
109
110 def test_copy_tuple(self):
111 x = (1, 2, 3)
112 self.assertEqual(copy.copy(x), x)
113
114 def test_copy_dict(self):
115 x = {"foo": 1, "bar": 2}
116 self.assertEqual(copy.copy(x), x)
117
118 def test_copy_inst_vanilla(self):
119 class C:
120 def __init__(self, foo):
121 self.foo = foo
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000122 def __eq__(self, other):
123 return self.foo == other.foo
Guido van Rossum581cb932003-02-06 17:52:15 +0000124 x = C(42)
125 self.assertEqual(copy.copy(x), x)
126
127 def test_copy_inst_copy(self):
128 class C:
129 def __init__(self, foo):
130 self.foo = foo
131 def __copy__(self):
132 return C(self.foo)
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000133 def __eq__(self, other):
134 return self.foo == other.foo
Guido van Rossum581cb932003-02-06 17:52:15 +0000135 x = C(42)
136 self.assertEqual(copy.copy(x), x)
137
138 def test_copy_inst_getinitargs(self):
139 class C:
140 def __init__(self, foo):
141 self.foo = foo
142 def __getinitargs__(self):
143 return (self.foo,)
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000144 def __eq__(self, other):
145 return self.foo == other.foo
Guido van Rossum581cb932003-02-06 17:52:15 +0000146 x = C(42)
147 self.assertEqual(copy.copy(x), x)
148
Serhiy Storchaka32af7542015-03-24 18:06:42 +0200149 def test_copy_inst_getnewargs(self):
150 class C(int):
151 def __new__(cls, foo):
152 self = int.__new__(cls)
153 self.foo = foo
154 return self
155 def __getnewargs__(self):
156 return self.foo,
157 def __eq__(self, other):
158 return self.foo == other.foo
159 x = C(42)
160 y = copy.copy(x)
161 self.assertIsInstance(y, C)
162 self.assertEqual(y, x)
163 self.assertIsNot(y, x)
164 self.assertEqual(y.foo, x.foo)
165
166 def test_copy_inst_getnewargs_ex(self):
167 class C(int):
168 def __new__(cls, *, foo):
169 self = int.__new__(cls)
170 self.foo = foo
171 return self
172 def __getnewargs_ex__(self):
173 return (), {'foo': self.foo}
174 def __eq__(self, other):
175 return self.foo == other.foo
176 x = C(foo=42)
177 y = copy.copy(x)
178 self.assertIsInstance(y, C)
179 self.assertEqual(y, x)
180 self.assertIsNot(y, x)
181 self.assertEqual(y.foo, x.foo)
182
Guido van Rossum581cb932003-02-06 17:52:15 +0000183 def test_copy_inst_getstate(self):
184 class C:
185 def __init__(self, foo):
186 self.foo = foo
187 def __getstate__(self):
188 return {"foo": self.foo}
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000189 def __eq__(self, other):
190 return self.foo == other.foo
Guido van Rossum581cb932003-02-06 17:52:15 +0000191 x = C(42)
192 self.assertEqual(copy.copy(x), x)
193
194 def test_copy_inst_setstate(self):
195 class C:
196 def __init__(self, foo):
197 self.foo = foo
198 def __setstate__(self, state):
199 self.foo = state["foo"]
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000200 def __eq__(self, other):
201 return self.foo == other.foo
Guido van Rossum581cb932003-02-06 17:52:15 +0000202 x = C(42)
203 self.assertEqual(copy.copy(x), x)
204
205 def test_copy_inst_getstate_setstate(self):
206 class C:
207 def __init__(self, foo):
208 self.foo = foo
209 def __getstate__(self):
210 return self.foo
211 def __setstate__(self, state):
212 self.foo = state
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000213 def __eq__(self, other):
214 return self.foo == other.foo
Guido van Rossum581cb932003-02-06 17:52:15 +0000215 x = C(42)
216 self.assertEqual(copy.copy(x), x)
217
218 # The deepcopy() method
219
220 def test_deepcopy_basic(self):
221 x = 42
222 y = copy.deepcopy(x)
223 self.assertEqual(y, x)
224
225 def test_deepcopy_memo(self):
Guido van Rossum99d2c252003-06-13 19:28:47 +0000226 # Tests of reflexive objects are under type-specific sections below.
227 # This tests only repetitions of objects.
Guido van Rossum581cb932003-02-06 17:52:15 +0000228 x = []
Guido van Rossum99d2c252003-06-13 19:28:47 +0000229 x = [x, x]
Guido van Rossum581cb932003-02-06 17:52:15 +0000230 y = copy.deepcopy(x)
231 self.assertEqual(y, x)
Sandro Tosi4dc9c842011-08-05 23:05:35 +0200232 self.assertIsNot(y, x)
233 self.assertIsNot(y[0], x[0])
234 self.assertIs(y[0], y[1])
Guido van Rossum581cb932003-02-06 17:52:15 +0000235
236 def test_deepcopy_issubclass(self):
237 # XXX Note: there's no way to test the TypeError coming out of
238 # issubclass() -- this can only happen when an extension
239 # module defines a "type" that doesn't formally inherit from
240 # type.
241 class Meta(type):
242 pass
Guido van Rossum52cc1d82007-03-18 15:41:51 +0000243 class C(metaclass=Meta):
244 pass
Guido van Rossum581cb932003-02-06 17:52:15 +0000245 self.assertEqual(copy.deepcopy(C), C)
246
247 def test_deepcopy_deepcopy(self):
248 class C(object):
249 def __init__(self, foo):
250 self.foo = foo
251 def __deepcopy__(self, memo=None):
252 return C(self.foo)
253 x = C(42)
254 y = copy.deepcopy(x)
255 self.assertEqual(y.__class__, x.__class__)
256 self.assertEqual(y.foo, x.foo)
257
Guido van Rossumc06e3ac2003-02-07 17:30:18 +0000258 def test_deepcopy_registry(self):
259 class C(object):
260 def __new__(cls, foo):
261 obj = object.__new__(cls)
262 obj.foo = foo
263 return obj
264 def pickle_C(obj):
265 return (C, (obj.foo,))
266 x = C(42)
267 self.assertRaises(TypeError, copy.deepcopy, x)
Alexandre Vassalottif7fa63d2008-05-11 08:55:36 +0000268 copyreg.pickle(C, pickle_C, C)
Guido van Rossumc06e3ac2003-02-07 17:30:18 +0000269 y = copy.deepcopy(x)
270
Guido van Rossume6908832003-02-19 01:19:28 +0000271 def test_deepcopy_reduce_ex(self):
272 class C(object):
273 def __reduce_ex__(self, proto):
Sandro Tosi4dc9c842011-08-05 23:05:35 +0200274 c.append(1)
Guido van Rossume6908832003-02-19 01:19:28 +0000275 return ""
276 def __reduce__(self):
Sandro Tosi4dc9c842011-08-05 23:05:35 +0200277 self.fail("shouldn't call this")
278 c = []
Guido van Rossume6908832003-02-19 01:19:28 +0000279 x = C()
280 y = copy.deepcopy(x)
Sandro Tosi4dc9c842011-08-05 23:05:35 +0200281 self.assertIs(y, x)
282 self.assertEqual(c, [1])
Guido van Rossume6908832003-02-19 01:19:28 +0000283
Guido van Rossum581cb932003-02-06 17:52:15 +0000284 def test_deepcopy_reduce(self):
285 class C(object):
286 def __reduce__(self):
Sandro Tosi4dc9c842011-08-05 23:05:35 +0200287 c.append(1)
Guido van Rossum581cb932003-02-06 17:52:15 +0000288 return ""
Sandro Tosi4dc9c842011-08-05 23:05:35 +0200289 c = []
Guido van Rossum581cb932003-02-06 17:52:15 +0000290 x = C()
291 y = copy.deepcopy(x)
Sandro Tosi4dc9c842011-08-05 23:05:35 +0200292 self.assertIs(y, x)
293 self.assertEqual(c, [1])
Guido van Rossum581cb932003-02-06 17:52:15 +0000294
295 def test_deepcopy_cant(self):
Guido van Rossume6908832003-02-19 01:19:28 +0000296 class C(object):
Guido van Rossum581cb932003-02-06 17:52:15 +0000297 def __getattribute__(self, name):
Guido van Rossume6908832003-02-19 01:19:28 +0000298 if name.startswith("__reduce"):
Collin Winter3add4d72007-08-29 23:37:32 +0000299 raise AttributeError(name)
Guido van Rossum581cb932003-02-06 17:52:15 +0000300 return object.__getattribute__(self, name)
301 x = C()
302 self.assertRaises(copy.Error, copy.deepcopy, x)
303
304 # Type-specific _deepcopy_xxx() methods
305
306 def test_deepcopy_atomic(self):
307 class Classic:
308 pass
309 class NewStyle(object):
310 pass
311 def f():
312 pass
Guido van Rossume2a383d2007-01-15 16:59:06 +0000313 tests = [None, 42, 2**100, 3.14, True, False, 1j,
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000314 "hello", "hello\u1234", f.__code__,
Guido van Rossum805365e2007-05-07 22:24:25 +0000315 NewStyle, range(10), Classic, max]
Guido van Rossum581cb932003-02-06 17:52:15 +0000316 for x in tests:
Sandro Tosi4dc9c842011-08-05 23:05:35 +0200317 self.assertIs(copy.deepcopy(x), x)
Guido van Rossum581cb932003-02-06 17:52:15 +0000318
319 def test_deepcopy_list(self):
320 x = [[1, 2], 3]
321 y = copy.deepcopy(x)
322 self.assertEqual(y, x)
Sandro Tosi4dc9c842011-08-05 23:05:35 +0200323 self.assertIsNot(x, y)
324 self.assertIsNot(x[0], y[0])
Guido van Rossum581cb932003-02-06 17:52:15 +0000325
Guido van Rossum99d2c252003-06-13 19:28:47 +0000326 def test_deepcopy_reflexive_list(self):
327 x = []
328 x.append(x)
329 y = copy.deepcopy(x)
Mark Dickinsona56c4672009-01-27 18:17:45 +0000330 for op in comparisons:
331 self.assertRaises(RuntimeError, op, y, x)
Sandro Tosi4dc9c842011-08-05 23:05:35 +0200332 self.assertIsNot(y, x)
333 self.assertIs(y[0], y)
Armin Rigo2b3eb402003-10-28 12:05:48 +0000334 self.assertEqual(len(y), 1)
Guido van Rossum99d2c252003-06-13 19:28:47 +0000335
Sandro Tosi4dc9c842011-08-05 23:05:35 +0200336 def test_deepcopy_empty_tuple(self):
337 x = ()
338 y = copy.deepcopy(x)
339 self.assertIs(x, y)
340
Guido van Rossum581cb932003-02-06 17:52:15 +0000341 def test_deepcopy_tuple(self):
342 x = ([1, 2], 3)
343 y = copy.deepcopy(x)
344 self.assertEqual(y, x)
Sandro Tosi4dc9c842011-08-05 23:05:35 +0200345 self.assertIsNot(x, y)
346 self.assertIsNot(x[0], y[0])
347
348 def test_deepcopy_tuple_of_immutables(self):
349 x = ((1, 2), 3)
350 y = copy.deepcopy(x)
351 self.assertIs(x, y)
Guido van Rossum581cb932003-02-06 17:52:15 +0000352
Guido van Rossum99d2c252003-06-13 19:28:47 +0000353 def test_deepcopy_reflexive_tuple(self):
354 x = ([],)
355 x[0].append(x)
356 y = copy.deepcopy(x)
Mark Dickinsona56c4672009-01-27 18:17:45 +0000357 for op in comparisons:
358 self.assertRaises(RuntimeError, op, y, x)
Sandro Tosi4dc9c842011-08-05 23:05:35 +0200359 self.assertIsNot(y, x)
360 self.assertIsNot(y[0], x[0])
361 self.assertIs(y[0][0], y)
Guido van Rossum99d2c252003-06-13 19:28:47 +0000362
Guido van Rossum581cb932003-02-06 17:52:15 +0000363 def test_deepcopy_dict(self):
364 x = {"foo": [1, 2], "bar": 3}
365 y = copy.deepcopy(x)
366 self.assertEqual(y, x)
Sandro Tosi4dc9c842011-08-05 23:05:35 +0200367 self.assertIsNot(x, y)
368 self.assertIsNot(x["foo"], y["foo"])
Guido van Rossum581cb932003-02-06 17:52:15 +0000369
Guido van Rossum99d2c252003-06-13 19:28:47 +0000370 def test_deepcopy_reflexive_dict(self):
371 x = {}
372 x['foo'] = x
373 y = copy.deepcopy(x)
Mark Dickinsona56c4672009-01-27 18:17:45 +0000374 for op in order_comparisons:
375 self.assertRaises(TypeError, op, y, x)
376 for op in equality_comparisons:
377 self.assertRaises(RuntimeError, op, y, x)
Sandro Tosi4dc9c842011-08-05 23:05:35 +0200378 self.assertIsNot(y, x)
379 self.assertIs(y['foo'], y)
Armin Rigo2b3eb402003-10-28 12:05:48 +0000380 self.assertEqual(len(y), 1)
Guido van Rossum99d2c252003-06-13 19:28:47 +0000381
Guido van Rossum581cb932003-02-06 17:52:15 +0000382 def test_deepcopy_keepalive(self):
383 memo = {}
Benjamin Petersone90ec362011-06-27 16:22:46 -0500384 x = []
Guido van Rossum581cb932003-02-06 17:52:15 +0000385 y = copy.deepcopy(x, memo)
Benjamin Petersone90ec362011-06-27 16:22:46 -0500386 self.assertIs(memo[id(memo)][0], x)
387
388 def test_deepcopy_dont_memo_immutable(self):
389 memo = {}
390 x = [1, 2, 3, 4]
391 y = copy.deepcopy(x, memo)
392 self.assertEqual(y, x)
393 # There's the entry for the new list, and the keep alive.
394 self.assertEqual(len(memo), 2)
395
396 memo = {}
397 x = [(1, 2)]
398 y = copy.deepcopy(x, memo)
399 self.assertEqual(y, x)
400 # Tuples with immutable contents are immutable for deepcopy.
401 self.assertEqual(len(memo), 2)
Guido van Rossum581cb932003-02-06 17:52:15 +0000402
403 def test_deepcopy_inst_vanilla(self):
404 class C:
405 def __init__(self, foo):
406 self.foo = foo
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000407 def __eq__(self, other):
408 return self.foo == other.foo
Guido van Rossum581cb932003-02-06 17:52:15 +0000409 x = C([42])
410 y = copy.deepcopy(x)
411 self.assertEqual(y, x)
Sandro Tosi4dc9c842011-08-05 23:05:35 +0200412 self.assertIsNot(y.foo, x.foo)
Guido van Rossum581cb932003-02-06 17:52:15 +0000413
414 def test_deepcopy_inst_deepcopy(self):
415 class C:
416 def __init__(self, foo):
417 self.foo = foo
418 def __deepcopy__(self, memo):
419 return C(copy.deepcopy(self.foo, memo))
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000420 def __eq__(self, other):
421 return self.foo == other.foo
Guido van Rossum581cb932003-02-06 17:52:15 +0000422 x = C([42])
423 y = copy.deepcopy(x)
424 self.assertEqual(y, x)
Sandro Tosi4dc9c842011-08-05 23:05:35 +0200425 self.assertIsNot(y, x)
426 self.assertIsNot(y.foo, x.foo)
Guido van Rossum581cb932003-02-06 17:52:15 +0000427
428 def test_deepcopy_inst_getinitargs(self):
429 class C:
430 def __init__(self, foo):
431 self.foo = foo
432 def __getinitargs__(self):
433 return (self.foo,)
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000434 def __eq__(self, other):
435 return self.foo == other.foo
Guido van Rossum581cb932003-02-06 17:52:15 +0000436 x = C([42])
437 y = copy.deepcopy(x)
438 self.assertEqual(y, x)
Sandro Tosi4dc9c842011-08-05 23:05:35 +0200439 self.assertIsNot(y, x)
440 self.assertIsNot(y.foo, x.foo)
Guido van Rossum581cb932003-02-06 17:52:15 +0000441
Serhiy Storchaka32af7542015-03-24 18:06:42 +0200442 def test_deepcopy_inst_getnewargs(self):
443 class C(int):
444 def __new__(cls, foo):
445 self = int.__new__(cls)
446 self.foo = foo
447 return self
448 def __getnewargs__(self):
449 return self.foo,
450 def __eq__(self, other):
451 return self.foo == other.foo
452 x = C([42])
453 y = copy.deepcopy(x)
454 self.assertIsInstance(y, C)
455 self.assertEqual(y, x)
456 self.assertIsNot(y, x)
457 self.assertEqual(y.foo, x.foo)
458 self.assertIsNot(y.foo, x.foo)
459
460 def test_deepcopy_inst_getnewargs_ex(self):
461 class C(int):
462 def __new__(cls, *, foo):
463 self = int.__new__(cls)
464 self.foo = foo
465 return self
466 def __getnewargs_ex__(self):
467 return (), {'foo': self.foo}
468 def __eq__(self, other):
469 return self.foo == other.foo
470 x = C(foo=[42])
471 y = copy.deepcopy(x)
472 self.assertIsInstance(y, C)
473 self.assertEqual(y, x)
474 self.assertIsNot(y, x)
475 self.assertEqual(y.foo, x.foo)
476 self.assertIsNot(y.foo, x.foo)
477
Guido van Rossum581cb932003-02-06 17:52:15 +0000478 def test_deepcopy_inst_getstate(self):
479 class C:
480 def __init__(self, foo):
481 self.foo = foo
482 def __getstate__(self):
483 return {"foo": self.foo}
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000484 def __eq__(self, other):
485 return self.foo == other.foo
Guido van Rossum581cb932003-02-06 17:52:15 +0000486 x = C([42])
487 y = copy.deepcopy(x)
488 self.assertEqual(y, x)
Sandro Tosi4dc9c842011-08-05 23:05:35 +0200489 self.assertIsNot(y, x)
490 self.assertIsNot(y.foo, x.foo)
Guido van Rossum581cb932003-02-06 17:52:15 +0000491
492 def test_deepcopy_inst_setstate(self):
493 class C:
494 def __init__(self, foo):
495 self.foo = foo
496 def __setstate__(self, state):
497 self.foo = state["foo"]
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000498 def __eq__(self, other):
499 return self.foo == other.foo
Guido van Rossum581cb932003-02-06 17:52:15 +0000500 x = C([42])
501 y = copy.deepcopy(x)
502 self.assertEqual(y, x)
Sandro Tosi4dc9c842011-08-05 23:05:35 +0200503 self.assertIsNot(y, x)
504 self.assertIsNot(y.foo, x.foo)
Guido van Rossum581cb932003-02-06 17:52:15 +0000505
506 def test_deepcopy_inst_getstate_setstate(self):
507 class C:
508 def __init__(self, foo):
509 self.foo = foo
510 def __getstate__(self):
511 return self.foo
512 def __setstate__(self, state):
513 self.foo = state
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000514 def __eq__(self, other):
515 return self.foo == other.foo
Guido van Rossum581cb932003-02-06 17:52:15 +0000516 x = C([42])
517 y = copy.deepcopy(x)
518 self.assertEqual(y, x)
Sandro Tosi4dc9c842011-08-05 23:05:35 +0200519 self.assertIsNot(y, x)
520 self.assertIsNot(y.foo, x.foo)
Guido van Rossum581cb932003-02-06 17:52:15 +0000521
Guido van Rossum99d2c252003-06-13 19:28:47 +0000522 def test_deepcopy_reflexive_inst(self):
523 class C:
524 pass
525 x = C()
526 x.foo = x
527 y = copy.deepcopy(x)
Sandro Tosi4dc9c842011-08-05 23:05:35 +0200528 self.assertIsNot(y, x)
529 self.assertIs(y.foo, y)
Guido van Rossum99d2c252003-06-13 19:28:47 +0000530
Guido van Rossum581cb932003-02-06 17:52:15 +0000531 # _reconstruct()
532
533 def test_reconstruct_string(self):
534 class C(object):
535 def __reduce__(self):
536 return ""
537 x = C()
538 y = copy.copy(x)
Sandro Tosi4dc9c842011-08-05 23:05:35 +0200539 self.assertIs(y, x)
Guido van Rossum581cb932003-02-06 17:52:15 +0000540 y = copy.deepcopy(x)
Sandro Tosi4dc9c842011-08-05 23:05:35 +0200541 self.assertIs(y, x)
Guido van Rossum581cb932003-02-06 17:52:15 +0000542
543 def test_reconstruct_nostate(self):
544 class C(object):
545 def __reduce__(self):
546 return (C, ())
547 x = C()
548 x.foo = 42
549 y = copy.copy(x)
Sandro Tosi4dc9c842011-08-05 23:05:35 +0200550 self.assertIs(y.__class__, x.__class__)
Guido van Rossum581cb932003-02-06 17:52:15 +0000551 y = copy.deepcopy(x)
Sandro Tosi4dc9c842011-08-05 23:05:35 +0200552 self.assertIs(y.__class__, x.__class__)
Guido van Rossum581cb932003-02-06 17:52:15 +0000553
554 def test_reconstruct_state(self):
555 class C(object):
556 def __reduce__(self):
557 return (C, (), self.__dict__)
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000558 def __eq__(self, other):
559 return self.__dict__ == other.__dict__
Guido van Rossum581cb932003-02-06 17:52:15 +0000560 x = C()
561 x.foo = [42]
562 y = copy.copy(x)
563 self.assertEqual(y, x)
564 y = copy.deepcopy(x)
565 self.assertEqual(y, x)
Sandro Tosi4dc9c842011-08-05 23:05:35 +0200566 self.assertIsNot(y.foo, x.foo)
Guido van Rossum581cb932003-02-06 17:52:15 +0000567
568 def test_reconstruct_state_setstate(self):
569 class C(object):
570 def __reduce__(self):
571 return (C, (), self.__dict__)
572 def __setstate__(self, state):
573 self.__dict__.update(state)
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000574 def __eq__(self, other):
575 return self.__dict__ == other.__dict__
Guido van Rossum581cb932003-02-06 17:52:15 +0000576 x = C()
577 x.foo = [42]
578 y = copy.copy(x)
579 self.assertEqual(y, x)
580 y = copy.deepcopy(x)
581 self.assertEqual(y, x)
Sandro Tosi4dc9c842011-08-05 23:05:35 +0200582 self.assertIsNot(y.foo, x.foo)
Guido van Rossum581cb932003-02-06 17:52:15 +0000583
Guido van Rossum99d2c252003-06-13 19:28:47 +0000584 def test_reconstruct_reflexive(self):
585 class C(object):
586 pass
587 x = C()
588 x.foo = x
589 y = copy.deepcopy(x)
Sandro Tosi4dc9c842011-08-05 23:05:35 +0200590 self.assertIsNot(y, x)
591 self.assertIs(y.foo, y)
Guido van Rossum99d2c252003-06-13 19:28:47 +0000592
Guido van Rossum90e05b02003-02-06 18:18:23 +0000593 # Additions for Python 2.3 and pickle protocol 2
594
595 def test_reduce_4tuple(self):
596 class C(list):
597 def __reduce__(self):
598 return (C, (), self.__dict__, iter(self))
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000599 def __eq__(self, other):
600 return (list(self) == list(other) and
601 self.__dict__ == other.__dict__)
Guido van Rossum90e05b02003-02-06 18:18:23 +0000602 x = C([[1, 2], 3])
603 y = copy.copy(x)
604 self.assertEqual(x, y)
Sandro Tosi4dc9c842011-08-05 23:05:35 +0200605 self.assertIsNot(x, y)
606 self.assertIs(x[0], y[0])
Guido van Rossum90e05b02003-02-06 18:18:23 +0000607 y = copy.deepcopy(x)
608 self.assertEqual(x, y)
Sandro Tosi4dc9c842011-08-05 23:05:35 +0200609 self.assertIsNot(x, y)
610 self.assertIsNot(x[0], y[0])
Guido van Rossum90e05b02003-02-06 18:18:23 +0000611
612 def test_reduce_5tuple(self):
613 class C(dict):
614 def __reduce__(self):
Guido van Rossumcc2b0162007-02-11 06:12:03 +0000615 return (C, (), self.__dict__, None, self.items())
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000616 def __eq__(self, other):
617 return (dict(self) == dict(other) and
618 self.__dict__ == other.__dict__)
Guido van Rossum90e05b02003-02-06 18:18:23 +0000619 x = C([("foo", [1, 2]), ("bar", 3)])
620 y = copy.copy(x)
621 self.assertEqual(x, y)
Sandro Tosi4dc9c842011-08-05 23:05:35 +0200622 self.assertIsNot(x, y)
623 self.assertIs(x["foo"], y["foo"])
Guido van Rossum90e05b02003-02-06 18:18:23 +0000624 y = copy.deepcopy(x)
625 self.assertEqual(x, y)
Sandro Tosi4dc9c842011-08-05 23:05:35 +0200626 self.assertIsNot(x, y)
627 self.assertIsNot(x["foo"], y["foo"])
Guido van Rossum90e05b02003-02-06 18:18:23 +0000628
Guido van Rossumc7557582003-02-06 19:53:22 +0000629 def test_copy_slots(self):
630 class C(object):
631 __slots__ = ["foo"]
632 x = C()
633 x.foo = [42]
634 y = copy.copy(x)
Sandro Tosi4dc9c842011-08-05 23:05:35 +0200635 self.assertIs(x.foo, y.foo)
Guido van Rossumc7557582003-02-06 19:53:22 +0000636
637 def test_deepcopy_slots(self):
638 class C(object):
639 __slots__ = ["foo"]
640 x = C()
641 x.foo = [42]
642 y = copy.deepcopy(x)
643 self.assertEqual(x.foo, y.foo)
Sandro Tosi4dc9c842011-08-05 23:05:35 +0200644 self.assertIsNot(x.foo, y.foo)
Guido van Rossumc7557582003-02-06 19:53:22 +0000645
Antoine Pitrou3941a8f2010-09-04 17:40:21 +0000646 def test_deepcopy_dict_subclass(self):
647 class C(dict):
648 def __init__(self, d=None):
649 if not d:
650 d = {}
651 self._keys = list(d.keys())
652 super().__init__(d)
653 def __setitem__(self, key, item):
654 super().__setitem__(key, item)
655 if key not in self._keys:
656 self._keys.append(key)
657 x = C(d={'foo':0})
658 y = copy.deepcopy(x)
659 self.assertEqual(x, y)
660 self.assertEqual(x._keys, y._keys)
Sandro Tosi4dc9c842011-08-05 23:05:35 +0200661 self.assertIsNot(x, y)
Antoine Pitrou3941a8f2010-09-04 17:40:21 +0000662 x['bar'] = 1
663 self.assertNotEqual(x, y)
664 self.assertNotEqual(x._keys, y._keys)
665
Guido van Rossumc7557582003-02-06 19:53:22 +0000666 def test_copy_list_subclass(self):
667 class C(list):
668 pass
669 x = C([[1, 2], 3])
670 x.foo = [4, 5]
671 y = copy.copy(x)
672 self.assertEqual(list(x), list(y))
673 self.assertEqual(x.foo, y.foo)
Sandro Tosi4dc9c842011-08-05 23:05:35 +0200674 self.assertIs(x[0], y[0])
675 self.assertIs(x.foo, y.foo)
Guido van Rossumc7557582003-02-06 19:53:22 +0000676
677 def test_deepcopy_list_subclass(self):
678 class C(list):
679 pass
680 x = C([[1, 2], 3])
681 x.foo = [4, 5]
682 y = copy.deepcopy(x)
683 self.assertEqual(list(x), list(y))
684 self.assertEqual(x.foo, y.foo)
Sandro Tosi4dc9c842011-08-05 23:05:35 +0200685 self.assertIsNot(x[0], y[0])
686 self.assertIsNot(x.foo, y.foo)
Guido van Rossumc7557582003-02-06 19:53:22 +0000687
Guido van Rossum85233bf2003-02-06 21:25:12 +0000688 def test_copy_tuple_subclass(self):
689 class C(tuple):
690 pass
691 x = C([1, 2, 3])
692 self.assertEqual(tuple(x), (1, 2, 3))
693 y = copy.copy(x)
694 self.assertEqual(tuple(y), (1, 2, 3))
695
696 def test_deepcopy_tuple_subclass(self):
697 class C(tuple):
698 pass
699 x = C([[1, 2], 3])
700 self.assertEqual(tuple(x), ([1, 2], 3))
701 y = copy.deepcopy(x)
702 self.assertEqual(tuple(y), ([1, 2], 3))
Sandro Tosi4dc9c842011-08-05 23:05:35 +0200703 self.assertIsNot(x, y)
704 self.assertIsNot(x[0], y[0])
Guido van Rossum85233bf2003-02-06 21:25:12 +0000705
Neal Norwitze2fdc612003-06-08 13:19:58 +0000706 def test_getstate_exc(self):
707 class EvilState(object):
708 def __getstate__(self):
Collin Winter3add4d72007-08-29 23:37:32 +0000709 raise ValueError("ain't got no stickin' state")
Neal Norwitze2fdc612003-06-08 13:19:58 +0000710 self.assertRaises(ValueError, copy.copy, EvilState())
711
Guido van Rossum1968ad32006-02-25 22:38:04 +0000712 def test_copy_function(self):
713 self.assertEqual(copy.copy(global_foo), global_foo)
714 def foo(x, y): return x+y
715 self.assertEqual(copy.copy(foo), foo)
716 bar = lambda: None
717 self.assertEqual(copy.copy(bar), bar)
718
719 def test_deepcopy_function(self):
720 self.assertEqual(copy.deepcopy(global_foo), global_foo)
721 def foo(x, y): return x+y
722 self.assertEqual(copy.deepcopy(foo), foo)
723 bar = lambda: None
724 self.assertEqual(copy.deepcopy(bar), bar)
725
Antoine Pitrou6e610062009-05-15 17:04:50 +0000726 def _check_weakref(self, _copy):
727 class C(object):
728 pass
729 obj = C()
730 x = weakref.ref(obj)
731 y = _copy(x)
Sandro Tosi4dc9c842011-08-05 23:05:35 +0200732 self.assertIs(y, x)
Antoine Pitrou6e610062009-05-15 17:04:50 +0000733 del obj
734 y = _copy(x)
Sandro Tosi4dc9c842011-08-05 23:05:35 +0200735 self.assertIs(y, x)
Antoine Pitrou6e610062009-05-15 17:04:50 +0000736
737 def test_copy_weakref(self):
738 self._check_weakref(copy.copy)
739
740 def test_deepcopy_weakref(self):
741 self._check_weakref(copy.deepcopy)
742
743 def _check_copy_weakdict(self, _dicttype):
744 class C(object):
745 pass
746 a, b, c, d = [C() for i in range(4)]
747 u = _dicttype()
748 u[a] = b
749 u[c] = d
750 v = copy.copy(u)
Sandro Tosi4dc9c842011-08-05 23:05:35 +0200751 self.assertIsNot(v, u)
Antoine Pitrou6e610062009-05-15 17:04:50 +0000752 self.assertEqual(v, u)
753 self.assertEqual(v[a], b)
754 self.assertEqual(v[c], d)
755 self.assertEqual(len(v), 2)
756 del c, d
757 self.assertEqual(len(v), 1)
758 x, y = C(), C()
759 # The underlying containers are decoupled
760 v[x] = y
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000761 self.assertNotIn(x, u)
Antoine Pitrou6e610062009-05-15 17:04:50 +0000762
763 def test_copy_weakkeydict(self):
764 self._check_copy_weakdict(weakref.WeakKeyDictionary)
765
766 def test_copy_weakvaluedict(self):
767 self._check_copy_weakdict(weakref.WeakValueDictionary)
768
769 def test_deepcopy_weakkeydict(self):
770 class C(object):
771 def __init__(self, i):
772 self.i = i
773 a, b, c, d = [C(i) for i in range(4)]
774 u = weakref.WeakKeyDictionary()
775 u[a] = b
776 u[c] = d
777 # Keys aren't copied, values are
778 v = copy.deepcopy(u)
779 self.assertNotEqual(v, u)
780 self.assertEqual(len(v), 2)
Sandro Tosi4dc9c842011-08-05 23:05:35 +0200781 self.assertIsNot(v[a], b)
782 self.assertIsNot(v[c], d)
Antoine Pitrou6e610062009-05-15 17:04:50 +0000783 self.assertEqual(v[a].i, b.i)
784 self.assertEqual(v[c].i, d.i)
785 del c
786 self.assertEqual(len(v), 1)
787
788 def test_deepcopy_weakvaluedict(self):
789 class C(object):
790 def __init__(self, i):
791 self.i = i
792 a, b, c, d = [C(i) for i in range(4)]
793 u = weakref.WeakValueDictionary()
794 u[a] = b
795 u[c] = d
796 # Keys are copied, values aren't
797 v = copy.deepcopy(u)
798 self.assertNotEqual(v, u)
799 self.assertEqual(len(v), 2)
800 (x, y), (z, t) = sorted(v.items(), key=lambda pair: pair[0].i)
Sandro Tosi4dc9c842011-08-05 23:05:35 +0200801 self.assertIsNot(x, a)
Antoine Pitrou6e610062009-05-15 17:04:50 +0000802 self.assertEqual(x.i, a.i)
Sandro Tosi4dc9c842011-08-05 23:05:35 +0200803 self.assertIs(y, b)
804 self.assertIsNot(z, c)
Antoine Pitrou6e610062009-05-15 17:04:50 +0000805 self.assertEqual(z.i, c.i)
Sandro Tosi4dc9c842011-08-05 23:05:35 +0200806 self.assertIs(t, d)
Antoine Pitrou6e610062009-05-15 17:04:50 +0000807 del x, y, z, t
808 del d
809 self.assertEqual(len(v), 1)
810
Antoine Pitrou1fc0d2b2009-11-28 15:58:27 +0000811 def test_deepcopy_bound_method(self):
812 class Foo(object):
813 def m(self):
814 pass
815 f = Foo()
816 f.b = f.m
817 g = copy.deepcopy(f)
818 self.assertEqual(g.m, g.b)
Sandro Tosi4dc9c842011-08-05 23:05:35 +0200819 self.assertIs(g.b.__self__, g)
Antoine Pitrou1fc0d2b2009-11-28 15:58:27 +0000820 g.b()
821
Antoine Pitrou6e610062009-05-15 17:04:50 +0000822
Guido van Rossum1968ad32006-02-25 22:38:04 +0000823def global_foo(x, y): return x+y
824
Guido van Rossum581cb932003-02-06 17:52:15 +0000825def test_main():
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000826 support.run_unittest(TestCopy)
Guido van Rossum581cb932003-02-06 17:52:15 +0000827
828if __name__ == "__main__":
829 test_main()