from test.support.import_helper import forget
from test.support.os_helper import TESTFN
from test.support import threading_helper
+from test.support.testcase import ExtraAssertions
from test.support.warnings_helper import save_restore_warnings_filters
from test import picklecommon
from test.picklecommon import *
check(-2**1000, (OverflowError, struct.error))
-class AbstractPickleTests:
+class AbstractPickleTests(ExtraAssertions):
# Subclass must define self.dumps, self.loads.
py_version = sys.version_info # for test_xpickle
with self.subTest(proto=proto, descr=descr):
self.assertRaises(TypeError, self.dumps, descr, proto)
+ def test_object_with_attrs(self):
+ obj = Object()
+ obj.a = 1
+ for proto in protocols:
+ with self.subTest(proto=proto):
+ unpickled = self.loads(self.dumps(obj, proto))
+ self.assertEqual(unpickled.a, obj.a)
+
+ def test_object_with_slots(self):
+ obj = WithSlots()
+ obj.a = 1
+ self.assertRaises(TypeError, self.dumps, obj, 0)
+ self.assertRaises(TypeError, self.dumps, obj, 1)
+ for proto in protocols[2:]:
+ with self.subTest(proto=proto):
+ unpickled = self.loads(self.dumps(obj, proto))
+ self.assertEqual(unpickled.a, obj.a)
+ self.assertNotHasAttr(unpickled, 'b')
+
+ obj = WithSlotsSubclass()
+ obj.a = 1
+ obj.c = 2
+ self.assertRaises(TypeError, self.dumps, obj, 0)
+ self.assertRaises(TypeError, self.dumps, obj, 1)
+ for proto in protocols[2:]:
+ with self.subTest(proto=proto):
+ unpickled = self.loads(self.dumps(obj, proto))
+ self.assertEqual(unpickled.a, obj.a)
+ self.assertEqual(unpickled.c, obj.c)
+ self.assertNotHasAttr(unpickled, 'b')
+
+ obj = WithSlotsAndDict()
+ obj.a = 1
+ obj.c = 2
+ self.assertRaises(TypeError, self.dumps, obj, 0)
+ self.assertRaises(TypeError, self.dumps, obj, 1)
+ for proto in protocols[2:]:
+ with self.subTest(proto=proto):
+ unpickled = self.loads(self.dumps(obj, proto))
+ self.assertEqual(unpickled.a, obj.a)
+ self.assertEqual(unpickled.c, obj.c)
+ self.assertEqual(unpickled.__dict__, obj.__dict__)
+ self.assertNotHasAttr(unpickled, 'b')
+
+ def test_object_with_private_attrs(self):
+ obj = WithPrivateAttrs(1)
+ for proto in protocols:
+ with self.subTest(proto=proto):
+ unpickled = self.loads(self.dumps(obj, proto))
+ self.assertEqual(unpickled.get(), obj.get())
+
+ obj = WithPrivateAttrsSubclass(1, 2)
+ for proto in protocols:
+ with self.subTest(proto=proto):
+ unpickled = self.loads(self.dumps(obj, proto))
+ self.assertEqual(unpickled.get(), obj.get())
+ self.assertEqual(unpickled.get2(), obj.get2())
+
+ def test_object_with_private_slots(self):
+ obj = WithPrivateSlots(1)
+ self.assertRaises(TypeError, self.dumps, obj, 0)
+ self.assertRaises(TypeError, self.dumps, obj, 1)
+ for proto in protocols[2:]:
+ with self.subTest(proto=proto):
+ unpickled = self.loads(self.dumps(obj, proto))
+ self.assertEqual(unpickled.get(), obj.get())
+
+ obj = WithPrivateSlotsSubclass(1, 2)
+ self.assertRaises(TypeError, self.dumps, obj, 0)
+ self.assertRaises(TypeError, self.dumps, obj, 1)
+ for proto in protocols[2:]:
+ with self.subTest(proto=proto):
+ unpickled = self.loads(self.dumps(obj, proto))
+ self.assertEqual(unpickled.get(), obj.get())
+ self.assertEqual(unpickled.get2(), obj.get2())
+
def test_compat_pickle(self):
if self.py_version < (3, 4):
self.skipTest("doesn't work in Python < 3.4'")