|
1 import test.test_support, unittest |
|
2 |
|
3 class PowTest(unittest.TestCase): |
|
4 |
|
5 def powtest(self, type): |
|
6 if type != float: |
|
7 for i in range(-1000, 1000): |
|
8 self.assertEquals(pow(type(i), 0), 1) |
|
9 self.assertEquals(pow(type(i), 1), type(i)) |
|
10 self.assertEquals(pow(type(0), 1), type(0)) |
|
11 self.assertEquals(pow(type(1), 1), type(1)) |
|
12 |
|
13 for i in range(-100, 100): |
|
14 self.assertEquals(pow(type(i), 3), i*i*i) |
|
15 |
|
16 pow2 = 1 |
|
17 for i in range(0,31): |
|
18 self.assertEquals(pow(2, i), pow2) |
|
19 if i != 30 : pow2 = pow2*2 |
|
20 |
|
21 for othertype in int, long: |
|
22 for i in range(-10, 0) + range(1, 10): |
|
23 ii = type(i) |
|
24 for j in range(1, 11): |
|
25 jj = -othertype(j) |
|
26 pow(ii, jj) |
|
27 |
|
28 for othertype in int, long, float: |
|
29 for i in range(1, 100): |
|
30 zero = type(0) |
|
31 exp = -othertype(i/10.0) |
|
32 if exp == 0: |
|
33 continue |
|
34 self.assertRaises(ZeroDivisionError, pow, zero, exp) |
|
35 |
|
36 il, ih = -20, 20 |
|
37 jl, jh = -5, 5 |
|
38 kl, kh = -10, 10 |
|
39 asseq = self.assertEqual |
|
40 if type == float: |
|
41 il = 1 |
|
42 asseq = self.assertAlmostEqual |
|
43 elif type == int: |
|
44 jl = 0 |
|
45 elif type == long: |
|
46 jl, jh = 0, 15 |
|
47 for i in range(il, ih+1): |
|
48 for j in range(jl, jh+1): |
|
49 for k in range(kl, kh+1): |
|
50 if k != 0: |
|
51 if type == float or j < 0: |
|
52 self.assertRaises(TypeError, pow, type(i), j, k) |
|
53 continue |
|
54 asseq( |
|
55 pow(type(i),j,k), |
|
56 pow(type(i),j)% type(k) |
|
57 ) |
|
58 |
|
59 def test_powint(self): |
|
60 self.powtest(int) |
|
61 |
|
62 def test_powlong(self): |
|
63 self.powtest(long) |
|
64 |
|
65 def test_powfloat(self): |
|
66 self.powtest(float) |
|
67 |
|
68 def test_other(self): |
|
69 # Other tests-- not very systematic |
|
70 self.assertEquals(pow(3,3) % 8, pow(3,3,8)) |
|
71 self.assertEquals(pow(3,3) % -8, pow(3,3,-8)) |
|
72 self.assertEquals(pow(3,2) % -2, pow(3,2,-2)) |
|
73 self.assertEquals(pow(-3,3) % 8, pow(-3,3,8)) |
|
74 self.assertEquals(pow(-3,3) % -8, pow(-3,3,-8)) |
|
75 self.assertEquals(pow(5,2) % -8, pow(5,2,-8)) |
|
76 |
|
77 self.assertEquals(pow(3L,3L) % 8, pow(3L,3L,8)) |
|
78 self.assertEquals(pow(3L,3L) % -8, pow(3L,3L,-8)) |
|
79 self.assertEquals(pow(3L,2) % -2, pow(3L,2,-2)) |
|
80 self.assertEquals(pow(-3L,3L) % 8, pow(-3L,3L,8)) |
|
81 self.assertEquals(pow(-3L,3L) % -8, pow(-3L,3L,-8)) |
|
82 self.assertEquals(pow(5L,2) % -8, pow(5L,2,-8)) |
|
83 |
|
84 for i in range(-10, 11): |
|
85 for j in range(0, 6): |
|
86 for k in range(-7, 11): |
|
87 if j >= 0 and k != 0: |
|
88 self.assertEquals( |
|
89 pow(i,j) % k, |
|
90 pow(i,j,k) |
|
91 ) |
|
92 if j >= 0 and k != 0: |
|
93 self.assertEquals( |
|
94 pow(long(i),j) % k, |
|
95 pow(long(i),j,k) |
|
96 ) |
|
97 |
|
98 def test_bug643260(self): |
|
99 class TestRpow: |
|
100 def __rpow__(self, other): |
|
101 return None |
|
102 None ** TestRpow() # Won't fail when __rpow__ invoked. SF bug #643260. |
|
103 |
|
104 def test_bug705231(self): |
|
105 # -1.0 raised to an integer should never blow up. It did if the |
|
106 # platform pow() was buggy, and Python didn't worm around it. |
|
107 eq = self.assertEquals |
|
108 a = -1.0 |
|
109 eq(pow(a, 1.23e167), 1.0) |
|
110 eq(pow(a, -1.23e167), 1.0) |
|
111 for b in range(-10, 11): |
|
112 eq(pow(a, float(b)), b & 1 and -1.0 or 1.0) |
|
113 for n in range(0, 100): |
|
114 fiveto = float(5 ** n) |
|
115 # For small n, fiveto will be odd. Eventually we run out of |
|
116 # mantissa bits, though, and thereafer fiveto will be even. |
|
117 expected = fiveto % 2.0 and -1.0 or 1.0 |
|
118 eq(pow(a, fiveto), expected) |
|
119 eq(pow(a, -fiveto), expected) |
|
120 eq(expected, 1.0) # else we didn't push fiveto to evenness |
|
121 |
|
122 def test_main(): |
|
123 test.test_support.run_unittest(PowTest) |
|
124 |
|
125 if __name__ == "__main__": |
|
126 test_main() |