mirror of
				https://github.com/python/cpython.git
				synced 2025-11-04 03:44:55 +00:00 
			
		
		
		
	imports of test modules now import from the test package. Other related oddities are also fixed (like DeprecationWarning filters that weren't specifying the full import part, etc.). Also did a general code cleanup to remove all "from test.test_support import *"'s. Other from...import *'s weren't changed.
		
			
				
	
	
		
			91 lines
		
	
	
	
		
			2.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			91 lines
		
	
	
	
		
			2.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
from test.test_support import TestFailed, vereq
 | 
						|
from random import random
 | 
						|
 | 
						|
# These tests ensure that complex math does the right thing; tests of
 | 
						|
# the complex() function/constructor are in test_b1.py.
 | 
						|
 | 
						|
# XXX need many, many more tests here.
 | 
						|
 | 
						|
nerrors = 0
 | 
						|
 | 
						|
def check_close_real(x, y, eps=1e-9):
 | 
						|
    """Return true iff floats x and y "are close\""""
 | 
						|
    # put the one with larger magnitude second
 | 
						|
    if abs(x) > abs(y):
 | 
						|
        x, y = y, x
 | 
						|
    if y == 0:
 | 
						|
        return abs(x) < eps
 | 
						|
    if x == 0:
 | 
						|
        return abs(y) < eps
 | 
						|
    # check that relative difference < eps
 | 
						|
    return abs((x-y)/y) < eps
 | 
						|
 | 
						|
def check_close(x, y, eps=1e-9):
 | 
						|
    """Return true iff complexes x and y "are close\""""
 | 
						|
    return check_close_real(x.real, y.real, eps) and \
 | 
						|
           check_close_real(x.imag, y.imag, eps)
 | 
						|
 | 
						|
def test_div(x, y):
 | 
						|
    """Compute complex z=x*y, and check that z/x==y and z/y==x."""
 | 
						|
    global nerrors
 | 
						|
    z = x * y
 | 
						|
    if x != 0:
 | 
						|
        q = z / x
 | 
						|
        if not check_close(q, y):
 | 
						|
            nerrors += 1
 | 
						|
            print "%r / %r == %r but expected %r" % (z, x, q, y)
 | 
						|
    if y != 0:
 | 
						|
        q = z / y
 | 
						|
        if not check_close(q, x):
 | 
						|
            nerrors += 1
 | 
						|
            print "%r / %r == %r but expected %r" % (z, y, q, x)
 | 
						|
 | 
						|
simple_real = [float(i) for i in range(-5, 6)]
 | 
						|
simple_complex = [complex(x, y) for x in simple_real for y in simple_real]
 | 
						|
for x in simple_complex:
 | 
						|
    for y in simple_complex:
 | 
						|
        test_div(x, y)
 | 
						|
 | 
						|
# A naive complex division algorithm (such as in 2.0) is very prone to
 | 
						|
# nonsense errors for these (overflows and underflows).
 | 
						|
test_div(complex(1e200, 1e200), 1+0j)
 | 
						|
test_div(complex(1e-200, 1e-200), 1+0j)
 | 
						|
 | 
						|
# Just for fun.
 | 
						|
for i in range(100):
 | 
						|
    test_div(complex(random(), random()),
 | 
						|
             complex(random(), random()))
 | 
						|
 | 
						|
for i in range(100):
 | 
						|
    if not complex(random() + 1e-6, random() + 1e-6):
 | 
						|
        raise TestFailed("complex(random(), random()) should be true")
 | 
						|
 | 
						|
if complex(0.0, 0.0):
 | 
						|
    raise TestFailed("complex(0.0, 0.0) should be false")
 | 
						|
 | 
						|
vereq(complex(5.3, 9.8).conjugate(), 5.3-9.8j)
 | 
						|
 | 
						|
try:
 | 
						|
    print int(5+3j)
 | 
						|
except TypeError:
 | 
						|
    pass
 | 
						|
else:
 | 
						|
    raise TestFailed("int(complex()) didn't raise TypeError")
 | 
						|
 | 
						|
try:
 | 
						|
    print float(5+3j)
 | 
						|
except TypeError:
 | 
						|
    pass
 | 
						|
else:
 | 
						|
    raise TestFailed("float(complex()) didn't raise TypeError")
 | 
						|
 | 
						|
try:
 | 
						|
    z = 1.0 / (0+0j)
 | 
						|
except ZeroDivisionError:
 | 
						|
    pass
 | 
						|
else:
 | 
						|
    nerrors += 1
 | 
						|
    raise TestFailed("Division by complex 0 didn't raise ZeroDivisionError")
 | 
						|
 | 
						|
if nerrors:
 | 
						|
    raise TestFailed("%d tests failed" % nerrors)
 |