Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code | Sign in
(46)

Side by Side Diff: Lib/test/test_random.py

Issue 602: range: lean and mean (Closed) SVN Base: http://svn.python.org/view/*checkout*/python/branches/py3k/
Patch Set: __len__ is back! Created 4 months, 1 week ago
Use n/p to move between diff chunks; N/P to move between comments. Please Sign in to add in-line comments.
Jump to:
View unified diff | Download patch
OLDNEW
1 #!/usr/bin/env python 1 #!/usr/bin/env python
2 2
3 import unittest 3 import unittest
4 import random 4 import random
5 import time 5 import time
6 import pickle 6 import pickle
7 import warnings 7 import warnings
8 from math import log, exp, sqrt, pi 8 from math import log, exp, sqrt, pi
9 from test import test_support 9 from test import test_support
10 10
11 class TestBasicOps(unittest.TestCase): 11 class TestBasicOps(unittest.TestCase):
12 # Superclass with tests common to all generators. 12 # Superclass with tests common to all generators.
13 # Subclasses must arrange for self.gen to retrieve the Random instance 13 # Subclasses must arrange for self.gen to retrieve the Random instance
14 # to be tested. 14 # to be tested.
15 15
16 def randomlist(self, n): 16 def randomlist(self, n):
17 """Helper function to make a list of random numbers""" 17 """Helper function to make a list of random numbers"""
18 return [self.gen.random() for i in range(n)] 18 return [self.gen.random() for i in range(n)]
19 19
20 def test_autoseed(self): 20 def test_autoseed(self):
21 self.gen.seed() 21 self.gen.seed()
22 state1 = self.gen.getstate() 22 state1 = self.gen.getstate()
23 time.sleep(0.1) 23 time.sleep(0.1)
24 self.gen.seed() # diffent seeds at different times 24 self.gen.seed() # diffent seeds at different times
25 state2 = self.gen.getstate() 25 state2 = self.gen.getstate()
26 self.assertNotEqual(state1, state2) 26 self.assertNotEqual(state1, state2)
27 27
28 def test_saverestore(self): 28 def test_saverestore(self):
29 N = 1000 29 N = 1000
30 self.gen.seed() 30 self.gen.seed()
31 state = self.gen.getstate() 31 state = self.gen.getstate()
32 randseq = self.randomlist(N) 32 randseq = self.randomlist(N)
33 self.gen.setstate(state) # should regenerate the same sequence 33 self.gen.setstate(state) # should regenerate the same sequence
34 self.assertEqual(randseq, self.randomlist(N)) 34 self.assertEqual(randseq, self.randomlist(N))
35 35
36 def test_seedargs(self): 36 def test_seedargs(self):
37 for arg in [None, 0, 0, 1, 1, -1, -1, 10**20, -(10**20), 37 for arg in [None, 0, 0, 1, 1, -1, -1, 10**20, -(10**20),
38 3.14, 1+2j, 'a', tuple('abc')]: 38 3.14, 1+2j, 'a', tuple('abc')]:
39 self.gen.seed(arg) 39 self.gen.seed(arg)
40 for arg in [list(range(3)), dict(one=1)]: 40 for arg in [list(range(3)), dict(one=1)]:
41 self.assertRaises(TypeError, self.gen.seed, arg) 41 self.assertRaises(TypeError, self.gen.seed, arg)
42 self.assertRaises(TypeError, self.gen.seed, 1, 2) 42 self.assertRaises(TypeError, self.gen.seed, 1, 2)
43 self.assertRaises(TypeError, type(self.gen), []) 43 self.assertRaises(TypeError, type(self.gen), [])
44 44
45 def test_sample(self): 45 def test_sample(self):
46 # For the entire allowable range of 0 <= k <= N, validate that 46 # For the entire allowable range of 0 <= k <= N, validate that
47 # the sample is of the correct length and contains only unique items 47 # the sample is of the correct length and contains only unique items
48 N = 100 48 N = 100
49 population = range(N) 49 population = list(range(N))
50 for k in range(N+1): 50 for k in range(N+1):
51 s = self.gen.sample(population, k) 51 s = self.gen.sample(population, k)
52 self.assertEqual(len(s), k) 52 self.assertEqual(len(s), k)
53 uniq = set(s) 53 uniq = set(s)
54 self.assertEqual(len(uniq), k) 54 self.assertEqual(len(uniq), k)
55 self.failUnless(uniq <= set(population)) 55 self.failUnless(uniq <= set(population))
56 self.assertEqual(self.gen.sample([], 0), []) # test edge case N==k==0 56 self.assertEqual(self.gen.sample([], 0), []) # test edge case N==k==0
57 57
58 def test_sample_distribution(self): 58 def test_sample_distribution(self):
59 # For the entire allowable range of 0 <= k <= N, validate that 59 # For the entire allowable range of 0 <= k <= N, validate that
60 # sample generates all possible permutations 60 # sample generates all possible permutations
61 n = 5 61 n = 5
62 pop = range(n) 62 pop = list(range(n))
63 trials = 10000 # large num prevents false negatives without slowing nor mal case 63 trials = 10000 # large num prevents false negatives without slowing nor mal case
64 def factorial(n): 64 def factorial(n):
65 if n == 0: 65 if n == 0:
66 return 1 66 return 1
67 return n * factorial(n - 1) 67 return n * factorial(n - 1)
68 for k in range(n): 68 for k in range(n):
69 expected = factorial(n) // factorial(n-k) 69 expected = factorial(n) // factorial(n-k)
70 perms = {} 70 perms = {}
71 for i in range(trials): 71 for i in range(trials):
72 perms[tuple(self.gen.sample(pop, k))] = None 72 perms[tuple(self.gen.sample(pop, k))] = None
73 if len(perms) == expected: 73 if len(perms) == expected:
74 break 74 break
75 else: 75 else:
76 self.fail() 76 self.fail()
77 77
78 def test_sample_inputs(self): 78 def test_sample_inputs(self):
79 # SF bug #801342 -- population can be any iterable defining __len__() 79 # SF bug #801342 -- population can be any iterable defining __len__()
80 self.gen.sample(set(range(20)), 2) 80 self.gen.sample(set(range(20)), 2)
81 self.gen.sample(range(20), 2) 81 self.gen.sample(list(range(20)), 2)
82 self.gen.sample(range(20), 2) 82 self.gen.sample(list(range(20)), 2)
83 self.gen.sample(str('abcdefghijklmnopqrst'), 2) 83 self.gen.sample(str('abcdefghijklmnopqrst'), 2)
84 self.gen.sample(tuple('abcdefghijklmnopqrst'), 2) 84 self.gen.sample(tuple('abcdefghijklmnopqrst'), 2)
85 85
86 def test_sample_on_dicts(self): 86 def test_sample_on_dicts(self):
87 self.assertRaises(TypeError, self.gen.sample, dict.fromkeys('abcdef'), 2 ) 87 self.assertRaises(TypeError, self.gen.sample, dict.fromkeys('abcdef'), 2 )
88 88
89 def test_gauss(self): 89 def test_gauss(self):
90 # Ensure that the seed() method initializes all the hidden state. In 90 # Ensure that the seed() method initializes all the hidden state. In
91 # particular, through 2.2.1 it failed to reset a piece of state used 91 # particular, through 2.2.1 it failed to reset a piece of state used
92 # by (and only by) the .gauss() method. 92 # by (and only by) the .gauss() method.
93 93
94 for seed in 1, 12, 123, 1234, 12345, 123456, 654321: 94 for seed in 1, 12, 123, 1234, 12345, 123456, 654321:
95 self.gen.seed(seed) 95 self.gen.seed(seed)
96 x1 = self.gen.random() 96 x1 = self.gen.random()
97 y1 = self.gen.gauss(0, 1) 97 y1 = self.gen.gauss(0, 1)
98 98
99 self.gen.seed(seed) 99 self.gen.seed(seed)
100 x2 = self.gen.random() 100 x2 = self.gen.random()
101 y2 = self.gen.gauss(0, 1) 101 y2 = self.gen.gauss(0, 1)
102 102
103 self.assertEqual(x1, x2) 103 self.assertEqual(x1, x2)
104 self.assertEqual(y1, y2) 104 self.assertEqual(y1, y2)
105 105
106 def test_pickling(self): 106 def test_pickling(self):
107 state = pickle.dumps(self.gen) 107 state = pickle.dumps(self.gen)
108 origseq = [self.gen.random() for i in range(10)] 108 origseq = [self.gen.random() for i in range(10)]
109 newgen = pickle.loads(state) 109 newgen = pickle.loads(state)
110 restoredseq = [newgen.random() for i in range(10)] 110 restoredseq = [newgen.random() for i in range(10)]
111 self.assertEqual(origseq, restoredseq) 111 self.assertEqual(origseq, restoredseq)
112 112
113 def test_bug_1727780(self): 113 def test_bug_1727780(self):
114 # verify that version-2-pickles can be loaded 114 # verify that version-2-pickles can be loaded
115 # fine, whether they are created on 32-bit or 64-bit 115 # fine, whether they are created on 32-bit or 64-bit
116 # platforms, and that version-3-pickles load fine. 116 # platforms, and that version-3-pickles load fine.
117 files = [("randv2_32.pck", 780), 117 files = [("randv2_32.pck", 780),
118 ("randv2_64.pck", 866), 118 ("randv2_64.pck", 866),
119 ("randv3.pck", 343)] 119 ("randv3.pck", 343)]
120 for file, value in files: 120 for file, value in files:
121 f = open(test_support.findfile(file),"rb") 121 f = open(test_support.findfile(file),"rb")
122 r = pickle.load(f) 122 r = pickle.load(f)
123 f.close() 123 f.close()
124 self.assertEqual(r.randrange(1000), value) 124 self.assertEqual(r.randrange(1000), value)
125 125
126 class SystemRandom_TestBasicOps(TestBasicOps): 126 class SystemRandom_TestBasicOps(TestBasicOps):
127 gen = random.SystemRandom() 127 gen = random.SystemRandom()
128 128
129 def test_autoseed(self): 129 def test_autoseed(self):
130 # Doesn't need to do anything except not fail 130 # Doesn't need to do anything except not fail
131 self.gen.seed() 131 self.gen.seed()
132 132
(...skipping 307 matching lines...) Show 10 above Show 10 below
440 s1 += e 440 s1 += e
441 s2 += (e - mu) ** 2 441 s2 += (e - mu) ** 2
442 N = len(y) 442 N = len(y)
443 self.assertAlmostEqual(s1/N, mu, places=2) 443 self.assertAlmostEqual(s1/N, mu, places=2)
444 self.assertAlmostEqual(s2/(N-1), sigmasqrd, places=2) 444 self.assertAlmostEqual(s2/(N-1), sigmasqrd, places=2)
445 445
446 class TestModule(unittest.TestCase): 446 class TestModule(unittest.TestCase):
447 def testMagicConstants(self): 447 def testMagicConstants(self):
448 self.assertAlmostEqual(random.NV_MAGICCONST, 1.71552776992141) 448 self.assertAlmostEqual(random.NV_MAGICCONST, 1.71552776992141)
449 self.assertAlmostEqual(random.TWOPI, 6.28318530718) 449 self.assertAlmostEqual(random.TWOPI, 6.28318530718)
450 self.assertAlmostEqual(random.LOG4, 1.38629436111989) 450 self.assertAlmostEqual(random.LOG4, 1.38629436111989)
451 self.assertAlmostEqual(random.SG_MAGICCONST, 2.50407739677627) 451 self.assertAlmostEqual(random.SG_MAGICCONST, 2.50407739677627)
452 452
453 def test__all__(self): 453 def test__all__(self):
454 # tests validity but not completeness of the __all__ list 454 # tests validity but not completeness of the __all__ list
455 self.failUnless(set(random.__all__) <= set(dir(random))) 455 self.failUnless(set(random.__all__) <= set(dir(random)))
456 456
457 def test_random_subclass_with_kwargs(self): 457 def test_random_subclass_with_kwargs(self):
458 # SF bug #1486663 -- this used to erroneously raise a TypeError 458 # SF bug #1486663 -- this used to erroneously raise a TypeError
459 class Subclass(random.Random): 459 class Subclass(random.Random):
460 def __init__(self, newarg=None): 460 def __init__(self, newarg=None):
461 random.Random.__init__(self) 461 random.Random.__init__(self)
462 Subclass(newarg=1) 462 Subclass(newarg=1)
463 463
464 464
465 def test_main(verbose=None): 465 def test_main(verbose=None):
466 testclasses = [MersenneTwister_TestBasicOps, 466 testclasses = [MersenneTwister_TestBasicOps,
467 TestDistributions, 467 TestDistributions,
468 TestModule] 468 TestModule]
469 469
470 try: 470 try:
471 random.SystemRandom().random() 471 random.SystemRandom().random()
472 except NotImplementedError: 472 except NotImplementedError:
473 pass 473 pass
474 else: 474 else:
475 testclasses.append(SystemRandom_TestBasicOps) 475 testclasses.append(SystemRandom_TestBasicOps)
476 476
477 test_support.run_unittest(*testclasses) 477 test_support.run_unittest(*testclasses)
478 478
479 # verify reference counting 479 # verify reference counting
480 import sys 480 import sys
481 if verbose and hasattr(sys, "gettotalrefcount"): 481 if verbose and hasattr(sys, "gettotalrefcount"):
482 counts = [None] * 5 482 counts = [None] * 5
483 for i in range(len(counts)): 483 for i in range(len(counts)):
484 test_support.run_unittest(*testclasses) 484 test_support.run_unittest(*testclasses)
485 counts[i] = sys.gettotalrefcount() 485 counts[i] = sys.gettotalrefcount()
486 print(counts) 486 print(counts)
487 487
488 if __name__ == "__main__": 488 if __name__ == "__main__":
489 test_main(verbose=True) 489 test_main(verbose=True)
OLDNEW

Powered by Google App Engine
This is Rietveld r305