blob: 133c8886a2af9f6cecc749fdd3997f7c58473748 [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
Mark Dickinsona56c4672009-01-27 18:17:45 +00005from operator import le, lt, ge, gt, eq, ne
Guido van Rossum581cb932003-02-06 17:52:15 +00006import unittest
Benjamin Petersonee8712c2008-05-20 21:35:26 +00007from test import support
Guido van Rossum581cb932003-02-06 17:52:15 +00008
Mark Dickinsona56c4672009-01-27 18:17:45 +00009order_comparisons = le, lt, ge, gt
10equality_comparisons = eq, ne
11comparisons = order_comparisons + equality_comparisons
12
Guido van Rossum581cb932003-02-06 17:52:15 +000013class TestCopy(unittest.TestCase):
14
15 # Attempt full line coverage of copy.py from top to bottom
16
17 def test_exceptions(self):
18 self.assert_(copy.Error is copy.error)
19 self.assert_(issubclass(copy.Error, Exception))
20
21 # The copy() method
22
23 def test_copy_basic(self):
24 x = 42
25 y = copy.copy(x)
26 self.assertEqual(x, y)
27
28 def test_copy_copy(self):
29 class C(object):
30 def __init__(self, foo):
31 self.foo = foo
32 def __copy__(self):
33 return C(self.foo)
34 x = C(42)
35 y = copy.copy(x)
36 self.assertEqual(y.__class__, x.__class__)
37 self.assertEqual(y.foo, x.foo)
38
Guido van Rossumc06e3ac2003-02-07 17:30:18 +000039 def test_copy_registry(self):
40 class C(object):
41 def __new__(cls, foo):
42 obj = object.__new__(cls)
43 obj.foo = foo
44 return obj
45 def pickle_C(obj):
46 return (C, (obj.foo,))
47 x = C(42)
48 self.assertRaises(TypeError, copy.copy, x)
Alexandre Vassalottif7fa63d2008-05-11 08:55:36 +000049 copyreg.pickle(C, pickle_C, C)
Guido van Rossumc06e3ac2003-02-07 17:30:18 +000050 y = copy.copy(x)
51
Guido van Rossume6908832003-02-19 01:19:28 +000052 def test_copy_reduce_ex(self):
53 class C(object):
54 def __reduce_ex__(self, proto):
55 return ""
56 def __reduce__(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +000057 raise support.TestFailed("shouldn't call this")
Guido van Rossume6908832003-02-19 01:19:28 +000058 x = C()
59 y = copy.copy(x)
60 self.assert_(y is x)
61
Guido van Rossum581cb932003-02-06 17:52:15 +000062 def test_copy_reduce(self):
63 class C(object):
64 def __reduce__(self):
65 return ""
66 x = C()
67 y = copy.copy(x)
68 self.assert_(y is x)
69
70 def test_copy_cant(self):
Guido van Rossume6908832003-02-19 01:19:28 +000071 class C(object):
Guido van Rossum581cb932003-02-06 17:52:15 +000072 def __getattribute__(self, name):
Guido van Rossume6908832003-02-19 01:19:28 +000073 if name.startswith("__reduce"):
Collin Winter3add4d72007-08-29 23:37:32 +000074 raise AttributeError(name)
Guido van Rossum581cb932003-02-06 17:52:15 +000075 return object.__getattribute__(self, name)
76 x = C()
77 self.assertRaises(copy.Error, copy.copy, x)
78
79 # Type-specific _copy_xxx() methods
80
81 def test_copy_atomic(self):
82 class Classic:
83 pass
84 class NewStyle(object):
85 pass
86 def f():
87 pass
Guido van Rossume2a383d2007-01-15 16:59:06 +000088 tests = [None, 42, 2**100, 3.14, True, False, 1j,
Guido van Rossumef87d6e2007-05-02 19:09:54 +000089 "hello", "hello\u1234", f.__code__,
Guido van Rossum805365e2007-05-07 22:24:25 +000090 NewStyle, range(10), Classic, max]
Guido van Rossum581cb932003-02-06 17:52:15 +000091 for x in tests:
Walter Dörwald70a6b492004-02-12 17:35:32 +000092 self.assert_(copy.copy(x) is x, repr(x))
Guido van Rossum581cb932003-02-06 17:52:15 +000093
94 def test_copy_list(self):
95 x = [1, 2, 3]
96 self.assertEqual(copy.copy(x), x)
97
98 def test_copy_tuple(self):
99 x = (1, 2, 3)
100 self.assertEqual(copy.copy(x), x)
101
102 def test_copy_dict(self):
103 x = {"foo": 1, "bar": 2}
104 self.assertEqual(copy.copy(x), x)
105
106 def test_copy_inst_vanilla(self):
107 class C:
108 def __init__(self, foo):
109 self.foo = foo
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000110 def __eq__(self, other):
111 return self.foo == other.foo
Guido van Rossum581cb932003-02-06 17:52:15 +0000112 x = C(42)
113 self.assertEqual(copy.copy(x), x)
114
115 def test_copy_inst_copy(self):
116 class C:
117 def __init__(self, foo):
118 self.foo = foo
119 def __copy__(self):
120 return C(self.foo)
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000121 def __eq__(self, other):
122 return self.foo == other.foo
Guido van Rossum581cb932003-02-06 17:52:15 +0000123 x = C(42)
124 self.assertEqual(copy.copy(x), x)
125
126 def test_copy_inst_getinitargs(self):
127 class C:
128 def __init__(self, foo):
129 self.foo = foo
130 def __getinitargs__(self):
131 return (self.foo,)
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000132 def __eq__(self, other):
133 return self.foo == other.foo
Guido van Rossum581cb932003-02-06 17:52:15 +0000134 x = C(42)
135 self.assertEqual(copy.copy(x), x)
136
137 def test_copy_inst_getstate(self):
138 class C:
139 def __init__(self, foo):
140 self.foo = foo
141 def __getstate__(self):
142 return {"foo": self.foo}
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000143 def __eq__(self, other):
144 return self.foo == other.foo
Guido van Rossum581cb932003-02-06 17:52:15 +0000145 x = C(42)
146 self.assertEqual(copy.copy(x), x)
147
148 def test_copy_inst_setstate(self):
149 class C:
150 def __init__(self, foo):
151 self.foo = foo
152 def __setstate__(self, state):
153 self.foo = state["foo"]
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000154 def __eq__(self, other):
155 return self.foo == other.foo
Guido van Rossum581cb932003-02-06 17:52:15 +0000156 x = C(42)
157 self.assertEqual(copy.copy(x), x)
158
159 def test_copy_inst_getstate_setstate(self):
160 class C:
161 def __init__(self, foo):
162 self.foo = foo
163 def __getstate__(self):
164 return self.foo
165 def __setstate__(self, state):
166 self.foo = state
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000167 def __eq__(self, other):
168 return self.foo == other.foo
Guido van Rossum581cb932003-02-06 17:52:15 +0000169 x = C(42)
170 self.assertEqual(copy.copy(x), x)
171
172 # The deepcopy() method
173
174 def test_deepcopy_basic(self):
175 x = 42
176 y = copy.deepcopy(x)
177 self.assertEqual(y, x)
178
179 def test_deepcopy_memo(self):
Guido van Rossum99d2c252003-06-13 19:28:47 +0000180 # Tests of reflexive objects are under type-specific sections below.
181 # This tests only repetitions of objects.
Guido van Rossum581cb932003-02-06 17:52:15 +0000182 x = []
Guido van Rossum99d2c252003-06-13 19:28:47 +0000183 x = [x, x]
Guido van Rossum581cb932003-02-06 17:52:15 +0000184 y = copy.deepcopy(x)
185 self.assertEqual(y, x)
186 self.assert_(y is not x)
187 self.assert_(y[0] is not x[0])
Guido van Rossum99d2c252003-06-13 19:28:47 +0000188 self.assert_(y[0] is y[1])
Guido van Rossum581cb932003-02-06 17:52:15 +0000189
190 def test_deepcopy_issubclass(self):
191 # XXX Note: there's no way to test the TypeError coming out of
192 # issubclass() -- this can only happen when an extension
193 # module defines a "type" that doesn't formally inherit from
194 # type.
195 class Meta(type):
196 pass
Guido van Rossum52cc1d82007-03-18 15:41:51 +0000197 class C(metaclass=Meta):
198 pass
Guido van Rossum581cb932003-02-06 17:52:15 +0000199 self.assertEqual(copy.deepcopy(C), C)
200
201 def test_deepcopy_deepcopy(self):
202 class C(object):
203 def __init__(self, foo):
204 self.foo = foo
205 def __deepcopy__(self, memo=None):
206 return C(self.foo)
207 x = C(42)
208 y = copy.deepcopy(x)
209 self.assertEqual(y.__class__, x.__class__)
210 self.assertEqual(y.foo, x.foo)
211
Guido van Rossumc06e3ac2003-02-07 17:30:18 +0000212 def test_deepcopy_registry(self):
213 class C(object):
214 def __new__(cls, foo):
215 obj = object.__new__(cls)
216 obj.foo = foo
217 return obj
218 def pickle_C(obj):
219 return (C, (obj.foo,))
220 x = C(42)
221 self.assertRaises(TypeError, copy.deepcopy, x)
Alexandre Vassalottif7fa63d2008-05-11 08:55:36 +0000222 copyreg.pickle(C, pickle_C, C)
Guido van Rossumc06e3ac2003-02-07 17:30:18 +0000223 y = copy.deepcopy(x)
224
Guido van Rossume6908832003-02-19 01:19:28 +0000225 def test_deepcopy_reduce_ex(self):
226 class C(object):
227 def __reduce_ex__(self, proto):
228 return ""
229 def __reduce__(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000230 raise support.TestFailed("shouldn't call this")
Guido van Rossume6908832003-02-19 01:19:28 +0000231 x = C()
232 y = copy.deepcopy(x)
233 self.assert_(y is x)
234
Guido van Rossum581cb932003-02-06 17:52:15 +0000235 def test_deepcopy_reduce(self):
236 class C(object):
237 def __reduce__(self):
238 return ""
239 x = C()
240 y = copy.deepcopy(x)
241 self.assert_(y is x)
242
243 def test_deepcopy_cant(self):
Guido van Rossume6908832003-02-19 01:19:28 +0000244 class C(object):
Guido van Rossum581cb932003-02-06 17:52:15 +0000245 def __getattribute__(self, name):
Guido van Rossume6908832003-02-19 01:19:28 +0000246 if name.startswith("__reduce"):
Collin Winter3add4d72007-08-29 23:37:32 +0000247 raise AttributeError(name)
Guido van Rossum581cb932003-02-06 17:52:15 +0000248 return object.__getattribute__(self, name)
249 x = C()
250 self.assertRaises(copy.Error, copy.deepcopy, x)
251
252 # Type-specific _deepcopy_xxx() methods
253
254 def test_deepcopy_atomic(self):
255 class Classic:
256 pass
257 class NewStyle(object):
258 pass
259 def f():
260 pass
Guido van Rossume2a383d2007-01-15 16:59:06 +0000261 tests = [None, 42, 2**100, 3.14, True, False, 1j,
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000262 "hello", "hello\u1234", f.__code__,
Guido van Rossum805365e2007-05-07 22:24:25 +0000263 NewStyle, range(10), Classic, max]
Guido van Rossum581cb932003-02-06 17:52:15 +0000264 for x in tests:
Walter Dörwald70a6b492004-02-12 17:35:32 +0000265 self.assert_(copy.deepcopy(x) is x, repr(x))
Guido van Rossum581cb932003-02-06 17:52:15 +0000266
267 def test_deepcopy_list(self):
268 x = [[1, 2], 3]
269 y = copy.deepcopy(x)
270 self.assertEqual(y, x)
271 self.assert_(x is not y)
272 self.assert_(x[0] is not y[0])
273
Guido van Rossum99d2c252003-06-13 19:28:47 +0000274 def test_deepcopy_reflexive_list(self):
275 x = []
276 x.append(x)
277 y = copy.deepcopy(x)
Mark Dickinsona56c4672009-01-27 18:17:45 +0000278 for op in comparisons:
279 self.assertRaises(RuntimeError, op, y, x)
Guido van Rossum99d2c252003-06-13 19:28:47 +0000280 self.assert_(y is not x)
Armin Rigo2b3eb402003-10-28 12:05:48 +0000281 self.assert_(y[0] is y)
282 self.assertEqual(len(y), 1)
Guido van Rossum99d2c252003-06-13 19:28:47 +0000283
Guido van Rossum581cb932003-02-06 17:52:15 +0000284 def test_deepcopy_tuple(self):
285 x = ([1, 2], 3)
286 y = copy.deepcopy(x)
287 self.assertEqual(y, x)
288 self.assert_(x is not y)
289 self.assert_(x[0] is not y[0])
290
Guido van Rossum99d2c252003-06-13 19:28:47 +0000291 def test_deepcopy_reflexive_tuple(self):
292 x = ([],)
293 x[0].append(x)
294 y = copy.deepcopy(x)
Mark Dickinsona56c4672009-01-27 18:17:45 +0000295 for op in comparisons:
296 self.assertRaises(RuntimeError, op, y, x)
Guido van Rossum99d2c252003-06-13 19:28:47 +0000297 self.assert_(y is not x)
298 self.assert_(y[0] is not x[0])
299 self.assert_(y[0][0] is y)
300
Guido van Rossum581cb932003-02-06 17:52:15 +0000301 def test_deepcopy_dict(self):
302 x = {"foo": [1, 2], "bar": 3}
303 y = copy.deepcopy(x)
304 self.assertEqual(y, x)
305 self.assert_(x is not y)
306 self.assert_(x["foo"] is not y["foo"])
307
Guido van Rossum99d2c252003-06-13 19:28:47 +0000308 def test_deepcopy_reflexive_dict(self):
309 x = {}
310 x['foo'] = x
311 y = copy.deepcopy(x)
Mark Dickinsona56c4672009-01-27 18:17:45 +0000312 for op in order_comparisons:
313 self.assertRaises(TypeError, op, y, x)
314 for op in equality_comparisons:
315 self.assertRaises(RuntimeError, op, y, x)
Guido van Rossum99d2c252003-06-13 19:28:47 +0000316 self.assert_(y is not x)
317 self.assert_(y['foo'] is y)
Armin Rigo2b3eb402003-10-28 12:05:48 +0000318 self.assertEqual(len(y), 1)
Guido van Rossum99d2c252003-06-13 19:28:47 +0000319
Guido van Rossum581cb932003-02-06 17:52:15 +0000320 def test_deepcopy_keepalive(self):
321 memo = {}
322 x = 42
323 y = copy.deepcopy(x, memo)
324 self.assert_(memo[id(x)] is x)
325
326 def test_deepcopy_inst_vanilla(self):
327 class C:
328 def __init__(self, foo):
329 self.foo = foo
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000330 def __eq__(self, other):
331 return self.foo == other.foo
Guido van Rossum581cb932003-02-06 17:52:15 +0000332 x = C([42])
333 y = copy.deepcopy(x)
334 self.assertEqual(y, x)
335 self.assert_(y.foo is not x.foo)
336
337 def test_deepcopy_inst_deepcopy(self):
338 class C:
339 def __init__(self, foo):
340 self.foo = foo
341 def __deepcopy__(self, memo):
342 return C(copy.deepcopy(self.foo, memo))
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000343 def __eq__(self, other):
344 return self.foo == other.foo
Guido van Rossum581cb932003-02-06 17:52:15 +0000345 x = C([42])
346 y = copy.deepcopy(x)
347 self.assertEqual(y, x)
348 self.assert_(y is not x)
349 self.assert_(y.foo is not x.foo)
350
351 def test_deepcopy_inst_getinitargs(self):
352 class C:
353 def __init__(self, foo):
354 self.foo = foo
355 def __getinitargs__(self):
356 return (self.foo,)
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000357 def __eq__(self, other):
358 return self.foo == other.foo
Guido van Rossum581cb932003-02-06 17:52:15 +0000359 x = C([42])
360 y = copy.deepcopy(x)
361 self.assertEqual(y, x)
362 self.assert_(y is not x)
363 self.assert_(y.foo is not x.foo)
364
365 def test_deepcopy_inst_getstate(self):
366 class C:
367 def __init__(self, foo):
368 self.foo = foo
369 def __getstate__(self):
370 return {"foo": self.foo}
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000371 def __eq__(self, other):
372 return self.foo == other.foo
Guido van Rossum581cb932003-02-06 17:52:15 +0000373 x = C([42])
374 y = copy.deepcopy(x)
375 self.assertEqual(y, x)
376 self.assert_(y is not x)
377 self.assert_(y.foo is not x.foo)
378
379 def test_deepcopy_inst_setstate(self):
380 class C:
381 def __init__(self, foo):
382 self.foo = foo
383 def __setstate__(self, state):
384 self.foo = state["foo"]
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000385 def __eq__(self, other):
386 return self.foo == other.foo
Guido van Rossum581cb932003-02-06 17:52:15 +0000387 x = C([42])
388 y = copy.deepcopy(x)
389 self.assertEqual(y, x)
390 self.assert_(y is not x)
391 self.assert_(y.foo is not x.foo)
392
393 def test_deepcopy_inst_getstate_setstate(self):
394 class C:
395 def __init__(self, foo):
396 self.foo = foo
397 def __getstate__(self):
398 return self.foo
399 def __setstate__(self, state):
400 self.foo = state
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000401 def __eq__(self, other):
402 return self.foo == other.foo
Guido van Rossum581cb932003-02-06 17:52:15 +0000403 x = C([42])
404 y = copy.deepcopy(x)
405 self.assertEqual(y, x)
406 self.assert_(y is not x)
407 self.assert_(y.foo is not x.foo)
408
Guido van Rossum99d2c252003-06-13 19:28:47 +0000409 def test_deepcopy_reflexive_inst(self):
410 class C:
411 pass
412 x = C()
413 x.foo = x
414 y = copy.deepcopy(x)
415 self.assert_(y is not x)
416 self.assert_(y.foo is y)
417
Guido van Rossum581cb932003-02-06 17:52:15 +0000418 # _reconstruct()
419
420 def test_reconstruct_string(self):
421 class C(object):
422 def __reduce__(self):
423 return ""
424 x = C()
425 y = copy.copy(x)
426 self.assert_(y is x)
427 y = copy.deepcopy(x)
428 self.assert_(y is x)
429
430 def test_reconstruct_nostate(self):
431 class C(object):
432 def __reduce__(self):
433 return (C, ())
434 x = C()
435 x.foo = 42
436 y = copy.copy(x)
437 self.assert_(y.__class__ is x.__class__)
438 y = copy.deepcopy(x)
439 self.assert_(y.__class__ is x.__class__)
440
441 def test_reconstruct_state(self):
442 class C(object):
443 def __reduce__(self):
444 return (C, (), self.__dict__)
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000445 def __eq__(self, other):
446 return self.__dict__ == other.__dict__
Guido van Rossum581cb932003-02-06 17:52:15 +0000447 x = C()
448 x.foo = [42]
449 y = copy.copy(x)
450 self.assertEqual(y, x)
451 y = copy.deepcopy(x)
452 self.assertEqual(y, x)
453 self.assert_(y.foo is not x.foo)
454
455 def test_reconstruct_state_setstate(self):
456 class C(object):
457 def __reduce__(self):
458 return (C, (), self.__dict__)
459 def __setstate__(self, state):
460 self.__dict__.update(state)
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000461 def __eq__(self, other):
462 return self.__dict__ == other.__dict__
Guido van Rossum581cb932003-02-06 17:52:15 +0000463 x = C()
464 x.foo = [42]
465 y = copy.copy(x)
466 self.assertEqual(y, x)
467 y = copy.deepcopy(x)
468 self.assertEqual(y, x)
469 self.assert_(y.foo is not x.foo)
470
Guido van Rossum99d2c252003-06-13 19:28:47 +0000471 def test_reconstruct_reflexive(self):
472 class C(object):
473 pass
474 x = C()
475 x.foo = x
476 y = copy.deepcopy(x)
477 self.assert_(y is not x)
478 self.assert_(y.foo is y)
479
Guido van Rossum90e05b02003-02-06 18:18:23 +0000480 # Additions for Python 2.3 and pickle protocol 2
481
482 def test_reduce_4tuple(self):
483 class C(list):
484 def __reduce__(self):
485 return (C, (), self.__dict__, iter(self))
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000486 def __eq__(self, other):
487 return (list(self) == list(other) and
488 self.__dict__ == other.__dict__)
Guido van Rossum90e05b02003-02-06 18:18:23 +0000489 x = C([[1, 2], 3])
490 y = copy.copy(x)
491 self.assertEqual(x, y)
492 self.assert_(x is not y)
493 self.assert_(x[0] is y[0])
494 y = copy.deepcopy(x)
495 self.assertEqual(x, y)
496 self.assert_(x is not y)
497 self.assert_(x[0] is not y[0])
498
499 def test_reduce_5tuple(self):
500 class C(dict):
501 def __reduce__(self):
Guido van Rossumcc2b0162007-02-11 06:12:03 +0000502 return (C, (), self.__dict__, None, self.items())
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000503 def __eq__(self, other):
504 return (dict(self) == dict(other) and
505 self.__dict__ == other.__dict__)
Guido van Rossum90e05b02003-02-06 18:18:23 +0000506 x = C([("foo", [1, 2]), ("bar", 3)])
507 y = copy.copy(x)
508 self.assertEqual(x, y)
509 self.assert_(x is not y)
510 self.assert_(x["foo"] is y["foo"])
511 y = copy.deepcopy(x)
512 self.assertEqual(x, y)
513 self.assert_(x is not y)
514 self.assert_(x["foo"] is not y["foo"])
515
Guido van Rossumc7557582003-02-06 19:53:22 +0000516 def test_copy_slots(self):
517 class C(object):
518 __slots__ = ["foo"]
519 x = C()
520 x.foo = [42]
521 y = copy.copy(x)
522 self.assert_(x.foo is y.foo)
523
524 def test_deepcopy_slots(self):
525 class C(object):
526 __slots__ = ["foo"]
527 x = C()
528 x.foo = [42]
529 y = copy.deepcopy(x)
530 self.assertEqual(x.foo, y.foo)
531 self.assert_(x.foo is not y.foo)
532
533 def test_copy_list_subclass(self):
534 class C(list):
535 pass
536 x = C([[1, 2], 3])
537 x.foo = [4, 5]
538 y = copy.copy(x)
539 self.assertEqual(list(x), list(y))
540 self.assertEqual(x.foo, y.foo)
541 self.assert_(x[0] is y[0])
542 self.assert_(x.foo is y.foo)
543
544 def test_deepcopy_list_subclass(self):
545 class C(list):
546 pass
547 x = C([[1, 2], 3])
548 x.foo = [4, 5]
549 y = copy.deepcopy(x)
550 self.assertEqual(list(x), list(y))
551 self.assertEqual(x.foo, y.foo)
552 self.assert_(x[0] is not y[0])
553 self.assert_(x.foo is not y.foo)
554
Guido van Rossum85233bf2003-02-06 21:25:12 +0000555 def test_copy_tuple_subclass(self):
556 class C(tuple):
557 pass
558 x = C([1, 2, 3])
559 self.assertEqual(tuple(x), (1, 2, 3))
560 y = copy.copy(x)
561 self.assertEqual(tuple(y), (1, 2, 3))
562
563 def test_deepcopy_tuple_subclass(self):
564 class C(tuple):
565 pass
566 x = C([[1, 2], 3])
567 self.assertEqual(tuple(x), ([1, 2], 3))
568 y = copy.deepcopy(x)
569 self.assertEqual(tuple(y), ([1, 2], 3))
570 self.assert_(x is not y)
571 self.assert_(x[0] is not y[0])
572
Neal Norwitze2fdc612003-06-08 13:19:58 +0000573 def test_getstate_exc(self):
574 class EvilState(object):
575 def __getstate__(self):
Collin Winter3add4d72007-08-29 23:37:32 +0000576 raise ValueError("ain't got no stickin' state")
Neal Norwitze2fdc612003-06-08 13:19:58 +0000577 self.assertRaises(ValueError, copy.copy, EvilState())
578
Guido van Rossum1968ad32006-02-25 22:38:04 +0000579 def test_copy_function(self):
580 self.assertEqual(copy.copy(global_foo), global_foo)
581 def foo(x, y): return x+y
582 self.assertEqual(copy.copy(foo), foo)
583 bar = lambda: None
584 self.assertEqual(copy.copy(bar), bar)
585
586 def test_deepcopy_function(self):
587 self.assertEqual(copy.deepcopy(global_foo), global_foo)
588 def foo(x, y): return x+y
589 self.assertEqual(copy.deepcopy(foo), foo)
590 bar = lambda: None
591 self.assertEqual(copy.deepcopy(bar), bar)
592
593def global_foo(x, y): return x+y
594
Guido van Rossum581cb932003-02-06 17:52:15 +0000595def test_main():
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000596 support.run_unittest(TestCopy)
Guido van Rossum581cb932003-02-06 17:52:15 +0000597
598if __name__ == "__main__":
599 test_main()