diff options
author | Raymond Hettinger <python@rcn.com> | 2010-04-04 22:24:03 +0000 |
---|---|---|
committer | Raymond Hettinger <python@rcn.com> | 2010-04-04 22:24:03 +0000 |
commit | 06bc0b6d2ef4fb132bfe03b24ee1b448d786f965 (patch) | |
tree | 4840bf693602a17956e3fb476da850bf283a180c | |
parent | b1affc517f67037fcd9027cf92fda3424b80c1ea (diff) | |
download | cpython-git-06bc0b6d2ef4fb132bfe03b24ee1b448d786f965.tar.gz |
Add tests for functools.total_ordering.
-rw-r--r-- | Doc/reference/datamodel.rst | 3 | ||||
-rw-r--r-- | Lib/test/test_functools.py | 69 |
2 files changed, 70 insertions, 2 deletions
diff --git a/Doc/reference/datamodel.rst b/Doc/reference/datamodel.rst index 25427044e2..2dcaed2f5b 100644 --- a/Doc/reference/datamodel.rst +++ b/Doc/reference/datamodel.rst @@ -1353,8 +1353,7 @@ Basic customization Arguments to rich comparison methods are never coerced. To automatically generate ordering operations from a single root operation, - see the `Total Ordering recipe in the ASPN cookbook - <http://code.activestate.com/recipes/576529/>`_\. + see :func:`functools.total_ordering`. .. method:: object.__cmp__(self, other) diff --git a/Lib/test/test_functools.py b/Lib/test/test_functools.py index 44992b8c5b..1629f7ce4e 100644 --- a/Lib/test/test_functools.py +++ b/Lib/test/test_functools.py @@ -345,6 +345,75 @@ class TestCmpToKey(unittest.TestCase): self.assertEqual(sorted(range(5), key=functools.cmp_to_key(mycmp)), [4, 3, 2, 1, 0]) +class TestTotalOrdering(unittest.TestCase): + + def test_total_ordering_lt(self): + @functools.total_ordering + class A: + def __init__(self, value): + self.value = value + def __lt__(self, other): + return self.value < other.value + self.assert_(A(1) < A(2)) + self.assert_(A(2) > A(1)) + self.assert_(A(1) <= A(2)) + self.assert_(A(2) >= A(1)) + self.assert_(A(2) <= A(2)) + self.assert_(A(2) >= A(2)) + + def test_total_ordering_le(self): + @functools.total_ordering + class A: + def __init__(self, value): + self.value = value + def __le__(self, other): + return self.value <= other.value + self.assert_(A(1) < A(2)) + self.assert_(A(2) > A(1)) + self.assert_(A(1) <= A(2)) + self.assert_(A(2) >= A(1)) + self.assert_(A(2) <= A(2)) + self.assert_(A(2) >= A(2)) + + def test_total_ordering_gt(self): + @functools.total_ordering + class A: + def __init__(self, value): + self.value = value + def __gt__(self, other): + return self.value > other.value + self.assert_(A(1) < A(2)) + self.assert_(A(2) > A(1)) + self.assert_(A(1) <= A(2)) + self.assert_(A(2) >= A(1)) + self.assert_(A(2) <= A(2)) + self.assert_(A(2) >= A(2)) + + def test_total_ordering_ge(self): + @functools.total_ordering + class A: + def __init__(self, value): + self.value = value + def __ge__(self, other): + return self.value >= other.value + self.assert_(A(1) < A(2)) + self.assert_(A(2) > A(1)) + self.assert_(A(1) <= A(2)) + self.assert_(A(2) >= A(1)) + self.assert_(A(2) <= A(2)) + self.assert_(A(2) >= A(2)) + + def test_total_ordering_no_overwrite(self): + # new methods should not overwrite existing + @functools.total_ordering + class A(int): + pass + self.assert_(A(1) < A(2)) + self.assert_(A(2) > A(1)) + self.assert_(A(1) <= A(2)) + self.assert_(A(2) >= A(1)) + self.assert_(A(2) <= A(2)) + self.assert_(A(2) >= A(2)) def test_main(verbose=None): test_classes = ( |