1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200
|
"""Unit tests for numbers.py."""
import abc
import math
import operator
import unittest
from numbers import Complex, Real, Rational, Integral, Number
def concretize(cls):
def not_implemented(*args, **kwargs):
raise NotImplementedError()
for name in dir(cls):
try:
value = getattr(cls, name)
if value.__isabstractmethod__:
setattr(cls, name, not_implemented)
except AttributeError:
pass
abc.update_abstractmethods(cls)
return cls
class TestNumbers(unittest.TestCase):
def test_int(self):
self.assertTrue(issubclass(int, Integral))
self.assertTrue(issubclass(int, Rational))
self.assertTrue(issubclass(int, Real))
self.assertTrue(issubclass(int, Complex))
self.assertTrue(issubclass(int, Number))
self.assertEqual(7, int(7).real)
self.assertEqual(0, int(7).imag)
self.assertEqual(7, int(7).conjugate())
self.assertEqual(-7, int(-7).conjugate())
self.assertEqual(7, int(7).numerator)
self.assertEqual(1, int(7).denominator)
def test_float(self):
self.assertFalse(issubclass(float, Integral))
self.assertFalse(issubclass(float, Rational))
self.assertTrue(issubclass(float, Real))
self.assertTrue(issubclass(float, Complex))
self.assertTrue(issubclass(float, Number))
self.assertEqual(7.3, float(7.3).real)
self.assertEqual(0, float(7.3).imag)
self.assertEqual(7.3, float(7.3).conjugate())
self.assertEqual(-7.3, float(-7.3).conjugate())
def test_complex(self):
self.assertFalse(issubclass(complex, Integral))
self.assertFalse(issubclass(complex, Rational))
self.assertFalse(issubclass(complex, Real))
self.assertTrue(issubclass(complex, Complex))
self.assertTrue(issubclass(complex, Number))
c1, c2 = complex(3, 2), complex(4,1)
# XXX: This is not ideal, but see the comment in math_trunc().
self.assertRaises(TypeError, math.trunc, c1)
self.assertRaises(TypeError, operator.mod, c1, c2)
self.assertRaises(TypeError, divmod, c1, c2)
self.assertRaises(TypeError, operator.floordiv, c1, c2)
self.assertRaises(TypeError, float, c1)
self.assertRaises(TypeError, int, c1)
class TestNumbersDefaultMethods(unittest.TestCase):
def test_complex(self):
@concretize
class MyComplex(Complex):
def __init__(self, real, imag):
self.r = real
self.i = imag
@property
def real(self):
return self.r
@property
def imag(self):
return self.i
def __add__(self, other):
if isinstance(other, Complex):
return MyComplex(self.imag + other.imag,
self.real + other.real)
raise NotImplementedError
def __neg__(self):
return MyComplex(-self.real, -self.imag)
def __eq__(self, other):
if isinstance(other, Complex):
return self.imag == other.imag and self.real == other.real
if isinstance(other, Number):
return self.imag == 0 and self.real == other.real
# test __bool__
self.assertTrue(bool(MyComplex(1, 1)))
self.assertTrue(bool(MyComplex(0, 1)))
self.assertTrue(bool(MyComplex(1, 0)))
self.assertFalse(bool(MyComplex(0, 0)))
# test __sub__
self.assertEqual(MyComplex(2, 3) - complex(1, 2), MyComplex(1, 1))
# test __rsub__
self.assertEqual(complex(2, 3) - MyComplex(1, 2), MyComplex(1, 1))
def test_real(self):
@concretize
class MyReal(Real):
def __init__(self, n):
self.n = n
def __pos__(self):
return self.n
def __float__(self):
return float(self.n)
def __floordiv__(self, other):
return self.n // other
def __rfloordiv__(self, other):
return other // self.n
def __mod__(self, other):
return self.n % other
def __rmod__(self, other):
return other % self.n
# test __divmod__
self.assertEqual(divmod(MyReal(3), 2), (1, 1))
# test __rdivmod__
self.assertEqual(divmod(3, MyReal(2)), (1, 1))
# test __complex__
self.assertEqual(complex(MyReal(1)), 1+0j)
# test real
self.assertEqual(MyReal(3).real, 3)
# test imag
self.assertEqual(MyReal(3).imag, 0)
# test conjugate
self.assertEqual(MyReal(123).conjugate(), 123)
def test_rational(self):
@concretize
class MyRational(Rational):
def __init__(self, numerator, denominator):
self.n = numerator
self.d = denominator
@property
def numerator(self):
return self.n
@property
def denominator(self):
return self.d
# test__float__
self.assertEqual(float(MyRational(5, 2)), 2.5)
def test_integral(self):
@concretize
class MyIntegral(Integral):
def __init__(self, n):
self.n = n
def __pos__(self):
return self.n
def __int__(self):
return self.n
# test __index__
self.assertEqual(operator.index(MyIntegral(123)), 123)
# test __float__
self.assertEqual(float(MyIntegral(123)), 123.0)
# test numerator
self.assertEqual(MyIntegral(123).numerator, 123)
# test denominator
self.assertEqual(MyIntegral(123).denominator, 1)
if __name__ == "__main__":
unittest.main()
|