@@ -415,6 +415,86 @@ class SubDict(dict):
415415 self .assertTrue (_testcapi .mapping_has_key (dct2 , 'a' ))
416416 self .assertFalse (_testcapi .mapping_has_key (dct2 , 'b' ))
417417
418+ def test_sequence_set_slice (self ):
419+ # Correct case:
420+ data = [1 , 2 , 3 , 4 , 5 ]
421+ data_copy = data .copy ()
422+
423+ _testcapi .sequence_set_slice (data , 1 , 3 , [8 , 9 ])
424+ data_copy [1 :3 ] = [8 , 9 ]
425+ self .assertEqual (data , data_copy )
426+ self .assertEqual (data , [1 , 8 , 9 , 4 , 5 ])
427+
428+ # Custom class:
429+ class Custom :
430+ def __setitem__ (self , index , value ):
431+ self .index = index
432+ self .value = value
433+
434+ c = Custom ()
435+ _testcapi .sequence_set_slice (c , 0 , 5 , 'abc' )
436+ self .assertEqual (c .index , slice (0 , 5 ))
437+ self .assertEqual (c .value , 'abc' )
438+
439+ # Immutable sequences must raise:
440+ bad_seq1 = (1 , 2 , 3 , 4 )
441+ with self .assertRaises (TypeError ):
442+ _testcapi .sequence_set_slice (bad_seq1 , 1 , 3 , (8 , 9 ))
443+ self .assertEqual (bad_seq1 , (1 , 2 , 3 , 4 ))
444+
445+ bad_seq2 = 'abcd'
446+ with self .assertRaises (TypeError ):
447+ _testcapi .sequence_set_slice (bad_seq2 , 1 , 3 , 'xy' )
448+ self .assertEqual (bad_seq2 , 'abcd' )
449+
450+ # Not a sequence:
451+ with self .assertRaises (TypeError ):
452+ _testcapi .sequence_set_slice (None , 1 , 3 , 'xy' )
453+
454+ mapping = {1 : 'a' , 2 : 'b' , 3 : 'c' }
455+ with self .assertRaises (TypeError ):
456+ _testcapi .sequence_set_slice (mapping , 1 , 3 , 'xy' )
457+ self .assertEqual (mapping , {1 : 'a' , 2 : 'b' , 3 : 'c' })
458+
459+ def test_sequence_del_slice (self ):
460+ # Correct case:
461+ data = [1 , 2 , 3 , 4 , 5 ]
462+ data_copy = data .copy ()
463+
464+ _testcapi .sequence_del_slice (data , 1 , 3 )
465+ del data_copy [1 :3 ]
466+ self .assertEqual (data , data_copy )
467+ self .assertEqual (data , [1 , 4 , 5 ])
468+
469+ # Custom class:
470+ class Custom :
471+ def __delitem__ (self , index ):
472+ self .index = index
473+
474+ c = Custom ()
475+ _testcapi .sequence_del_slice (c , 0 , 5 )
476+ self .assertEqual (c .index , slice (0 , 5 ))
477+
478+ # Immutable sequences must raise:
479+ bad_seq1 = (1 , 2 , 3 , 4 )
480+ with self .assertRaises (TypeError ):
481+ _testcapi .sequence_del_slice (bad_seq1 , 1 , 3 )
482+ self .assertEqual (bad_seq1 , (1 , 2 , 3 , 4 ))
483+
484+ bad_seq2 = 'abcd'
485+ with self .assertRaises (TypeError ):
486+ _testcapi .sequence_del_slice (bad_seq2 , 1 , 3 )
487+ self .assertEqual (bad_seq2 , 'abcd' )
488+
489+ # Not a sequence:
490+ with self .assertRaises (TypeError ):
491+ _testcapi .sequence_del_slice (None , 1 , 3 )
492+
493+ mapping = {1 : 'a' , 2 : 'b' , 3 : 'c' }
494+ with self .assertRaises (TypeError ):
495+ _testcapi .sequence_del_slice (mapping , 1 , 3 )
496+ self .assertEqual (mapping , {1 : 'a' , 2 : 'b' , 3 : 'c' })
497+
418498 @unittest .skipUnless (hasattr (_testcapi , 'negative_refcount' ),
419499 'need _testcapi.negative_refcount' )
420500 def test_negative_refcount (self ):
0 commit comments