@@ -364,7 +364,89 @@ def __getitem__(self, i):
364364 d = {"one" : 1 , "two" : 2 , "three" : 3 }
365365 self .assertEqual (self .func (add , d ), "" .join (d .keys ()))
366366
367-
367+ class TestCmpToKey (unittest .TestCase ):
368+ def test_cmp_to_key (self ):
369+ def mycmp (x , y ):
370+ return y - x
371+ self .assertEqual (sorted (range (5 ), key = functools .cmp_to_key (mycmp )),
372+ [4 , 3 , 2 , 1 , 0 ])
373+
374+ def test_hash (self ):
375+ def mycmp (x , y ):
376+ return y - x
377+ key = functools .cmp_to_key (mycmp )
378+ k = key (10 )
379+ self .assertRaises (TypeError , hash (k ))
380+
381+ class TestTotalOrdering (unittest .TestCase ):
382+
383+ def test_total_ordering_lt (self ):
384+ @functools .total_ordering
385+ class A :
386+ def __init__ (self , value ):
387+ self .value = value
388+ def __lt__ (self , other ):
389+ return self .value < other .value
390+ self .assert_ (A (1 ) < A (2 ))
391+ self .assert_ (A (2 ) > A (1 ))
392+ self .assert_ (A (1 ) <= A (2 ))
393+ self .assert_ (A (2 ) >= A (1 ))
394+ self .assert_ (A (2 ) <= A (2 ))
395+ self .assert_ (A (2 ) >= A (2 ))
396+
397+ def test_total_ordering_le (self ):
398+ @functools .total_ordering
399+ class A :
400+ def __init__ (self , value ):
401+ self .value = value
402+ def __le__ (self , other ):
403+ return self .value <= other .value
404+ self .assert_ (A (1 ) < A (2 ))
405+ self .assert_ (A (2 ) > A (1 ))
406+ self .assert_ (A (1 ) <= A (2 ))
407+ self .assert_ (A (2 ) >= A (1 ))
408+ self .assert_ (A (2 ) <= A (2 ))
409+ self .assert_ (A (2 ) >= A (2 ))
410+
411+ def test_total_ordering_gt (self ):
412+ @functools .total_ordering
413+ class A :
414+ def __init__ (self , value ):
415+ self .value = value
416+ def __gt__ (self , other ):
417+ return self .value > other .value
418+ self .assert_ (A (1 ) < A (2 ))
419+ self .assert_ (A (2 ) > A (1 ))
420+ self .assert_ (A (1 ) <= A (2 ))
421+ self .assert_ (A (2 ) >= A (1 ))
422+ self .assert_ (A (2 ) <= A (2 ))
423+ self .assert_ (A (2 ) >= A (2 ))
424+
425+ def test_total_ordering_ge (self ):
426+ @functools .total_ordering
427+ class A :
428+ def __init__ (self , value ):
429+ self .value = value
430+ def __ge__ (self , other ):
431+ return self .value >= other .value
432+ self .assert_ (A (1 ) < A (2 ))
433+ self .assert_ (A (2 ) > A (1 ))
434+ self .assert_ (A (1 ) <= A (2 ))
435+ self .assert_ (A (2 ) >= A (1 ))
436+ self .assert_ (A (2 ) <= A (2 ))
437+ self .assert_ (A (2 ) >= A (2 ))
438+
439+ def test_total_ordering_no_overwrite (self ):
440+ # new methods should not overwrite existing
441+ @functools .total_ordering
442+ class A (int ):
443+ raise Exception ()
444+ self .assert_ (A (1 ) < A (2 ))
445+ self .assert_ (A (2 ) > A (1 ))
446+ self .assert_ (A (1 ) <= A (2 ))
447+ self .assert_ (A (2 ) >= A (1 ))
448+ self .assert_ (A (2 ) <= A (2 ))
449+ self .assert_ (A (2 ) >= A (2 ))
368450
369451
370452def test_main (verbose = None ):
0 commit comments