diff options
Diffstat (limited to 'Lib')
-rw-r--r-- | Lib/test/test_functools.py | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/Lib/test/test_functools.py b/Lib/test/test_functools.py index d527e31..abbd50a 100644 --- a/Lib/test/test_functools.py +++ b/Lib/test/test_functools.py @@ -1049,6 +1049,73 @@ class TestTotalOrdering(unittest.TestCase): class A: pass + def test_notimplemented(self): + # Verify NotImplemented results are correctly handled + @functools.total_ordering + class ImplementsLessThan: + def __init__(self, value): + self.value = value + def __eq__(self, other): + if isinstance(other, ImplementsLessThan): + return self.value == other.value + return False + def __lt__(self, other): + if isinstance(other, ImplementsLessThan): + return self.value < other.value + return NotImplemented + + @functools.total_ordering + class ImplementsLessThanEqualTo: + def __init__(self, value): + self.value = value + def __eq__(self, other): + if isinstance(other, ImplementsLessThanEqualTo): + return self.value == other.value + return False + def __le__(self, other): + if isinstance(other, ImplementsLessThanEqualTo): + return self.value <= other.value + return NotImplemented + + @functools.total_ordering + class ImplementsGreaterThan: + def __init__(self, value): + self.value = value + def __eq__(self, other): + if isinstance(other, ImplementsGreaterThan): + return self.value == other.value + return False + def __gt__(self, other): + if isinstance(other, ImplementsGreaterThan): + return self.value > other.value + return NotImplemented + + @functools.total_ordering + class ImplementsGreaterThanEqualTo: + def __init__(self, value): + self.value = value + def __eq__(self, other): + if isinstance(other, ImplementsGreaterThanEqualTo): + return self.value == other.value + return False + def __ge__(self, other): + if isinstance(other, ImplementsGreaterThanEqualTo): + return self.value >= other.value + return NotImplemented + + self.assertIs(ImplementsLessThan(1).__le__(1), NotImplemented) + self.assertIs(ImplementsLessThan(1).__gt__(1), NotImplemented) + self.assertIs(ImplementsLessThan(1).__ge__(1), NotImplemented) + self.assertIs(ImplementsLessThanEqualTo(1).__lt__(1), NotImplemented) + self.assertIs(ImplementsLessThanEqualTo(1).__gt__(1), NotImplemented) + self.assertIs(ImplementsLessThanEqualTo(1).__ge__(1), NotImplemented) + self.assertIs(ImplementsGreaterThan(1).__lt__(1), NotImplemented) + self.assertIs(ImplementsGreaterThan(1).__gt__(1), NotImplemented) + self.assertIs(ImplementsGreaterThan(1).__ge__(1), NotImplemented) + self.assertIs(ImplementsGreaterThanEqualTo(1).__lt__(1), NotImplemented) + self.assertIs(ImplementsGreaterThanEqualTo(1).__le__(1), NotImplemented) + self.assertIs(ImplementsGreaterThanEqualTo(1).__gt__(1), NotImplemented) + def test_type_error_when_not_implemented(self): # bug 10042; ensure stack overflow does not occur # when decorated types return NotImplemented |