python-2.5.2/win32/Lib/test/test_pow.py
changeset 0 ae805ac0140d
equal deleted inserted replaced
-1:000000000000 0:ae805ac0140d
       
     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()