diff options
author | Serhiy Storchaka <storchaka@gmail.com> | 2015-01-26 08:04:15 (GMT) |
---|---|---|
committer | Serhiy Storchaka <storchaka@gmail.com> | 2015-01-26 08:04:15 (GMT) |
commit | 34af5023fc1e74c2d6a7537a11148885c84d9cb4 (patch) | |
tree | 7d0798f2543f647ac94acef12bd9ebc71fe6dd29 /Lib/test | |
parent | 4e1942bcd8a3904047bf96a16305f0e1e4736b5c (diff) | |
parent | f4b7a02e932671c6e54e6b48340173cc859ab4c0 (diff) | |
download | cpython-34af5023fc1e74c2d6a7537a11148885c84d9cb4.zip cpython-34af5023fc1e74c2d6a7537a11148885c84d9cb4.tar.gz cpython-34af5023fc1e74c2d6a7537a11148885c84d9cb4.tar.bz2 |
Issue #21408: The default __ne__() now returns NotImplemented if __eq__()
returned NotImplemented. Removed incorrect implementations of __ne__().
Diffstat (limited to 'Lib/test')
-rw-r--r-- | Lib/test/test_binop.py | 4 | ||||
-rw-r--r-- | Lib/test/test_compare.py | 65 |
2 files changed, 63 insertions, 6 deletions
diff --git a/Lib/test/test_binop.py b/Lib/test/test_binop.py index 8417916..9c4c18e 100644 --- a/Lib/test/test_binop.py +++ b/Lib/test/test_binop.py @@ -194,10 +194,6 @@ class Rat(object): return float(self) == other return NotImplemented - def __ne__(self, other): - """Compare two Rats for inequality.""" - return not self == other - class RatTestCase(unittest.TestCase): """Unit tests for Rat class and its support utilities.""" diff --git a/Lib/test/test_compare.py b/Lib/test/test_compare.py index ee3794a..a663832 100644 --- a/Lib/test/test_compare.py +++ b/Lib/test/test_compare.py @@ -48,8 +48,69 @@ class ComparisonTest(unittest.TestCase): def test_ne_defaults_to_not_eq(self): a = Cmp(1) b = Cmp(1) - self.assertTrue(a == b) - self.assertFalse(a != b) + c = Cmp(2) + self.assertIs(a == b, True) + self.assertIs(a != b, False) + self.assertIs(a != c, True) + + def test_ne_high_priority(self): + """object.__ne__() should allow reflected __ne__() to be tried""" + calls = [] + class Left: + # Inherits object.__ne__() + def __eq__(*args): + calls.append('Left.__eq__') + return NotImplemented + class Right: + def __eq__(*args): + calls.append('Right.__eq__') + return NotImplemented + def __ne__(*args): + calls.append('Right.__ne__') + return NotImplemented + Left() != Right() + self.assertSequenceEqual(calls, ['Left.__eq__', 'Right.__ne__']) + + def test_ne_low_priority(self): + """object.__ne__() should not invoke reflected __eq__()""" + calls = [] + class Base: + # Inherits object.__ne__() + def __eq__(*args): + calls.append('Base.__eq__') + return NotImplemented + class Derived(Base): # Subclassing forces higher priority + def __eq__(*args): + calls.append('Derived.__eq__') + return NotImplemented + def __ne__(*args): + calls.append('Derived.__ne__') + return NotImplemented + Base() != Derived() + self.assertSequenceEqual(calls, ['Derived.__ne__', 'Base.__eq__']) + + def test_other_delegation(self): + """No default delegation between operations except __ne__()""" + ops = ( + ('__eq__', lambda a, b: a == b), + ('__lt__', lambda a, b: a < b), + ('__le__', lambda a, b: a <= b), + ('__gt__', lambda a, b: a > b), + ('__ge__', lambda a, b: a >= b), + ) + for name, func in ops: + with self.subTest(name): + def unexpected(*args): + self.fail('Unexpected operator method called') + class C: + __ne__ = unexpected + for other, _ in ops: + if other != name: + setattr(C, other, unexpected) + if name == '__eq__': + self.assertIs(func(C(), object()), False) + else: + self.assertRaises(TypeError, func, C(), object()) def test_issue_1393(self): x = lambda: None |