mirror of
https://github.com/python/cpython
synced 2026-09-29 12:10:30 +03:00
bpo-46388: Test NotImplemented code path for functools.total_ordering (GH-30616)
This commit is contained in:
parent
d02c5e9b55
commit
0a28118324
1 changed files with 67 additions and 0 deletions
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue