Commit | Line | Data |
---|---|---|
920dae64 AT |
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() |