@@ -48,8 +48,69 @@ def test_id_comparisons(self):
4848 def test_ne_defaults_to_not_eq (self ):
4949 a = Cmp (1 )
5050 b = Cmp (1 )
51- self .assertTrue (a == b )
52- self .assertFalse (a != b )
51+ c = Cmp (2 )
52+ self .assertIs (a == b , True )
53+ self .assertIs (a != b , False )
54+ self .assertIs (a != c , True )
55+
56+ def test_ne_high_priority (self ):
57+ """object.__ne__() should allow reflected __ne__() to be tried"""
58+ calls = []
59+ class Left :
60+ # Inherits object.__ne__()
61+ def __eq__ (* args ):
62+ calls .append ('Left.__eq__' )
63+ return NotImplemented
64+ class Right :
65+ def __eq__ (* args ):
66+ calls .append ('Right.__eq__' )
67+ return NotImplemented
68+ def __ne__ (* args ):
69+ calls .append ('Right.__ne__' )
70+ return NotImplemented
71+ Left () != Right ()
72+ self .assertSequenceEqual (calls , ['Left.__eq__' , 'Right.__ne__' ])
73+
74+ def test_ne_low_priority (self ):
75+ """object.__ne__() should not invoke reflected __eq__()"""
76+ calls = []
77+ class Base :
78+ # Inherits object.__ne__()
79+ def __eq__ (* args ):
80+ calls .append ('Base.__eq__' )
81+ return NotImplemented
82+ class Derived (Base ): # Subclassing forces higher priority
83+ def __eq__ (* args ):
84+ calls .append ('Derived.__eq__' )
85+ return NotImplemented
86+ def __ne__ (* args ):
87+ calls .append ('Derived.__ne__' )
88+ return NotImplemented
89+ Base () != Derived ()
90+ self .assertSequenceEqual (calls , ['Derived.__ne__' , 'Base.__eq__' ])
91+
92+ def test_other_delegation (self ):
93+ """No default delegation between operations except __ne__()"""
94+ ops = (
95+ ('__eq__' , lambda a , b : a == b ),
96+ ('__lt__' , lambda a , b : a < b ),
97+ ('__le__' , lambda a , b : a <= b ),
98+ ('__gt__' , lambda a , b : a > b ),
99+ ('__ge__' , lambda a , b : a >= b ),
100+ )
101+ for name , func in ops :
102+ with self .subTest (name ):
103+ def unexpected (* args ):
104+ self .fail ('Unexpected operator method called' )
105+ class C :
106+ __ne__ = unexpected
107+ for other , _ in ops :
108+ if other != name :
109+ setattr (C , other , unexpected )
110+ if name == '__eq__' :
111+ self .assertIs (func (C (), object ()), False )
112+ else :
113+ self .assertRaises (TypeError , func , C (), object ())
53114
54115 def test_issue_1393 (self ):
55116 x = lambda : None
0 commit comments