summaryrefslogtreecommitdiff
path: root/Lib/test/test_fractions.py
diff options
context:
space:
mode:
Diffstat (limited to 'Lib/test/test_fractions.py')
-rw-r--r--Lib/test/test_fractions.py37
1 files changed, 37 insertions, 0 deletions
diff --git a/Lib/test/test_fractions.py b/Lib/test/test_fractions.py
index 7cf7899932..4649a34bcc 100644
--- a/Lib/test/test_fractions.py
+++ b/Lib/test/test_fractions.py
@@ -6,6 +6,7 @@ import math
import numbers
import operator
import fractions
+import functools
import sys
import unittest
import warnings
@@ -322,6 +323,42 @@ class FractionTest(unittest.TestCase):
self.assertTypedEquals(0.1+0j, complex(F(1,10)))
+ def testBoolGuarateesBoolReturn(self):
+ # Ensure that __bool__ is used on numerator which guarantees a bool
+ # return. See also bpo-39274.
+ @functools.total_ordering
+ class CustomValue:
+ denominator = 1
+
+ def __init__(self, value):
+ self.value = value
+
+ def __bool__(self):
+ return bool(self.value)
+
+ @property
+ def numerator(self):
+ # required to preserve `self` during instantiation
+ return self
+
+ def __eq__(self, other):
+ raise AssertionError("Avoid comparisons in Fraction.__bool__")
+
+ __lt__ = __eq__
+
+ # We did not implement all abstract methods, so register:
+ numbers.Rational.register(CustomValue)
+
+ numerator = CustomValue(1)
+ r = F(numerator)
+ # ensure the numerator was not lost during instantiation:
+ self.assertIs(r.numerator, numerator)
+ self.assertIs(bool(r), True)
+
+ numerator = CustomValue(0)
+ r = F(numerator)
+ self.assertIs(bool(r), False)
+
def testRound(self):
self.assertTypedEquals(F(-200), round(F(-150), -2))
self.assertTypedEquals(F(-200), round(F(-250), -2))