22import sys
33import textwrap
44from test import list_tests , support
5- from test .support import cpython_only
5+ from test .support import ALWAYS_EQ , NEVER_EQ , cpython_only
66from test .support .script_helper import assert_python_failure , assert_python_ok
77import pickle
88import unittest
@@ -331,6 +331,66 @@ def test_preallocation(self):
331331 self .assertEqual (iter_size , sys .getsizeof (list ([0 ] * 10 )))
332332 self .assertEqual (iter_size , sys .getsizeof (list (range (10 ))))
333333
334+ def test_discard (self ):
335+ a = [0 , 0 , 1 ]
336+ a .discard (1 )
337+ self .assertEqual (a , [0 , 0 ])
338+ a .discard (0 )
339+ self .assertEqual (a , [0 ])
340+ a .discard (0 )
341+ self .assertEqual (a , [])
342+ a .discard (0 )
343+ self .assertEqual (a , [])
344+
345+ self .assertRaises (TypeError , a .discard )
346+
347+ a = [1 , 2 ]
348+ a .discard (NEVER_EQ )
349+ self .assertEqual (a , [1 , 2 ])
350+ a .discard (ALWAYS_EQ )
351+ self .assertEqual (a , [2 ])
352+ a = [ALWAYS_EQ ]
353+ a .discard (1 )
354+ self .assertEqual (a , [])
355+ a = [ALWAYS_EQ ]
356+ a .discard (NEVER_EQ )
357+ self .assertEqual (a , [])
358+ a = [NEVER_EQ ]
359+ a .discard (ALWAYS_EQ )
360+ self .assertEqual (a , [NEVER_EQ ])
361+
362+ class BadExc (Exception ):
363+ pass
364+
365+ class BadCmp :
366+ def __eq__ (self , other ):
367+ if other == 2 :
368+ raise BadExc ()
369+ return False
370+
371+ a = [0 , 1 , 2 , 3 ]
372+ self .assertRaises (BadExc , a .discard , BadCmp ())
373+
374+ class BadCmp2 :
375+ def __eq__ (self , other ):
376+ raise BadExc ()
377+
378+ d = list ('abcdefghcij' )
379+ d .discard ('c' )
380+ self .assertEqual (d , list ('abdefghcij' ))
381+ d .discard ('c' )
382+ self .assertEqual (d , list ('abdefghij' ))
383+ d .discard ('c' )
384+ self .assertEqual (d , list ('abdefghij' ))
385+
386+ # Handle comparison errors
387+ d = ['a' , 'b' , BadCmp2 (), 'c' ]
388+ e = list (d )
389+ self .assertRaises (BadExc , d .discard , 'c' )
390+ for x , y in zip (d , e ):
391+ # verify that original order and values are retained.
392+ self .assertIs (x , y )
393+
334394 def test_count_index_remove_crashes (self ):
335395 # bpo-38610: The count(), index(), and remove() methods were not
336396 # holding strong references to list elements while calling
@@ -356,6 +416,9 @@ def __eq__(self, other):
356416 with self .assertRaises (ValueError ):
357417 lst .remove (lst )
358418
419+ lst = L ([X ()])
420+ lst .discard (lst )
421+
359422 # bpo-39453: list.__contains__ was not holding strong references
360423 # to list elements while calling PyObject_RichCompareBool().
361424 lst = [X (), X ()]
0 commit comments