@@ -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