@@ -739,6 +739,58 @@ def test_newobj_list_slots(self):
739739 self .assertEqual (x .foo , y .foo )
740740 self .assertEqual (x .bar , y .bar )
741741
742+ def test_reduce_overrides_default_reduce_ex (self ):
743+ for proto in 0 , 1 , 2 :
744+ x = REX_one ()
745+ self .assertEqual (x ._reduce_called , 0 )
746+ s = self .dumps (x , proto )
747+ self .assertEqual (x ._reduce_called , 1 )
748+ y = self .loads (s )
749+ self .assertEqual (y ._reduce_called , 0 )
750+
751+ def test_reduce_ex_called (self ):
752+ for proto in 0 , 1 , 2 :
753+ x = REX_two ()
754+ self .assertEqual (x ._proto , None )
755+ s = self .dumps (x , proto )
756+ self .assertEqual (x ._proto , proto )
757+ y = self .loads (s )
758+ self .assertEqual (y ._proto , None )
759+
760+ def test_reduce_ex_overrides_reduce (self ):
761+ for proto in 0 , 1 , 2 :
762+ x = REX_three ()
763+ self .assertEqual (x ._proto , None )
764+ s = self .dumps (x , proto )
765+ self .assertEqual (x ._proto , proto )
766+ y = self .loads (s )
767+ self .assertEqual (y ._proto , None )
768+
769+ # Test classes for reduce_ex
770+
771+ class REX_one (object ):
772+ _reduce_called = 0
773+ def __reduce__ (self ):
774+ self ._reduce_called = 1
775+ return REX_one , ()
776+ # No __reduce_ex__ here, but inheriting it from object
777+
778+ class REX_two (object ):
779+ _proto = None
780+ def __reduce_ex__ (self , proto ):
781+ self ._proto = proto
782+ return REX_two , ()
783+ # No __reduce__ here, but inheriting it from object
784+
785+ class REX_three (object ):
786+ _proto = None
787+ def __reduce_ex__ (self , proto ):
788+ self ._proto = proto
789+ return REX_two , ()
790+ def __reduce__ (self ):
791+ raise TestFailed , "This __reduce__ shouldn't be called"
792+
793+ # Test classes for newobj
742794
743795class MyInt (int ):
744796 sample = 1
0 commit comments