@@ -4118,6 +4118,82 @@ def test_c_methods(self):
41184118 with self.subTest(proto=proto, descr=descr):
41194119 self.assertRaises(TypeError, self.dumps, descr, proto)
41204120
4121+ def test_object_with_attrs(self):
4122+ obj = Object()
4123+ obj.a = 1
4124+ for proto in protocols:
4125+ with self.subTest(proto=proto):
4126+ unpickled = self.loads(self.dumps(obj, proto))
4127+ self.assertEqual(unpickled.a, obj.a)
4128+
4129+ def test_object_with_slots(self):
4130+ obj = WithSlots()
4131+ obj.a = 1
4132+ self.assertRaises(TypeError, self.dumps, obj, 0)
4133+ self.assertRaises(TypeError, self.dumps, obj, 1)
4134+ for proto in protocols[2:]:
4135+ with self.subTest(proto=proto):
4136+ unpickled = self.loads(self.dumps(obj, proto))
4137+ self.assertEqual(unpickled.a, obj.a)
4138+ self.assertNotHasAttr(unpickled, 'b')
4139+
4140+ obj = WithSlotsSubclass()
4141+ obj.a = 1
4142+ obj.c = 2
4143+ self.assertRaises(TypeError, self.dumps, obj, 0)
4144+ self.assertRaises(TypeError, self.dumps, obj, 1)
4145+ for proto in protocols[2:]:
4146+ with self.subTest(proto=proto):
4147+ unpickled = self.loads(self.dumps(obj, proto))
4148+ self.assertEqual(unpickled.a, obj.a)
4149+ self.assertEqual(unpickled.c, obj.c)
4150+ self.assertNotHasAttr(unpickled, 'b')
4151+
4152+ obj = WithSlotsAndDict()
4153+ obj.a = 1
4154+ obj.c = 2
4155+ self.assertRaises(TypeError, self.dumps, obj, 0)
4156+ self.assertRaises(TypeError, self.dumps, obj, 1)
4157+ for proto in protocols[2:]:
4158+ with self.subTest(proto=proto):
4159+ unpickled = self.loads(self.dumps(obj, proto))
4160+ self.assertEqual(unpickled.a, obj.a)
4161+ self.assertEqual(unpickled.c, obj.c)
4162+ self.assertEqual(unpickled.__dict__, obj.__dict__)
4163+ self.assertNotHasAttr(unpickled, 'b')
4164+
4165+ def test_object_with_private_attrs(self):
4166+ obj = WithPrivateAttrs(1)
4167+ for proto in protocols:
4168+ with self.subTest(proto=proto):
4169+ unpickled = self.loads(self.dumps(obj, proto))
4170+ self.assertEqual(unpickled.get(), obj.get())
4171+
4172+ obj = WithPrivateAttrsSubclass(1, 2)
4173+ for proto in protocols:
4174+ with self.subTest(proto=proto):
4175+ unpickled = self.loads(self.dumps(obj, proto))
4176+ self.assertEqual(unpickled.get(), obj.get())
4177+ self.assertEqual(unpickled.get2(), obj.get2())
4178+
4179+ def test_object_with_private_slots(self):
4180+ obj = WithPrivateSlots(1)
4181+ self.assertRaises(TypeError, self.dumps, obj, 0)
4182+ self.assertRaises(TypeError, self.dumps, obj, 1)
4183+ for proto in protocols[2:]:
4184+ with self.subTest(proto=proto):
4185+ unpickled = self.loads(self.dumps(obj, proto))
4186+ self.assertEqual(unpickled.get(), obj.get())
4187+
4188+ obj = WithPrivateSlotsSubclass(1, 2)
4189+ self.assertRaises(TypeError, self.dumps, obj, 0)
4190+ self.assertRaises(TypeError, self.dumps, obj, 1)
4191+ for proto in protocols[2:]:
4192+ with self.subTest(proto=proto):
4193+ unpickled = self.loads(self.dumps(obj, proto))
4194+ self.assertEqual(unpickled.get(), obj.get())
4195+ self.assertEqual(unpickled.get2(), obj.get2())
4196+
41214197 def test_compat_pickle(self):
41224198 if self.py_version < (3, 4):
41234199 self.skipTest("doesn't work in Python < 3.4'")
0 commit comments