| OLD | NEW |
| 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) |
| OLD | NEW |