python-2.5.2/win32/Lib/test/test_tuple.py
changeset 0 ae805ac0140d
equal deleted inserted replaced
-1:000000000000 0:ae805ac0140d
       
     1 import unittest
       
     2 from test import test_support, seq_tests
       
     3 
       
     4 class TupleTest(seq_tests.CommonTest):
       
     5     type2test = tuple
       
     6 
       
     7     def test_constructors(self):
       
     8         super(TupleTest, self).test_len()
       
     9         # calling built-in types without argument must return empty
       
    10         self.assertEqual(tuple(), ())
       
    11 
       
    12     def test_truth(self):
       
    13         super(TupleTest, self).test_truth()
       
    14         self.assert_(not ())
       
    15         self.assert_((42, ))
       
    16 
       
    17     def test_len(self):
       
    18         super(TupleTest, self).test_len()
       
    19         self.assertEqual(len(()), 0)
       
    20         self.assertEqual(len((0,)), 1)
       
    21         self.assertEqual(len((0, 1, 2)), 3)
       
    22 
       
    23     def test_iadd(self):
       
    24         super(TupleTest, self).test_iadd()
       
    25         u = (0, 1)
       
    26         u2 = u
       
    27         u += (2, 3)
       
    28         self.assert_(u is not u2)
       
    29 
       
    30     def test_imul(self):
       
    31         super(TupleTest, self).test_imul()
       
    32         u = (0, 1)
       
    33         u2 = u
       
    34         u *= 3
       
    35         self.assert_(u is not u2)
       
    36 
       
    37     def test_tupleresizebug(self):
       
    38         # Check that a specific bug in _PyTuple_Resize() is squashed.
       
    39         def f():
       
    40             for i in range(1000):
       
    41                 yield i
       
    42         self.assertEqual(list(tuple(f())), range(1000))
       
    43 
       
    44     def test_hash(self):
       
    45         # See SF bug 942952:  Weakness in tuple hash
       
    46         # The hash should:
       
    47         #      be non-commutative
       
    48         #      should spread-out closely spaced values
       
    49         #      should not exhibit cancellation in tuples like (x,(x,y))
       
    50         #      should be distinct from element hashes:  hash(x)!=hash((x,))
       
    51         # This test exercises those cases.
       
    52         # For a pure random hash and N=50, the expected number of occupied
       
    53         #      buckets when tossing 252,600 balls into 2**32 buckets
       
    54         #      is 252,592.6, or about 7.4 expected collisions.  The
       
    55         #      standard deviation is 2.73.  On a box with 64-bit hash
       
    56         #      codes, no collisions are expected.  Here we accept no
       
    57         #      more than 15 collisions.  Any worse and the hash function
       
    58         #      is sorely suspect.
       
    59 
       
    60         N=50
       
    61         base = range(N)
       
    62         xp = [(i, j) for i in base for j in base]
       
    63         inps = base + [(i, j) for i in base for j in xp] + \
       
    64                      [(i, j) for i in xp for j in base] + xp + zip(base)
       
    65         collisions = len(inps) - len(set(map(hash, inps)))
       
    66         self.assert_(collisions <= 15)
       
    67 
       
    68     def test_repr(self):
       
    69         l0 = tuple()
       
    70         l2 = (0, 1, 2)
       
    71         a0 = self.type2test(l0)
       
    72         a2 = self.type2test(l2)
       
    73 
       
    74         self.assertEqual(str(a0), repr(l0))
       
    75         self.assertEqual(str(a2), repr(l2))
       
    76         self.assertEqual(repr(a0), "()")
       
    77         self.assertEqual(repr(a2), "(0, 1, 2)")
       
    78 
       
    79 def test_main():
       
    80     test_support.run_unittest(TupleTest)
       
    81 
       
    82 if __name__=="__main__":
       
    83     test_main()