3
#taken from CPython 2.3 (?)
6
Test module for class complex in complexobject.py
8
As it seems there are some numerical differences in
9
the __div__ and __divmod__ methods which have to be
21
from pypy.tool import test
22
from pypy.appspace.complexobject import complex as pycomplex
33
"Compare two complex or normal numbers. 0 if different, 1 if roughly equal."
35
numTypes = [types.IntType, types.LongType, types.FloatType]
36
da, db = dir(a), dir(b)
38
if 'real' in da and 'real' in db and 'imag' in da and 'imag' in db:
39
if math.fabs(a.real-b.real) > 1e-10:
41
if math.fabs(a.imag-b.imag) > 1e-10:
45
elif type(a) in numTypes and type(b) in numTypes:
46
if math.fabs(a-b) > 1e-10:
55
valueRange = xrange(-3, 3)
63
z0p = pycomplex(x0,y0)
64
z1p = pycomplex(x1,y1)
65
res.append((z0c, z1c, z0p, z1p))
72
class TestComplex(unittest.TestCase):
74
def assertAEqual(self, a, b):
76
raise self.failureException, '%s ~== %s'%(a, b)
78
def test_wrongInit1(self):
79
"Compare wrong init. with CPython."
86
self.fail('complex("1", "1")')
93
self.fail('complex("1", "1")')
96
def test_wrongInit2(self):
97
"Compare wrong init. with CPython."
104
self.fail('complex(1, "1")')
111
self.fail('complex(1, "1")')
114
def test_wrongInitFromString(self):
115
"Compare string init. with CPython."
117
if complex(" 3.14+J ") != 3.14+1j:
118
self.fail('complex(" 3.14+J )"')
119
if not equal(pycomplex(" 3.14+J "), pycomplex(3.14,1)):
120
self.fail('complex(" 3.14+J )"')
123
def test_wrongInitFromUnicodeString(self):
124
"Compare unicode string init. with CPython."
127
if complex(unicode(" 3.14+J ")) != 3.14+1j:
128
self.fail('complex(u" 3.14+J )"')
129
if not equal(pycomplex(unicode(" 3.14+J ")), pycomplex(3.14, 1)):
130
self.fail('complex(u" 3.14+J )"')
133
def test_class(self):
134
"Compare class with CPython."
137
def __complex__(self):
140
if complex(z) != 3.14j:
141
self.fail('complex(classinstance)')
143
if not equal(complex(z), pycomplex(0, 3.14)):
144
self.fail('complex(classinstance)')
147
def test_add_sub_mul_div(self):
148
"Compare add/sub/mul/div with CPython."
150
for (z0c, z1c, z0p, z1p) in enumerate():
153
self.assertAEqual(mc, mp)
157
self.assertAEqual(sc, sp)
161
self.assertAEqual(dc, dp)
163
if not equal(z1c, complex(0,0)):
166
self.assertAEqual(qc, qp)
169
def test_special(self):
170
"Compare special methods with CPython."
172
for (x, y) in [(0,0), (0,1), (1,3.)]:
176
self.assertAEqual(zc, zp)
177
self.assertAEqual(-zc, -zp)
178
self.assertAEqual(+zc, +zp)
179
self.assertAEqual(abs(zc), abs(zp))
180
self.assertAEqual(zc, zp)
181
self.assertEqual(zc.conjugate(), zp.conjugate())
182
self.assertEqual(str(zc), str(zp))
183
self.assertEqual(hash(zc), hash(zp))
186
# this fails on python2.3 and is depreacted anyway
187
def _test_divmod(self):
188
"Compare divmod with CPython."
190
for (z0c, z1c, z0p, z1p) in enumerate():
193
self.assertAEqual(mc, mp)
195
if not equal(z1c, complex(0,0)):
196
ddc, mmc = divmod(z0c, z1c)
197
self.assertAEqual(ddc*z1c + mmc, z0c)
198
ddp, mmp = divmod(z0p, z1p)
199
self.assertAEqual(ddp*z1p + mmp, z0p)
200
self.assertAEqual(ddc, ddp)
201
self.assertAEqual(mmc, mmp)
204
# these fail on python2.3
206
"Compare mod with CPython."
208
for (z0c, z1c, z0p, z1p) in enumerate():
211
self.assertAEqual(mc, mp)
213
if not equal(z1c, complex(0,0)):
216
self.assertAEqual(rc, rp)
219
"Compare mod with CPython."
221
for (z0c, z1c, z0p, z1p) in enumerate():
224
self.assertAEqual(mc, mp)
226
if not equal(z1c, complex(0,0)):
229
self.assertAEqual(rc, rp)
233
"Compare pow with CPython."
235
for (z0c, z1c, z0p, z1p) in enumerate():
236
if not equal(z0c, 0j) and (z1c.imag != 0.0):
239
self.assertAEqual(pc, pp)
242
self.assertAEqual(pc, pp)
244
if __name__ == "__main__":