183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh"""Tests for Lib/fractions.py."""
283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehfrom decimal import Decimal
483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehfrom test.test_support import run_unittest
583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehimport math
683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehimport numbers
783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehimport operator
883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehimport fractions
983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehimport sys
1083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehimport unittest
1183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehfrom copy import copy, deepcopy
1283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehfrom cPickle import dumps, loads
1383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew HsiehF = fractions.Fraction
1483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehgcd = fractions.gcd
1583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
1683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh# decorator for skipping tests on non-IEEE 754 platforms
1783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehrequires_IEEE_754 = unittest.skipUnless(
1883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    float.__getformat__("double").startswith("IEEE"),
1983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    "test requires IEEE 754 doubles")
2083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
2183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehclass DummyFloat(object):
2283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    """Dummy float class for testing comparisons with Fractions"""
2383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
2483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def __init__(self, value):
2583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if not isinstance(value, float):
2683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            raise TypeError("DummyFloat can only be initialized from float")
2783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.value = value
2883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
2983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def _richcmp(self, other, op):
3083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if isinstance(other, numbers.Rational):
3183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            return op(F.from_float(self.value), other)
3283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        elif isinstance(other, DummyFloat):
3383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            return op(self.value, other.value)
3483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        else:
3583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            return NotImplemented
3683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
3783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def __eq__(self, other): return self._richcmp(other, operator.eq)
3883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def __le__(self, other): return self._richcmp(other, operator.le)
3983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def __lt__(self, other): return self._richcmp(other, operator.lt)
4083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def __ge__(self, other): return self._richcmp(other, operator.ge)
4183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def __gt__(self, other): return self._richcmp(other, operator.gt)
4283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
4383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # shouldn't be calling __float__ at all when doing comparisons
4483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def __float__(self):
4583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        assert False, "__float__ should not be invoked for comparisons"
4683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
4783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # same goes for subtraction
4883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def __sub__(self, other):
4983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        assert False, "__sub__ should not be invoked for comparisons"
5083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    __rsub__ = __sub__
5183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
5283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # Silence Py3k warning
5383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    __hash__ = None
5483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
5583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
5683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehclass DummyRational(object):
5783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    """Test comparison of Fraction with a naive rational implementation."""
5883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
5983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def __init__(self, num, den):
6083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        g = gcd(num, den)
6183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.num = num // g
6283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.den = den // g
6383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
6483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def __eq__(self, other):
6583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if isinstance(other, fractions.Fraction):
6683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            return (self.num == other._numerator and
6783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    self.den == other._denominator)
6883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        else:
6983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            return NotImplemented
7083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
7183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def __lt__(self, other):
7283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return(self.num * other._denominator < self.den * other._numerator)
7383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
7483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def __gt__(self, other):
7583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return(self.num * other._denominator > self.den * other._numerator)
7683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
7783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def __le__(self, other):
7883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return(self.num * other._denominator <= self.den * other._numerator)
7983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
8083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def __ge__(self, other):
8183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return(self.num * other._denominator >= self.den * other._numerator)
8283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
8383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # this class is for testing comparisons; conversion to float
8483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # should never be used for a comparison, since it loses accuracy
8583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def __float__(self):
8683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        assert False, "__float__ should not be invoked"
8783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
8883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    # Silence Py3k warning
8983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    __hash__ = None
9083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
9183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
9283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehclass DummyFraction(fractions.Fraction):
9383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    """Dummy Fraction subclass for copy and deepcopy testing."""
9483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
9583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehclass GcdTest(unittest.TestCase):
9683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
9783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def testMisc(self):
9883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(0, gcd(0, 0))
9983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(1, gcd(1, 0))
10083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(-1, gcd(-1, 0))
10183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(1, gcd(0, 1))
10283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(-1, gcd(0, -1))
10383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(1, gcd(7, 1))
10483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(-1, gcd(7, -1))
10583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(1, gcd(-23, 15))
10683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(12, gcd(120, 84))
10783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(-12, gcd(84, -120))
10883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
10983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
11083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehdef _components(r):
11183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    return (r.numerator, r.denominator)
11283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
11383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
11483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehclass FractionTest(unittest.TestCase):
11583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
11683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def assertTypedEquals(self, expected, actual):
11783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """Asserts that both the types and values are the same."""
11883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(type(expected), type(actual))
11983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(expected, actual)
12083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
12183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def assertRaisesMessage(self, exc_type, message,
12283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                            callable, *args, **kwargs):
12383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """Asserts that callable(*args, **kwargs) raises exc_type(message)."""
12483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        try:
12583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            callable(*args, **kwargs)
12683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        except exc_type, e:
12783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.assertEqual(message, str(e))
12883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        else:
12983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.fail("%s not raised" % exc_type.__name__)
13083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
13183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def testInit(self):
13283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual((0, 1), _components(F()))
13383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual((7, 1), _components(F(7)))
13483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual((7, 3), _components(F(F(7, 3))))
13583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
13683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual((-1, 1), _components(F(-1, 1)))
13783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual((-1, 1), _components(F(1, -1)))
13883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual((1, 1), _components(F(-2, -2)))
13983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual((1, 2), _components(F(5, 10)))
14083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual((7, 15), _components(F(7, 15)))
14183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual((10**23, 1), _components(F(10**23)))
14283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
14383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual((3, 77), _components(F(F(3, 7), 11)))
14483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual((-9, 5), _components(F(2, F(-10, 9))))
14583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual((2486, 2485), _components(F(F(22, 7), F(355, 113))))
14683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
14783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertRaisesMessage(ZeroDivisionError, "Fraction(12, 0)",
14883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                                 F, 12, 0)
14983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertRaises(TypeError, F, 1.5 + 3j)
15083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
15183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertRaises(TypeError, F, "3/2", 3)
15283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertRaises(TypeError, F, 3, 0j)
15383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertRaises(TypeError, F, 3, 1j)
15483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
15583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    @requires_IEEE_754
15683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def testInitFromFloat(self):
15783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual((5, 2), _components(F(2.5)))
15883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual((0, 1), _components(F(-0.0)))
15983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual((3602879701896397, 36028797018963968),
16083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                         _components(F(0.1)))
16183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertRaises(TypeError, F, float('nan'))
16283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertRaises(TypeError, F, float('inf'))
16383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertRaises(TypeError, F, float('-inf'))
16483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
16583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def testInitFromDecimal(self):
16683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual((11, 10),
16783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                         _components(F(Decimal('1.1'))))
16883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual((7, 200),
16983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                         _components(F(Decimal('3.5e-2'))))
17083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual((0, 1),
17183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                         _components(F(Decimal('.000e20'))))
17283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertRaises(TypeError, F, Decimal('nan'))
17383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertRaises(TypeError, F, Decimal('snan'))
17483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertRaises(TypeError, F, Decimal('inf'))
17583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertRaises(TypeError, F, Decimal('-inf'))
17683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
17783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def testFromString(self):
17883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual((5, 1), _components(F("5")))
17983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual((3, 2), _components(F("3/2")))
18083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual((3, 2), _components(F(" \n  +3/2")))
18183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual((-3, 2), _components(F("-3/2  ")))
18283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual((13, 2), _components(F("    013/02 \n  ")))
18383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual((13, 2), _components(F(u"    013/02 \n  ")))
18483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
18583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual((16, 5), _components(F(" 3.2 ")))
18683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual((-16, 5), _components(F(u" -3.2 ")))
18783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual((-3, 1), _components(F(u" -3. ")))
18883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual((3, 5), _components(F(u" .6 ")))
18983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual((1, 3125), _components(F("32.e-5")))
19083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual((1000000, 1), _components(F("1E+06")))
19183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual((-12300, 1), _components(F("-1.23e4")))
19283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual((0, 1), _components(F(" .0e+0\t")))
19383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual((0, 1), _components(F("-0.000e0")))
19483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
19583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
19683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertRaisesMessage(
19783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            ZeroDivisionError, "Fraction(3, 0)",
19883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            F, "3/0")
19983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertRaisesMessage(
20083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            ValueError, "Invalid literal for Fraction: '3/'",
20183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            F, "3/")
20283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertRaisesMessage(
20383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            ValueError, "Invalid literal for Fraction: '/2'",
20483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            F, "/2")
20583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertRaisesMessage(
20683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            ValueError, "Invalid literal for Fraction: '3 /2'",
20783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            F, "3 /2")
20883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertRaisesMessage(
20983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            # Denominators don't need a sign.
21083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            ValueError, "Invalid literal for Fraction: '3/+2'",
21183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            F, "3/+2")
21283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertRaisesMessage(
21383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            # Imitate float's parsing.
21483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            ValueError, "Invalid literal for Fraction: '+ 3/2'",
21583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            F, "+ 3/2")
21683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertRaisesMessage(
21783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            # Avoid treating '.' as a regex special character.
21883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            ValueError, "Invalid literal for Fraction: '3a2'",
21983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            F, "3a2")
22083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertRaisesMessage(
22183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            # Don't accept combinations of decimals and fractions.
22283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            ValueError, "Invalid literal for Fraction: '3/7.2'",
22383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            F, "3/7.2")
22483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertRaisesMessage(
22583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            # Don't accept combinations of decimals and fractions.
22683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            ValueError, "Invalid literal for Fraction: '3.2/7'",
22783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            F, "3.2/7")
22883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertRaisesMessage(
22983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            # Allow 3. and .3, but not .
23083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            ValueError, "Invalid literal for Fraction: '.'",
23183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            F, ".")
23283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
23383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def testImmutable(self):
23483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        r = F(7, 3)
23583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        r.__init__(2, 15)
23683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual((7, 3), _components(r))
23783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
23883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertRaises(AttributeError, setattr, r, 'numerator', 12)
23983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertRaises(AttributeError, setattr, r, 'denominator', 6)
24083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual((7, 3), _components(r))
24183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
24283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # But if you _really_ need to:
24383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        r._numerator = 4
24483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        r._denominator = 2
24583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual((4, 2), _components(r))
24683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # Which breaks some important operations:
24783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertNotEqual(F(4, 2), r)
24883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
24983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def testFromFloat(self):
25083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertRaises(TypeError, F.from_float, 3+4j)
25183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual((10, 1), _components(F.from_float(10)))
25283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        bigint = 1234567890123456789
25383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual((bigint, 1), _components(F.from_float(bigint)))
25483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual((0, 1), _components(F.from_float(-0.0)))
25583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual((10, 1), _components(F.from_float(10.0)))
25683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual((-5, 2), _components(F.from_float(-2.5)))
25783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual((99999999999999991611392, 1),
25883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                         _components(F.from_float(1e23)))
25983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(float(10**23), float(F.from_float(1e23)))
26083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual((3602879701896397, 1125899906842624),
26183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                         _components(F.from_float(3.2)))
26283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(3.2, float(F.from_float(3.2)))
26383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
26483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        inf = 1e1000
26583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        nan = inf - inf
26683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertRaisesMessage(
26783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            TypeError, "Cannot convert inf to Fraction.",
26883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            F.from_float, inf)
26983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertRaisesMessage(
27083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            TypeError, "Cannot convert -inf to Fraction.",
27183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            F.from_float, -inf)
27283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertRaisesMessage(
27383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            TypeError, "Cannot convert nan to Fraction.",
27483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            F.from_float, nan)
27583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
27683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def testFromDecimal(self):
27783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertRaises(TypeError, F.from_decimal, 3+4j)
27883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(F(10, 1), F.from_decimal(10))
27983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(F(0), F.from_decimal(Decimal("-0")))
28083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(F(5, 10), F.from_decimal(Decimal("0.5")))
28183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(F(5, 1000), F.from_decimal(Decimal("5e-3")))
28283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(F(5000), F.from_decimal(Decimal("5e3")))
28383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(1 - F(1, 10**30),
28483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                         F.from_decimal(Decimal("0." + "9" * 30)))
28583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
28683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertRaisesMessage(
28783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            TypeError, "Cannot convert Infinity to Fraction.",
28883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            F.from_decimal, Decimal("inf"))
28983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertRaisesMessage(
29083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            TypeError, "Cannot convert -Infinity to Fraction.",
29183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            F.from_decimal, Decimal("-inf"))
29283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertRaisesMessage(
29383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            TypeError, "Cannot convert NaN to Fraction.",
29483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            F.from_decimal, Decimal("nan"))
29583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertRaisesMessage(
29683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            TypeError, "Cannot convert sNaN to Fraction.",
29783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            F.from_decimal, Decimal("snan"))
29883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
29983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def testLimitDenominator(self):
30083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        rpi = F('3.1415926535897932')
30183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(rpi.limit_denominator(10000), F(355, 113))
30283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(-rpi.limit_denominator(10000), F(-355, 113))
30383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(rpi.limit_denominator(113), F(355, 113))
30483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(rpi.limit_denominator(112), F(333, 106))
30583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(F(201, 200).limit_denominator(100), F(1))
30683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(F(201, 200).limit_denominator(101), F(102, 101))
30783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(F(0).limit_denominator(10000), F(0))
30883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        for i in (0, -1):
30983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.assertRaisesMessage(
31083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                ValueError, "max_denominator should be at least 1",
31183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                F(1).limit_denominator, i)
31283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
31383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def testConversions(self):
31483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertTypedEquals(-1, math.trunc(F(-11, 10)))
31583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertTypedEquals(-1, int(F(-11, 10)))
31683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertTypedEquals(1, math.trunc(F(11, 10)))
31783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(False, bool(F(0, 1)))
31883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(True, bool(F(3, 2)))
31983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertTypedEquals(0.1, float(F(1, 10)))
32083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
32183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # Check that __float__ isn't implemented by converting the
32283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # numerator and denominator to float before dividing.
32383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertRaises(OverflowError, float, long('2'*400+'7'))
32483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertAlmostEqual(2.0/3,
32583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                                float(F(long('2'*400+'7'), long('3'*400+'1'))))
32683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
32783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertTypedEquals(0.1+0j, complex(F(1,10)))
32883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
32983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
33083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def testArithmetic(self):
33183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(F(1, 2), F(1, 10) + F(2, 5))
33283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(F(-3, 10), F(1, 10) - F(2, 5))
33383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(F(1, 25), F(1, 10) * F(2, 5))
33483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(F(1, 4), F(1, 10) / F(2, 5))
33583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertTypedEquals(2, F(9, 10) // F(2, 5))
33683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertTypedEquals(10**23, F(10**23, 1) // F(1))
33783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(F(2, 3), F(-7, 3) % F(3, 2))
33883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(F(8, 27), F(2, 3) ** F(3))
33983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(F(27, 8), F(2, 3) ** F(-3))
34083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertTypedEquals(2.0, F(4) ** F(1, 2))
34183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(F(1, 1), +F(1, 1))
34283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # Will return 1j in 3.0:
34383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertRaises(ValueError, pow, F(-1), F(1, 2))
34483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
34583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def testMixedArithmetic(self):
34683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertTypedEquals(F(11, 10), F(1, 10) + 1)
34783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertTypedEquals(1.1, F(1, 10) + 1.0)
34883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertTypedEquals(1.1 + 0j, F(1, 10) + (1.0 + 0j))
34983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertTypedEquals(F(11, 10), 1 + F(1, 10))
35083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertTypedEquals(1.1, 1.0 + F(1, 10))
35183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertTypedEquals(1.1 + 0j, (1.0 + 0j) + F(1, 10))
35283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
35383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertTypedEquals(F(-9, 10), F(1, 10) - 1)
35483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertTypedEquals(-0.9, F(1, 10) - 1.0)
35583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertTypedEquals(-0.9 + 0j, F(1, 10) - (1.0 + 0j))
35683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertTypedEquals(F(9, 10), 1 - F(1, 10))
35783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertTypedEquals(0.9, 1.0 - F(1, 10))
35883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertTypedEquals(0.9 + 0j, (1.0 + 0j) - F(1, 10))
35983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
36083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertTypedEquals(F(1, 10), F(1, 10) * 1)
36183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertTypedEquals(0.1, F(1, 10) * 1.0)
36283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertTypedEquals(0.1 + 0j, F(1, 10) * (1.0 + 0j))
36383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertTypedEquals(F(1, 10), 1 * F(1, 10))
36483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertTypedEquals(0.1, 1.0 * F(1, 10))
36583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertTypedEquals(0.1 + 0j, (1.0 + 0j) * F(1, 10))
36683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
36783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertTypedEquals(F(1, 10), F(1, 10) / 1)
36883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertTypedEquals(0.1, F(1, 10) / 1.0)
36983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertTypedEquals(0.1 + 0j, F(1, 10) / (1.0 + 0j))
37083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertTypedEquals(F(10, 1), 1 / F(1, 10))
37183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertTypedEquals(10.0, 1.0 / F(1, 10))
37283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertTypedEquals(10.0 + 0j, (1.0 + 0j) / F(1, 10))
37383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
37483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertTypedEquals(0, F(1, 10) // 1)
37583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertTypedEquals(0.0, F(1, 10) // 1.0)
37683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertTypedEquals(10, 1 // F(1, 10))
37783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertTypedEquals(10**23, 10**22 // F(1, 10))
37883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertTypedEquals(10.0, 1.0 // F(1, 10))
37983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
38083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertTypedEquals(F(1, 10), F(1, 10) % 1)
38183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertTypedEquals(0.1, F(1, 10) % 1.0)
38283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertTypedEquals(F(0, 1), 1 % F(1, 10))
38383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertTypedEquals(0.0, 1.0 % F(1, 10))
38483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
38583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # No need for divmod since we don't override it.
38683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
38783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # ** has more interesting conversion rules.
38883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertTypedEquals(F(100, 1), F(1, 10) ** -2)
38983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertTypedEquals(F(100, 1), F(10, 1) ** 2)
39083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertTypedEquals(0.1, F(1, 10) ** 1.0)
39183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertTypedEquals(0.1 + 0j, F(1, 10) ** (1.0 + 0j))
39283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertTypedEquals(4 , 2 ** F(2, 1))
39383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # Will return 1j in 3.0:
39483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertRaises(ValueError, pow, (-1), F(1, 2))
39583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertTypedEquals(F(1, 4) , 2 ** F(-2, 1))
39683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertTypedEquals(2.0 , 4 ** F(1, 2))
39783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertTypedEquals(0.25, 2.0 ** F(-2, 1))
39883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertTypedEquals(1.0 + 0j, (1.0 + 0j) ** F(1, 10))
39983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
40083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def testMixingWithDecimal(self):
40183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # Decimal refuses mixed comparisons.
40283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertRaisesMessage(
40383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            TypeError,
40483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            "unsupported operand type(s) for +: 'Fraction' and 'Decimal'",
40583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            operator.add, F(3,11), Decimal('3.1415926'))
40683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertRaisesMessage(
40783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            TypeError,
40883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            "unsupported operand type(s) for +: 'Decimal' and 'Fraction'",
40983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            operator.add, Decimal('3.1415926'), F(3,11))
41083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertNotEqual(F(5, 2), Decimal('2.5'))
41183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
41283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def testComparisons(self):
41383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertTrue(F(1, 2) < F(2, 3))
41483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertFalse(F(1, 2) < F(1, 2))
41583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertTrue(F(1, 2) <= F(2, 3))
41683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertTrue(F(1, 2) <= F(1, 2))
41783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertFalse(F(2, 3) <= F(1, 2))
41883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertTrue(F(1, 2) == F(1, 2))
41983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertFalse(F(1, 2) == F(1, 3))
42083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertFalse(F(1, 2) != F(1, 2))
42183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertTrue(F(1, 2) != F(1, 3))
42283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
42383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def testComparisonsDummyRational(self):
42483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertTrue(F(1, 2) == DummyRational(1, 2))
42583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertTrue(DummyRational(1, 2) == F(1, 2))
42683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertFalse(F(1, 2) == DummyRational(3, 4))
42783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertFalse(DummyRational(3, 4) == F(1, 2))
42883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
42983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertTrue(F(1, 2) < DummyRational(3, 4))
43083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertFalse(F(1, 2) < DummyRational(1, 2))
43183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertFalse(F(1, 2) < DummyRational(1, 7))
43283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertFalse(F(1, 2) > DummyRational(3, 4))
43383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertFalse(F(1, 2) > DummyRational(1, 2))
43483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertTrue(F(1, 2) > DummyRational(1, 7))
43583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertTrue(F(1, 2) <= DummyRational(3, 4))
43683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertTrue(F(1, 2) <= DummyRational(1, 2))
43783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertFalse(F(1, 2) <= DummyRational(1, 7))
43883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertFalse(F(1, 2) >= DummyRational(3, 4))
43983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertTrue(F(1, 2) >= DummyRational(1, 2))
44083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertTrue(F(1, 2) >= DummyRational(1, 7))
44183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
44283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertTrue(DummyRational(1, 2) < F(3, 4))
44383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertFalse(DummyRational(1, 2) < F(1, 2))
44483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertFalse(DummyRational(1, 2) < F(1, 7))
44583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertFalse(DummyRational(1, 2) > F(3, 4))
44683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertFalse(DummyRational(1, 2) > F(1, 2))
44783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertTrue(DummyRational(1, 2) > F(1, 7))
44883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertTrue(DummyRational(1, 2) <= F(3, 4))
44983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertTrue(DummyRational(1, 2) <= F(1, 2))
45083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertFalse(DummyRational(1, 2) <= F(1, 7))
45183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertFalse(DummyRational(1, 2) >= F(3, 4))
45283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertTrue(DummyRational(1, 2) >= F(1, 2))
45383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertTrue(DummyRational(1, 2) >= F(1, 7))
45483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
45583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def testComparisonsDummyFloat(self):
45683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        x = DummyFloat(1./3.)
45783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        y = F(1, 3)
45883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertTrue(x != y)
45983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertTrue(x < y or x > y)
46083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertFalse(x == y)
46183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertFalse(x <= y and x >= y)
46283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertTrue(y != x)
46383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertTrue(y < x or y > x)
46483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertFalse(y == x)
46583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertFalse(y <= x and y >= x)
46683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
46783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def testMixedLess(self):
46883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertTrue(2 < F(5, 2))
46983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertFalse(2 < F(4, 2))
47083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertTrue(F(5, 2) < 3)
47183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertFalse(F(4, 2) < 2)
47283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
47383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertTrue(F(1, 2) < 0.6)
47483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertFalse(F(1, 2) < 0.4)
47583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertTrue(0.4 < F(1, 2))
47683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertFalse(0.5 < F(1, 2))
47783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
47883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertFalse(float('inf') < F(1, 2))
47983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertTrue(float('-inf') < F(0, 10))
48083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertFalse(float('nan') < F(-3, 7))
48183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertTrue(F(1, 2) < float('inf'))
48283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertFalse(F(17, 12) < float('-inf'))
48383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertFalse(F(144, -89) < float('nan'))
48483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
48583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def testMixedLessEqual(self):
48683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertTrue(0.5 <= F(1, 2))
48783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertFalse(0.6 <= F(1, 2))
48883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertTrue(F(1, 2) <= 0.5)
48983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertFalse(F(1, 2) <= 0.4)
49083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertTrue(2 <= F(4, 2))
49183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertFalse(2 <= F(3, 2))
49283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertTrue(F(4, 2) <= 2)
49383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertFalse(F(5, 2) <= 2)
49483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
49583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertFalse(float('inf') <= F(1, 2))
49683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertTrue(float('-inf') <= F(0, 10))
49783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertFalse(float('nan') <= F(-3, 7))
49883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertTrue(F(1, 2) <= float('inf'))
49983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertFalse(F(17, 12) <= float('-inf'))
50083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertFalse(F(144, -89) <= float('nan'))
50183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
50283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def testBigFloatComparisons(self):
50383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # Because 10**23 can't be represented exactly as a float:
50483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertFalse(F(10**23) == float(10**23))
50583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # The first test demonstrates why these are important.
50683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertFalse(1e23 < float(F(math.trunc(1e23) + 1)))
50783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertTrue(1e23 < F(math.trunc(1e23) + 1))
50883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertFalse(1e23 <= F(math.trunc(1e23) - 1))
50983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertTrue(1e23 > F(math.trunc(1e23) - 1))
51083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertFalse(1e23 >= F(math.trunc(1e23) + 1))
51183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
51283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def testBigComplexComparisons(self):
51383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertFalse(F(10**23) == complex(10**23))
51483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertRaises(TypeError, operator.gt, F(10**23), complex(10**23))
51583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertRaises(TypeError, operator.le, F(10**23), complex(10**23))
51683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
51783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        x = F(3, 8)
51883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        z = complex(0.375, 0.0)
51983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        w = complex(0.375, 0.2)
52083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertTrue(x == z)
52183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertFalse(x != z)
52283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertFalse(x == w)
52383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertTrue(x != w)
52483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        for op in operator.lt, operator.le, operator.gt, operator.ge:
52583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.assertRaises(TypeError, op, x, z)
52683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.assertRaises(TypeError, op, z, x)
52783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.assertRaises(TypeError, op, x, w)
52883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.assertRaises(TypeError, op, w, x)
52983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
53083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def testMixedEqual(self):
53183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertTrue(0.5 == F(1, 2))
53283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertFalse(0.6 == F(1, 2))
53383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertTrue(F(1, 2) == 0.5)
53483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertFalse(F(1, 2) == 0.4)
53583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertTrue(2 == F(4, 2))
53683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertFalse(2 == F(3, 2))
53783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertTrue(F(4, 2) == 2)
53883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertFalse(F(5, 2) == 2)
53983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertFalse(F(5, 2) == float('nan'))
54083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertFalse(float('nan') == F(3, 7))
54183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertFalse(F(5, 2) == float('inf'))
54283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertFalse(float('-inf') == F(2, 5))
54383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
54483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def testStringification(self):
54583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual("Fraction(7, 3)", repr(F(7, 3)))
54683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual("Fraction(6283185307, 2000000000)",
54783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                         repr(F('3.1415926535')))
54883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual("Fraction(-1, 100000000000000000000)",
54983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                         repr(F(1, -10**20)))
55083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual("7/3", str(F(7, 3)))
55183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual("7", str(F(7, 1)))
55283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
55383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def testHash(self):
55483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(hash(2.5), hash(F(5, 2)))
55583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(hash(10**50), hash(F(10**50)))
55683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertNotEqual(hash(float(10**23)), hash(F(10**23)))
55783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
55883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def testApproximatePi(self):
55983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # Algorithm borrowed from
56083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # http://docs.python.org/lib/decimal-recipes.html
56183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        three = F(3)
56283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        lasts, t, s, n, na, d, da = 0, three, 3, 1, 0, 0, 24
56383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        while abs(s - lasts) > F(1, 10**9):
56483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            lasts = s
56583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            n, na = n+na, na+8
56683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            d, da = d+da, da+32
56783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            t = (t * n) / d
56883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            s += t
56983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertAlmostEqual(math.pi, s)
57083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
57183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def testApproximateCos1(self):
57283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # Algorithm borrowed from
57383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # http://docs.python.org/lib/decimal-recipes.html
57483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        x = F(1)
57583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        i, lasts, s, fact, num, sign = 0, 0, F(1), 1, 1, 1
57683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        while abs(s - lasts) > F(1, 10**9):
57783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            lasts = s
57883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            i += 2
57983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            fact *= i * (i-1)
58083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            num *= x * x
58183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            sign *= -1
58283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            s += num / fact * sign
58383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertAlmostEqual(math.cos(1), s)
58483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
58583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def test_copy_deepcopy_pickle(self):
58683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        r = F(13, 7)
58783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        dr = DummyFraction(13, 7)
58883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(r, loads(dumps(r)))
58983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(id(r), id(copy(r)))
59083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertEqual(id(r), id(deepcopy(r)))
59183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertNotEqual(id(dr), id(copy(dr)))
59283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertNotEqual(id(dr), id(deepcopy(dr)))
59383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertTypedEquals(dr, copy(dr))
59483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertTypedEquals(dr, deepcopy(dr))
59583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
59683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def test_slots(self):
59783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # Issue 4998
59883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        r = F(13, 7)
59983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.assertRaises(AttributeError, setattr, r, 'a', 10)
60083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
60183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehdef test_main():
60283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    run_unittest(FractionTest, GcdTest)
60383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
60483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehif __name__ == '__main__':
60583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    test_main()
606