@@ -1168,6 +1168,58 @@ def test_getitem_error(self):
11681168 with self .assertRaisesRegex (TypeError , msg ):
11691169 b ['a' ]
11701170
1171+ def test_binary_slice (self ):
1172+ def binary_slice (data , start , stop ):
1173+ return data [start :stop ]
1174+
1175+ data = b'0123456789'
1176+ indices = (None , 0 , 1 , 5 , 10 , 20 , - 1 , - 5 , - 10 , - 20 ,
1177+ sys .maxsize , - sys .maxsize - 1 , 10 ** 100 , - 10 ** 100 )
1178+ for start in indices :
1179+ for stop in indices :
1180+ with self .subTest (start = start , stop = stop ):
1181+ self .assertEqual (binary_slice (data , start , stop ),
1182+ data [slice (start , stop )])
1183+
1184+ self .assertIs (binary_slice (data , None , None ), data )
1185+
1186+ calls = []
1187+
1188+ class Index :
1189+ def __init__ (self , name , value ):
1190+ self .name = name
1191+ self .value = value
1192+
1193+ def __index__ (self ):
1194+ calls .append (self .name )
1195+ return self .value
1196+
1197+ self .assertEqual (binary_slice (data , Index ('start' , 2 ),
1198+ Index ('stop' , 5 )), b'234' )
1199+ self .assertEqual (calls , ['start' , 'stop' ])
1200+
1201+ calls .clear ()
1202+
1203+ class BadIndex :
1204+ def __index__ (self ):
1205+ calls .append ('start' )
1206+ raise ValueError ('bad index' )
1207+
1208+ with self .assertRaisesRegex (ValueError , 'bad index' ):
1209+ binary_slice (data , BadIndex (), Index ('stop' , 5 ))
1210+ self .assertEqual (calls , ['start' ])
1211+
1212+ msg = "slice indices must be integers or have an __index__ method"
1213+ with self .assertRaisesRegex (TypeError , msg ):
1214+ binary_slice (data , 1.5 , 5 )
1215+
1216+ class SliceOverride (bytes ):
1217+ def __getitem__ (self , key ):
1218+ return key
1219+
1220+ key = binary_slice (SliceOverride (data ), 2 , 5 )
1221+ self .assertEqual (key , slice (2 , 5 ))
1222+
11711223 def test_buffer_is_readonly (self ):
11721224 fd = os .open (__file__ , os .O_RDONLY )
11731225 with open (fd , "rb" , buffering = 0 ) as f :
0 commit comments