1edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep"""Tests for Lib/fractions.py."""
2edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
3edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoepfrom decimal import Decimal
4edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoepfrom test.test_support import run_unittest
5edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoepimport math
6edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoepimport numbers
7edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoepimport operator
8edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoepimport fractions
9edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoepimport sys
10edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoepimport unittest
11edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoepfrom copy import copy, deepcopy
12edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoepfrom cPickle import dumps, loads
13edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander StoepF = fractions.Fraction
14edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoepgcd = fractions.gcd
15edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
16edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep# decorator for skipping tests on non-IEEE 754 platforms
17edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoeprequires_IEEE_754 = unittest.skipUnless(
18edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep    float.__getformat__("double").startswith("IEEE"),
19edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep    "test requires IEEE 754 doubles")
20edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
21edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoepclass DummyFloat(object):
22edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep    """Dummy float class for testing comparisons with Fractions"""
23edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
24edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep    def __init__(self, value):
25edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        if not isinstance(value, float):
26edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            raise TypeError("DummyFloat can only be initialized from float")
27edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.value = value
28edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
29edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep    def _richcmp(self, other, op):
30edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        if isinstance(other, numbers.Rational):
31edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            return op(F.from_float(self.value), other)
32edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        elif isinstance(other, DummyFloat):
33edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            return op(self.value, other.value)
34edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        else:
35edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            return NotImplemented
36edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
37edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep    def __eq__(self, other): return self._richcmp(other, operator.eq)
38edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep    def __le__(self, other): return self._richcmp(other, operator.le)
39edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep    def __lt__(self, other): return self._richcmp(other, operator.lt)
40edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep    def __ge__(self, other): return self._richcmp(other, operator.ge)
41edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep    def __gt__(self, other): return self._richcmp(other, operator.gt)
42edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
43edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep    # shouldn't be calling __float__ at all when doing comparisons
44edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep    def __float__(self):
45edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        assert False, "__float__ should not be invoked for comparisons"
46edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
47edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep    # same goes for subtraction
48edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep    def __sub__(self, other):
49edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        assert False, "__sub__ should not be invoked for comparisons"
50edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep    __rsub__ = __sub__
51edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
52edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep    # Silence Py3k warning
53edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep    __hash__ = None
54edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
55edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
56edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoepclass DummyRational(object):
57edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep    """Test comparison of Fraction with a naive rational implementation."""
58edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
59edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep    def __init__(self, num, den):
60edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        g = gcd(num, den)
61edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.num = num // g
62edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.den = den // g
63edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
64edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep    def __eq__(self, other):
65edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        if isinstance(other, fractions.Fraction):
66edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            return (self.num == other._numerator and
67edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep                    self.den == other._denominator)
68edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        else:
69edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            return NotImplemented
70edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
71edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep    def __lt__(self, other):
72edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        return(self.num * other._denominator < self.den * other._numerator)
73edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
74edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep    def __gt__(self, other):
75edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        return(self.num * other._denominator > self.den * other._numerator)
76edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
77edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep    def __le__(self, other):
78edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        return(self.num * other._denominator <= self.den * other._numerator)
79edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
80edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep    def __ge__(self, other):
81edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        return(self.num * other._denominator >= self.den * other._numerator)
82edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
83edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep    # this class is for testing comparisons; conversion to float
84edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep    # should never be used for a comparison, since it loses accuracy
85edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep    def __float__(self):
86edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        assert False, "__float__ should not be invoked"
87edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
88edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep    # Silence Py3k warning
89edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep    __hash__ = None
90edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
91edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
92edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoepclass DummyFraction(fractions.Fraction):
93edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep    """Dummy Fraction subclass for copy and deepcopy testing."""
94edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
95edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoepclass GcdTest(unittest.TestCase):
96edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
97edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep    def testMisc(self):
98edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(0, gcd(0, 0))
99edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(1, gcd(1, 0))
100edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(-1, gcd(-1, 0))
101edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(1, gcd(0, 1))
102edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(-1, gcd(0, -1))
103edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(1, gcd(7, 1))
104edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(-1, gcd(7, -1))
105edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(1, gcd(-23, 15))
106edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(12, gcd(120, 84))
107edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(-12, gcd(84, -120))
108edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
109edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
110edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoepdef _components(r):
111edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep    return (r.numerator, r.denominator)
112edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
113edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
114edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoepclass FractionTest(unittest.TestCase):
115edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
116edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep    def assertTypedEquals(self, expected, actual):
117edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        """Asserts that both the types and values are the same."""
118edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(type(expected), type(actual))
119edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(expected, actual)
120edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
121edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep    def assertRaisesMessage(self, exc_type, message,
122edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep                            callable, *args, **kwargs):
123edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        """Asserts that callable(*args, **kwargs) raises exc_type(message)."""
124edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        try:
125edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            callable(*args, **kwargs)
126edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        except exc_type, e:
127edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            self.assertEqual(message, str(e))
128edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        else:
129edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            self.fail("%s not raised" % exc_type.__name__)
130edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
131edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep    def testInit(self):
132edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual((0, 1), _components(F()))
133edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual((7, 1), _components(F(7)))
134edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual((7, 3), _components(F(F(7, 3))))
135edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
136edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual((-1, 1), _components(F(-1, 1)))
137edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual((-1, 1), _components(F(1, -1)))
138edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual((1, 1), _components(F(-2, -2)))
139edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual((1, 2), _components(F(5, 10)))
140edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual((7, 15), _components(F(7, 15)))
141edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual((10**23, 1), _components(F(10**23)))
142edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
143edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual((3, 77), _components(F(F(3, 7), 11)))
144edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual((-9, 5), _components(F(2, F(-10, 9))))
145edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual((2486, 2485), _components(F(F(22, 7), F(355, 113))))
146edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
147edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertRaisesMessage(ZeroDivisionError, "Fraction(12, 0)",
148edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep                                 F, 12, 0)
149edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertRaises(TypeError, F, 1.5 + 3j)
150edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
151edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertRaises(TypeError, F, "3/2", 3)
152edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertRaises(TypeError, F, 3, 0j)
153edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertRaises(TypeError, F, 3, 1j)
154edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
155edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep    @requires_IEEE_754
156edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep    def testInitFromFloat(self):
157edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual((5, 2), _components(F(2.5)))
158edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual((0, 1), _components(F(-0.0)))
159edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual((3602879701896397, 36028797018963968),
160edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep                         _components(F(0.1)))
161edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertRaises(TypeError, F, float('nan'))
162edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertRaises(TypeError, F, float('inf'))
163edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertRaises(TypeError, F, float('-inf'))
164edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
165edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep    def testInitFromDecimal(self):
166edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual((11, 10),
167edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep                         _components(F(Decimal('1.1'))))
168edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual((7, 200),
169edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep                         _components(F(Decimal('3.5e-2'))))
170edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual((0, 1),
171edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep                         _components(F(Decimal('.000e20'))))
172edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertRaises(TypeError, F, Decimal('nan'))
173edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertRaises(TypeError, F, Decimal('snan'))
174edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertRaises(TypeError, F, Decimal('inf'))
175edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertRaises(TypeError, F, Decimal('-inf'))
176edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
177edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep    def testFromString(self):
178edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual((5, 1), _components(F("5")))
179edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual((3, 2), _components(F("3/2")))
180edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual((3, 2), _components(F(" \n  +3/2")))
181edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual((-3, 2), _components(F("-3/2  ")))
182edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual((13, 2), _components(F("    013/02 \n  ")))
183edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual((13, 2), _components(F(u"    013/02 \n  ")))
184edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
185edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual((16, 5), _components(F(" 3.2 ")))
186edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual((-16, 5), _components(F(u" -3.2 ")))
187edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual((-3, 1), _components(F(u" -3. ")))
188edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual((3, 5), _components(F(u" .6 ")))
189edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual((1, 3125), _components(F("32.e-5")))
190edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual((1000000, 1), _components(F("1E+06")))
191edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual((-12300, 1), _components(F("-1.23e4")))
192edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual((0, 1), _components(F(" .0e+0\t")))
193edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual((0, 1), _components(F("-0.000e0")))
194edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
195edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
196edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertRaisesMessage(
197edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            ZeroDivisionError, "Fraction(3, 0)",
198edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            F, "3/0")
199edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertRaisesMessage(
200edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            ValueError, "Invalid literal for Fraction: '3/'",
201edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            F, "3/")
202edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertRaisesMessage(
203edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            ValueError, "Invalid literal for Fraction: '/2'",
204edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            F, "/2")
205edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertRaisesMessage(
206edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            ValueError, "Invalid literal for Fraction: '3 /2'",
207edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            F, "3 /2")
208edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertRaisesMessage(
209edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            # Denominators don't need a sign.
210edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            ValueError, "Invalid literal for Fraction: '3/+2'",
211edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            F, "3/+2")
212edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertRaisesMessage(
213edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            # Imitate float's parsing.
214edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            ValueError, "Invalid literal for Fraction: '+ 3/2'",
215edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            F, "+ 3/2")
216edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertRaisesMessage(
217edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            # Avoid treating '.' as a regex special character.
218edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            ValueError, "Invalid literal for Fraction: '3a2'",
219edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            F, "3a2")
220edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertRaisesMessage(
221edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            # Don't accept combinations of decimals and fractions.
222edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            ValueError, "Invalid literal for Fraction: '3/7.2'",
223edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            F, "3/7.2")
224edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertRaisesMessage(
225edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            # Don't accept combinations of decimals and fractions.
226edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            ValueError, "Invalid literal for Fraction: '3.2/7'",
227edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            F, "3.2/7")
228edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertRaisesMessage(
229edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            # Allow 3. and .3, but not .
230edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            ValueError, "Invalid literal for Fraction: '.'",
231edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            F, ".")
232edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
233edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep    def testImmutable(self):
234edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        r = F(7, 3)
235edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        r.__init__(2, 15)
236edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual((7, 3), _components(r))
237edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
238edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertRaises(AttributeError, setattr, r, 'numerator', 12)
239edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertRaises(AttributeError, setattr, r, 'denominator', 6)
240edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual((7, 3), _components(r))
241edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
242edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        # But if you _really_ need to:
243edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        r._numerator = 4
244edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        r._denominator = 2
245edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual((4, 2), _components(r))
246edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        # Which breaks some important operations:
247edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertNotEqual(F(4, 2), r)
248edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
249edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep    def testFromFloat(self):
250edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertRaises(TypeError, F.from_float, 3+4j)
251edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual((10, 1), _components(F.from_float(10)))
252edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        bigint = 1234567890123456789
253edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual((bigint, 1), _components(F.from_float(bigint)))
254edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual((0, 1), _components(F.from_float(-0.0)))
255edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual((10, 1), _components(F.from_float(10.0)))
256edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual((-5, 2), _components(F.from_float(-2.5)))
257edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual((99999999999999991611392, 1),
258edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep                         _components(F.from_float(1e23)))
259edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(float(10**23), float(F.from_float(1e23)))
260edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual((3602879701896397, 1125899906842624),
261edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep                         _components(F.from_float(3.2)))
262edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(3.2, float(F.from_float(3.2)))
263edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
264edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        inf = 1e1000
265edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        nan = inf - inf
266edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertRaisesMessage(
267edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            TypeError, "Cannot convert inf to Fraction.",
268edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            F.from_float, inf)
269edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertRaisesMessage(
270edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            TypeError, "Cannot convert -inf to Fraction.",
271edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            F.from_float, -inf)
272edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertRaisesMessage(
273edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            TypeError, "Cannot convert nan to Fraction.",
274edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            F.from_float, nan)
275edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
276edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep    def testFromDecimal(self):
277edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertRaises(TypeError, F.from_decimal, 3+4j)
278edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(F(10, 1), F.from_decimal(10))
279edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(F(0), F.from_decimal(Decimal("-0")))
280edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(F(5, 10), F.from_decimal(Decimal("0.5")))
281edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(F(5, 1000), F.from_decimal(Decimal("5e-3")))
282edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(F(5000), F.from_decimal(Decimal("5e3")))
283edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(1 - F(1, 10**30),
284edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep                         F.from_decimal(Decimal("0." + "9" * 30)))
285edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
286edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertRaisesMessage(
287edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            TypeError, "Cannot convert Infinity to Fraction.",
288edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            F.from_decimal, Decimal("inf"))
289edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertRaisesMessage(
290edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            TypeError, "Cannot convert -Infinity to Fraction.",
291edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            F.from_decimal, Decimal("-inf"))
292edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertRaisesMessage(
293edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            TypeError, "Cannot convert NaN to Fraction.",
294edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            F.from_decimal, Decimal("nan"))
295edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertRaisesMessage(
296edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            TypeError, "Cannot convert sNaN to Fraction.",
297edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            F.from_decimal, Decimal("snan"))
298edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
299edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep    def testLimitDenominator(self):
300edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        rpi = F('3.1415926535897932')
301edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(rpi.limit_denominator(10000), F(355, 113))
302edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(-rpi.limit_denominator(10000), F(-355, 113))
303edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(rpi.limit_denominator(113), F(355, 113))
304edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(rpi.limit_denominator(112), F(333, 106))
305edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(F(201, 200).limit_denominator(100), F(1))
306edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(F(201, 200).limit_denominator(101), F(102, 101))
307edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(F(0).limit_denominator(10000), F(0))
308edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        for i in (0, -1):
309edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            self.assertRaisesMessage(
310edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep                ValueError, "max_denominator should be at least 1",
311edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep                F(1).limit_denominator, i)
312edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
313edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep    def testConversions(self):
314edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertTypedEquals(-1, math.trunc(F(-11, 10)))
315edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertTypedEquals(-1, int(F(-11, 10)))
316edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertTypedEquals(1, math.trunc(F(11, 10)))
317edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(False, bool(F(0, 1)))
318edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(True, bool(F(3, 2)))
319edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertTypedEquals(0.1, float(F(1, 10)))
320edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
321edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        # Check that __float__ isn't implemented by converting the
322edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        # numerator and denominator to float before dividing.
323edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertRaises(OverflowError, float, long('2'*400+'7'))
324edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertAlmostEqual(2.0/3,
325edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep                                float(F(long('2'*400+'7'), long('3'*400+'1'))))
326edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
327edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertTypedEquals(0.1+0j, complex(F(1,10)))
328edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
329edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
330edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep    def testArithmetic(self):
331edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(F(1, 2), F(1, 10) + F(2, 5))
332edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(F(-3, 10), F(1, 10) - F(2, 5))
333edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(F(1, 25), F(1, 10) * F(2, 5))
334edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(F(1, 4), F(1, 10) / F(2, 5))
335edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertTypedEquals(2, F(9, 10) // F(2, 5))
336edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertTypedEquals(10**23, F(10**23, 1) // F(1))
337edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(F(2, 3), F(-7, 3) % F(3, 2))
338edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(F(8, 27), F(2, 3) ** F(3))
339edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(F(27, 8), F(2, 3) ** F(-3))
340edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertTypedEquals(2.0, F(4) ** F(1, 2))
341edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(F(1, 1), +F(1, 1))
342edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        # Will return 1j in 3.0:
343edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertRaises(ValueError, pow, F(-1), F(1, 2))
344edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
345edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep    def testMixedArithmetic(self):
346edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertTypedEquals(F(11, 10), F(1, 10) + 1)
347edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertTypedEquals(1.1, F(1, 10) + 1.0)
348edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertTypedEquals(1.1 + 0j, F(1, 10) + (1.0 + 0j))
349edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertTypedEquals(F(11, 10), 1 + F(1, 10))
350edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertTypedEquals(1.1, 1.0 + F(1, 10))
351edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertTypedEquals(1.1 + 0j, (1.0 + 0j) + F(1, 10))
352edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
353edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertTypedEquals(F(-9, 10), F(1, 10) - 1)
354edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertTypedEquals(-0.9, F(1, 10) - 1.0)
355edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertTypedEquals(-0.9 + 0j, F(1, 10) - (1.0 + 0j))
356edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertTypedEquals(F(9, 10), 1 - F(1, 10))
357edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertTypedEquals(0.9, 1.0 - F(1, 10))
358edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertTypedEquals(0.9 + 0j, (1.0 + 0j) - F(1, 10))
359edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
360edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertTypedEquals(F(1, 10), F(1, 10) * 1)
361edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertTypedEquals(0.1, F(1, 10) * 1.0)
362edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertTypedEquals(0.1 + 0j, F(1, 10) * (1.0 + 0j))
363edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertTypedEquals(F(1, 10), 1 * F(1, 10))
364edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertTypedEquals(0.1, 1.0 * F(1, 10))
365edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertTypedEquals(0.1 + 0j, (1.0 + 0j) * F(1, 10))
366edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
367edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertTypedEquals(F(1, 10), F(1, 10) / 1)
368edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertTypedEquals(0.1, F(1, 10) / 1.0)
369edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertTypedEquals(0.1 + 0j, F(1, 10) / (1.0 + 0j))
370edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertTypedEquals(F(10, 1), 1 / F(1, 10))
371edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertTypedEquals(10.0, 1.0 / F(1, 10))
372edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertTypedEquals(10.0 + 0j, (1.0 + 0j) / F(1, 10))
373edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
374edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertTypedEquals(0, F(1, 10) // 1)
375edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertTypedEquals(0.0, F(1, 10) // 1.0)
376edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertTypedEquals(10, 1 // F(1, 10))
377edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertTypedEquals(10**23, 10**22 // F(1, 10))
378edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertTypedEquals(10.0, 1.0 // F(1, 10))
379edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
380edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertTypedEquals(F(1, 10), F(1, 10) % 1)
381edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertTypedEquals(0.1, F(1, 10) % 1.0)
382edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertTypedEquals(F(0, 1), 1 % F(1, 10))
383edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertTypedEquals(0.0, 1.0 % F(1, 10))
384edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
385edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        # No need for divmod since we don't override it.
386edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
387edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        # ** has more interesting conversion rules.
388edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertTypedEquals(F(100, 1), F(1, 10) ** -2)
389edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertTypedEquals(F(100, 1), F(10, 1) ** 2)
390edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertTypedEquals(0.1, F(1, 10) ** 1.0)
391edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertTypedEquals(0.1 + 0j, F(1, 10) ** (1.0 + 0j))
392edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertTypedEquals(4 , 2 ** F(2, 1))
393edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        # Will return 1j in 3.0:
394edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertRaises(ValueError, pow, (-1), F(1, 2))
395edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertTypedEquals(F(1, 4) , 2 ** F(-2, 1))
396edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertTypedEquals(2.0 , 4 ** F(1, 2))
397edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertTypedEquals(0.25, 2.0 ** F(-2, 1))
398edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertTypedEquals(1.0 + 0j, (1.0 + 0j) ** F(1, 10))
399edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
400edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep    def testMixingWithDecimal(self):
401edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        # Decimal refuses mixed comparisons.
402edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertRaisesMessage(
403edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            TypeError,
404edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            "unsupported operand type(s) for +: 'Fraction' and 'Decimal'",
405edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            operator.add, F(3,11), Decimal('3.1415926'))
406edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertRaisesMessage(
407edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            TypeError,
408edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            "unsupported operand type(s) for +: 'Decimal' and 'Fraction'",
409edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            operator.add, Decimal('3.1415926'), F(3,11))
410edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertNotEqual(F(5, 2), Decimal('2.5'))
411edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
412edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep    def testComparisons(self):
413edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertTrue(F(1, 2) < F(2, 3))
414edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertFalse(F(1, 2) < F(1, 2))
415edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertTrue(F(1, 2) <= F(2, 3))
416edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertTrue(F(1, 2) <= F(1, 2))
417edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertFalse(F(2, 3) <= F(1, 2))
418edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertTrue(F(1, 2) == F(1, 2))
419edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertFalse(F(1, 2) == F(1, 3))
420edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertFalse(F(1, 2) != F(1, 2))
421edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertTrue(F(1, 2) != F(1, 3))
422edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
423edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep    def testComparisonsDummyRational(self):
424edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertTrue(F(1, 2) == DummyRational(1, 2))
425edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertTrue(DummyRational(1, 2) == F(1, 2))
426edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertFalse(F(1, 2) == DummyRational(3, 4))
427edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertFalse(DummyRational(3, 4) == F(1, 2))
428edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
429edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertTrue(F(1, 2) < DummyRational(3, 4))
430edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertFalse(F(1, 2) < DummyRational(1, 2))
431edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertFalse(F(1, 2) < DummyRational(1, 7))
432edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertFalse(F(1, 2) > DummyRational(3, 4))
433edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertFalse(F(1, 2) > DummyRational(1, 2))
434edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertTrue(F(1, 2) > DummyRational(1, 7))
435edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertTrue(F(1, 2) <= DummyRational(3, 4))
436edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertTrue(F(1, 2) <= DummyRational(1, 2))
437edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertFalse(F(1, 2) <= DummyRational(1, 7))
438edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertFalse(F(1, 2) >= DummyRational(3, 4))
439edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertTrue(F(1, 2) >= DummyRational(1, 2))
440edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertTrue(F(1, 2) >= DummyRational(1, 7))
441edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
442edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertTrue(DummyRational(1, 2) < F(3, 4))
443edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertFalse(DummyRational(1, 2) < F(1, 2))
444edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertFalse(DummyRational(1, 2) < F(1, 7))
445edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertFalse(DummyRational(1, 2) > F(3, 4))
446edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertFalse(DummyRational(1, 2) > F(1, 2))
447edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertTrue(DummyRational(1, 2) > F(1, 7))
448edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertTrue(DummyRational(1, 2) <= F(3, 4))
449edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertTrue(DummyRational(1, 2) <= F(1, 2))
450edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertFalse(DummyRational(1, 2) <= F(1, 7))
451edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertFalse(DummyRational(1, 2) >= F(3, 4))
452edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertTrue(DummyRational(1, 2) >= F(1, 2))
453edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertTrue(DummyRational(1, 2) >= F(1, 7))
454edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
455edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep    def testComparisonsDummyFloat(self):
456edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        x = DummyFloat(1./3.)
457edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        y = F(1, 3)
458edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertTrue(x != y)
459edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertTrue(x < y or x > y)
460edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertFalse(x == y)
461edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertFalse(x <= y and x >= y)
462edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertTrue(y != x)
463edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertTrue(y < x or y > x)
464edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertFalse(y == x)
465edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertFalse(y <= x and y >= x)
466edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
467edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep    def testMixedLess(self):
468edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertTrue(2 < F(5, 2))
469edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertFalse(2 < F(4, 2))
470edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertTrue(F(5, 2) < 3)
471edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertFalse(F(4, 2) < 2)
472edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
473edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertTrue(F(1, 2) < 0.6)
474edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertFalse(F(1, 2) < 0.4)
475edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertTrue(0.4 < F(1, 2))
476edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertFalse(0.5 < F(1, 2))
477edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
478edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertFalse(float('inf') < F(1, 2))
479edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertTrue(float('-inf') < F(0, 10))
480edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertFalse(float('nan') < F(-3, 7))
481edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertTrue(F(1, 2) < float('inf'))
482edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertFalse(F(17, 12) < float('-inf'))
483edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertFalse(F(144, -89) < float('nan'))
484edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
485edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep    def testMixedLessEqual(self):
486edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertTrue(0.5 <= F(1, 2))
487edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertFalse(0.6 <= F(1, 2))
488edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertTrue(F(1, 2) <= 0.5)
489edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertFalse(F(1, 2) <= 0.4)
490edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertTrue(2 <= F(4, 2))
491edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertFalse(2 <= F(3, 2))
492edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertTrue(F(4, 2) <= 2)
493edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertFalse(F(5, 2) <= 2)
494edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
495edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertFalse(float('inf') <= F(1, 2))
496edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertTrue(float('-inf') <= F(0, 10))
497edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertFalse(float('nan') <= F(-3, 7))
498edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertTrue(F(1, 2) <= float('inf'))
499edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertFalse(F(17, 12) <= float('-inf'))
500edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertFalse(F(144, -89) <= float('nan'))
501edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
502edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep    def testBigFloatComparisons(self):
503edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        # Because 10**23 can't be represented exactly as a float:
504edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertFalse(F(10**23) == float(10**23))
505edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        # The first test demonstrates why these are important.
506edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertFalse(1e23 < float(F(math.trunc(1e23) + 1)))
507edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertTrue(1e23 < F(math.trunc(1e23) + 1))
508edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertFalse(1e23 <= F(math.trunc(1e23) - 1))
509edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertTrue(1e23 > F(math.trunc(1e23) - 1))
510edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertFalse(1e23 >= F(math.trunc(1e23) + 1))
511edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
512edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep    def testBigComplexComparisons(self):
513edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertFalse(F(10**23) == complex(10**23))
514edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertRaises(TypeError, operator.gt, F(10**23), complex(10**23))
515edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertRaises(TypeError, operator.le, F(10**23), complex(10**23))
516edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
517edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        x = F(3, 8)
518edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        z = complex(0.375, 0.0)
519edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        w = complex(0.375, 0.2)
520edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertTrue(x == z)
521edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertFalse(x != z)
522edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertFalse(x == w)
523edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertTrue(x != w)
524edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        for op in operator.lt, operator.le, operator.gt, operator.ge:
525edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            self.assertRaises(TypeError, op, x, z)
526edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            self.assertRaises(TypeError, op, z, x)
527edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            self.assertRaises(TypeError, op, x, w)
528edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            self.assertRaises(TypeError, op, w, x)
529edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
530edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep    def testMixedEqual(self):
531edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertTrue(0.5 == F(1, 2))
532edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertFalse(0.6 == F(1, 2))
533edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertTrue(F(1, 2) == 0.5)
534edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertFalse(F(1, 2) == 0.4)
535edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertTrue(2 == F(4, 2))
536edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertFalse(2 == F(3, 2))
537edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertTrue(F(4, 2) == 2)
538edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertFalse(F(5, 2) == 2)
539edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertFalse(F(5, 2) == float('nan'))
540edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertFalse(float('nan') == F(3, 7))
541edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertFalse(F(5, 2) == float('inf'))
542edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertFalse(float('-inf') == F(2, 5))
543edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
544edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep    def testStringification(self):
545edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual("Fraction(7, 3)", repr(F(7, 3)))
546edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual("Fraction(6283185307, 2000000000)",
547edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep                         repr(F('3.1415926535')))
548edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual("Fraction(-1, 100000000000000000000)",
549edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep                         repr(F(1, -10**20)))
550edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual("7/3", str(F(7, 3)))
551edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual("7", str(F(7, 1)))
552edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
553edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep    def testHash(self):
554edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(hash(2.5), hash(F(5, 2)))
555edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(hash(10**50), hash(F(10**50)))
556edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertNotEqual(hash(float(10**23)), hash(F(10**23)))
557edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
558edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep    def testApproximatePi(self):
559edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        # Algorithm borrowed from
560edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        # http://docs.python.org/lib/decimal-recipes.html
561edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        three = F(3)
562edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        lasts, t, s, n, na, d, da = 0, three, 3, 1, 0, 0, 24
563edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        while abs(s - lasts) > F(1, 10**9):
564edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            lasts = s
565edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            n, na = n+na, na+8
566edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            d, da = d+da, da+32
567edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            t = (t * n) / d
568edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            s += t
569edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertAlmostEqual(math.pi, s)
570edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
571edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep    def testApproximateCos1(self):
572edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        # Algorithm borrowed from
573edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        # http://docs.python.org/lib/decimal-recipes.html
574edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        x = F(1)
575edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        i, lasts, s, fact, num, sign = 0, 0, F(1), 1, 1, 1
576edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        while abs(s - lasts) > F(1, 10**9):
577edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            lasts = s
578edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            i += 2
579edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            fact *= i * (i-1)
580edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            num *= x * x
581edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            sign *= -1
582edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep            s += num / fact * sign
583edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertAlmostEqual(math.cos(1), s)
584edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
585edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep    def test_copy_deepcopy_pickle(self):
586edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        r = F(13, 7)
587edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        dr = DummyFraction(13, 7)
588edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(r, loads(dumps(r)))
589edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(id(r), id(copy(r)))
590edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertEqual(id(r), id(deepcopy(r)))
591edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertNotEqual(id(dr), id(copy(dr)))
592edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertNotEqual(id(dr), id(deepcopy(dr)))
593edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertTypedEquals(dr, copy(dr))
594edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertTypedEquals(dr, deepcopy(dr))
595edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
596edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep    def test_slots(self):
597edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        # Issue 4998
598edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        r = F(13, 7)
599edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep        self.assertRaises(AttributeError, setattr, r, 'a', 10)
600edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
601edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoepdef test_main():
602edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep    run_unittest(FractionTest, GcdTest)
603edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep
604edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoepif __name__ == '__main__':
605edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep    test_main()
606