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