|
1 #!/usr/bin/env python |
|
2 |
|
3 import unittest |
|
4 import random |
|
5 import time |
|
6 import pickle |
|
7 import warnings |
|
8 from math import log, exp, sqrt, pi |
|
9 from test import test_support |
|
10 |
|
11 class TestBasicOps(unittest.TestCase): |
|
12 # Superclass with tests common to all generators. |
|
13 # Subclasses must arrange for self.gen to retrieve the Random instance |
|
14 # to be tested. |
|
15 |
|
16 def randomlist(self, n): |
|
17 """Helper function to make a list of random numbers""" |
|
18 return [self.gen.random() for i in xrange(n)] |
|
19 |
|
20 def test_autoseed(self): |
|
21 self.gen.seed() |
|
22 state1 = self.gen.getstate() |
|
23 time.sleep(0.1) |
|
24 self.gen.seed() # diffent seeds at different times |
|
25 state2 = self.gen.getstate() |
|
26 self.assertNotEqual(state1, state2) |
|
27 |
|
28 def test_saverestore(self): |
|
29 N = 1000 |
|
30 self.gen.seed() |
|
31 state = self.gen.getstate() |
|
32 randseq = self.randomlist(N) |
|
33 self.gen.setstate(state) # should regenerate the same sequence |
|
34 self.assertEqual(randseq, self.randomlist(N)) |
|
35 |
|
36 def test_seedargs(self): |
|
37 for arg in [None, 0, 0L, 1, 1L, -1, -1L, 10**20, -(10**20), |
|
38 3.14, 1+2j, 'a', tuple('abc')]: |
|
39 self.gen.seed(arg) |
|
40 for arg in [range(3), dict(one=1)]: |
|
41 self.assertRaises(TypeError, self.gen.seed, arg) |
|
42 self.assertRaises(TypeError, self.gen.seed, 1, 2) |
|
43 self.assertRaises(TypeError, type(self.gen), []) |
|
44 |
|
45 def test_jumpahead(self): |
|
46 self.gen.seed() |
|
47 state1 = self.gen.getstate() |
|
48 self.gen.jumpahead(100) |
|
49 state2 = self.gen.getstate() # s/b distinct from state1 |
|
50 self.assertNotEqual(state1, state2) |
|
51 self.gen.jumpahead(100) |
|
52 state3 = self.gen.getstate() # s/b distinct from state2 |
|
53 self.assertNotEqual(state2, state3) |
|
54 |
|
55 self.assertRaises(TypeError, self.gen.jumpahead) # needs an arg |
|
56 self.assertRaises(TypeError, self.gen.jumpahead, "ick") # wrong type |
|
57 self.assertRaises(TypeError, self.gen.jumpahead, 2.3) # wrong type |
|
58 self.assertRaises(TypeError, self.gen.jumpahead, 2, 3) # too many |
|
59 |
|
60 def test_sample(self): |
|
61 # For the entire allowable range of 0 <= k <= N, validate that |
|
62 # the sample is of the correct length and contains only unique items |
|
63 N = 100 |
|
64 population = xrange(N) |
|
65 for k in xrange(N+1): |
|
66 s = self.gen.sample(population, k) |
|
67 self.assertEqual(len(s), k) |
|
68 uniq = set(s) |
|
69 self.assertEqual(len(uniq), k) |
|
70 self.failUnless(uniq <= set(population)) |
|
71 self.assertEqual(self.gen.sample([], 0), []) # test edge case N==k==0 |
|
72 |
|
73 def test_sample_distribution(self): |
|
74 # For the entire allowable range of 0 <= k <= N, validate that |
|
75 # sample generates all possible permutations |
|
76 n = 5 |
|
77 pop = range(n) |
|
78 trials = 10000 # large num prevents false negatives without slowing normal case |
|
79 def factorial(n): |
|
80 return reduce(int.__mul__, xrange(1, n), 1) |
|
81 for k in xrange(n): |
|
82 expected = factorial(n) // factorial(n-k) |
|
83 perms = {} |
|
84 for i in xrange(trials): |
|
85 perms[tuple(self.gen.sample(pop, k))] = None |
|
86 if len(perms) == expected: |
|
87 break |
|
88 else: |
|
89 self.fail() |
|
90 |
|
91 def test_sample_inputs(self): |
|
92 # SF bug #801342 -- population can be any iterable defining __len__() |
|
93 self.gen.sample(set(range(20)), 2) |
|
94 self.gen.sample(range(20), 2) |
|
95 self.gen.sample(xrange(20), 2) |
|
96 self.gen.sample(str('abcdefghijklmnopqrst'), 2) |
|
97 self.gen.sample(tuple('abcdefghijklmnopqrst'), 2) |
|
98 |
|
99 def test_sample_on_dicts(self): |
|
100 self.gen.sample(dict.fromkeys('abcdefghijklmnopqrst'), 2) |
|
101 |
|
102 # SF bug #1460340 -- random.sample can raise KeyError |
|
103 a = dict.fromkeys(range(10)+range(10,100,2)+range(100,110)) |
|
104 self.gen.sample(a, 3) |
|
105 |
|
106 # A followup to bug #1460340: sampling from a dict could return |
|
107 # a subset of its keys or of its values, depending on the size of |
|
108 # the subset requested. |
|
109 N = 30 |
|
110 d = dict((i, complex(i, i)) for i in xrange(N)) |
|
111 for k in xrange(N+1): |
|
112 samp = self.gen.sample(d, k) |
|
113 # Verify that we got ints back (keys); the values are complex. |
|
114 for x in samp: |
|
115 self.assert_(type(x) is int) |
|
116 samp.sort() |
|
117 self.assertEqual(samp, range(N)) |
|
118 |
|
119 def test_gauss(self): |
|
120 # Ensure that the seed() method initializes all the hidden state. In |
|
121 # particular, through 2.2.1 it failed to reset a piece of state used |
|
122 # by (and only by) the .gauss() method. |
|
123 |
|
124 for seed in 1, 12, 123, 1234, 12345, 123456, 654321: |
|
125 self.gen.seed(seed) |
|
126 x1 = self.gen.random() |
|
127 y1 = self.gen.gauss(0, 1) |
|
128 |
|
129 self.gen.seed(seed) |
|
130 x2 = self.gen.random() |
|
131 y2 = self.gen.gauss(0, 1) |
|
132 |
|
133 self.assertEqual(x1, x2) |
|
134 self.assertEqual(y1, y2) |
|
135 |
|
136 def test_pickling(self): |
|
137 state = pickle.dumps(self.gen) |
|
138 origseq = [self.gen.random() for i in xrange(10)] |
|
139 newgen = pickle.loads(state) |
|
140 restoredseq = [newgen.random() for i in xrange(10)] |
|
141 self.assertEqual(origseq, restoredseq) |
|
142 |
|
143 class WichmannHill_TestBasicOps(TestBasicOps): |
|
144 gen = random.WichmannHill() |
|
145 |
|
146 def test_setstate_first_arg(self): |
|
147 self.assertRaises(ValueError, self.gen.setstate, (2, None, None)) |
|
148 |
|
149 def test_strong_jumpahead(self): |
|
150 # tests that jumpahead(n) semantics correspond to n calls to random() |
|
151 N = 1000 |
|
152 s = self.gen.getstate() |
|
153 self.gen.jumpahead(N) |
|
154 r1 = self.gen.random() |
|
155 # now do it the slow way |
|
156 self.gen.setstate(s) |
|
157 for i in xrange(N): |
|
158 self.gen.random() |
|
159 r2 = self.gen.random() |
|
160 self.assertEqual(r1, r2) |
|
161 |
|
162 def test_gauss_with_whseed(self): |
|
163 # Ensure that the seed() method initializes all the hidden state. In |
|
164 # particular, through 2.2.1 it failed to reset a piece of state used |
|
165 # by (and only by) the .gauss() method. |
|
166 |
|
167 for seed in 1, 12, 123, 1234, 12345, 123456, 654321: |
|
168 self.gen.whseed(seed) |
|
169 x1 = self.gen.random() |
|
170 y1 = self.gen.gauss(0, 1) |
|
171 |
|
172 self.gen.whseed(seed) |
|
173 x2 = self.gen.random() |
|
174 y2 = self.gen.gauss(0, 1) |
|
175 |
|
176 self.assertEqual(x1, x2) |
|
177 self.assertEqual(y1, y2) |
|
178 |
|
179 def test_bigrand(self): |
|
180 # Verify warnings are raised when randrange is too large for random() |
|
181 oldfilters = warnings.filters[:] |
|
182 warnings.filterwarnings("error", "Underlying random") |
|
183 self.assertRaises(UserWarning, self.gen.randrange, 2**60) |
|
184 warnings.filters[:] = oldfilters |
|
185 |
|
186 class SystemRandom_TestBasicOps(TestBasicOps): |
|
187 gen = random.SystemRandom() |
|
188 |
|
189 def test_autoseed(self): |
|
190 # Doesn't need to do anything except not fail |
|
191 self.gen.seed() |
|
192 |
|
193 def test_saverestore(self): |
|
194 self.assertRaises(NotImplementedError, self.gen.getstate) |
|
195 self.assertRaises(NotImplementedError, self.gen.setstate, None) |
|
196 |
|
197 def test_seedargs(self): |
|
198 # Doesn't need to do anything except not fail |
|
199 self.gen.seed(100) |
|
200 |
|
201 def test_jumpahead(self): |
|
202 # Doesn't need to do anything except not fail |
|
203 self.gen.jumpahead(100) |
|
204 |
|
205 def test_gauss(self): |
|
206 self.gen.gauss_next = None |
|
207 self.gen.seed(100) |
|
208 self.assertEqual(self.gen.gauss_next, None) |
|
209 |
|
210 def test_pickling(self): |
|
211 self.assertRaises(NotImplementedError, pickle.dumps, self.gen) |
|
212 |
|
213 def test_53_bits_per_float(self): |
|
214 # This should pass whenever a C double has 53 bit precision. |
|
215 span = 2 ** 53 |
|
216 cum = 0 |
|
217 for i in xrange(100): |
|
218 cum |= int(self.gen.random() * span) |
|
219 self.assertEqual(cum, span-1) |
|
220 |
|
221 def test_bigrand(self): |
|
222 # The randrange routine should build-up the required number of bits |
|
223 # in stages so that all bit positions are active. |
|
224 span = 2 ** 500 |
|
225 cum = 0 |
|
226 for i in xrange(100): |
|
227 r = self.gen.randrange(span) |
|
228 self.assert_(0 <= r < span) |
|
229 cum |= r |
|
230 self.assertEqual(cum, span-1) |
|
231 |
|
232 def test_bigrand_ranges(self): |
|
233 for i in [40,80, 160, 200, 211, 250, 375, 512, 550]: |
|
234 start = self.gen.randrange(2 ** i) |
|
235 stop = self.gen.randrange(2 ** (i-2)) |
|
236 if stop <= start: |
|
237 return |
|
238 self.assert_(start <= self.gen.randrange(start, stop) < stop) |
|
239 |
|
240 def test_rangelimits(self): |
|
241 for start, stop in [(-2,0), (-(2**60)-2,-(2**60)), (2**60,2**60+2)]: |
|
242 self.assertEqual(set(range(start,stop)), |
|
243 set([self.gen.randrange(start,stop) for i in xrange(100)])) |
|
244 |
|
245 def test_genrandbits(self): |
|
246 # Verify ranges |
|
247 for k in xrange(1, 1000): |
|
248 self.assert_(0 <= self.gen.getrandbits(k) < 2**k) |
|
249 |
|
250 # Verify all bits active |
|
251 getbits = self.gen.getrandbits |
|
252 for span in [1, 2, 3, 4, 31, 32, 32, 52, 53, 54, 119, 127, 128, 129]: |
|
253 cum = 0 |
|
254 for i in xrange(100): |
|
255 cum |= getbits(span) |
|
256 self.assertEqual(cum, 2**span-1) |
|
257 |
|
258 # Verify argument checking |
|
259 self.assertRaises(TypeError, self.gen.getrandbits) |
|
260 self.assertRaises(TypeError, self.gen.getrandbits, 1, 2) |
|
261 self.assertRaises(ValueError, self.gen.getrandbits, 0) |
|
262 self.assertRaises(ValueError, self.gen.getrandbits, -1) |
|
263 self.assertRaises(TypeError, self.gen.getrandbits, 10.1) |
|
264 |
|
265 def test_randbelow_logic(self, _log=log, int=int): |
|
266 # check bitcount transition points: 2**i and 2**(i+1)-1 |
|
267 # show that: k = int(1.001 + _log(n, 2)) |
|
268 # is equal to or one greater than the number of bits in n |
|
269 for i in xrange(1, 1000): |
|
270 n = 1L << i # check an exact power of two |
|
271 numbits = i+1 |
|
272 k = int(1.00001 + _log(n, 2)) |
|
273 self.assertEqual(k, numbits) |
|
274 self.assert_(n == 2**(k-1)) |
|
275 |
|
276 n += n - 1 # check 1 below the next power of two |
|
277 k = int(1.00001 + _log(n, 2)) |
|
278 self.assert_(k in [numbits, numbits+1]) |
|
279 self.assert_(2**k > n > 2**(k-2)) |
|
280 |
|
281 n -= n >> 15 # check a little farther below the next power of two |
|
282 k = int(1.00001 + _log(n, 2)) |
|
283 self.assertEqual(k, numbits) # note the stronger assertion |
|
284 self.assert_(2**k > n > 2**(k-1)) # note the stronger assertion |
|
285 |
|
286 |
|
287 class MersenneTwister_TestBasicOps(TestBasicOps): |
|
288 gen = random.Random() |
|
289 |
|
290 def test_setstate_first_arg(self): |
|
291 self.assertRaises(ValueError, self.gen.setstate, (1, None, None)) |
|
292 |
|
293 def test_setstate_middle_arg(self): |
|
294 # Wrong type, s/b tuple |
|
295 self.assertRaises(TypeError, self.gen.setstate, (2, None, None)) |
|
296 # Wrong length, s/b 625 |
|
297 self.assertRaises(ValueError, self.gen.setstate, (2, (1,2,3), None)) |
|
298 # Wrong type, s/b tuple of 625 ints |
|
299 self.assertRaises(TypeError, self.gen.setstate, (2, ('a',)*625, None)) |
|
300 # Last element s/b an int also |
|
301 self.assertRaises(TypeError, self.gen.setstate, (2, (0,)*624+('a',), None)) |
|
302 |
|
303 def test_referenceImplementation(self): |
|
304 # Compare the python implementation with results from the original |
|
305 # code. Create 2000 53-bit precision random floats. Compare only |
|
306 # the last ten entries to show that the independent implementations |
|
307 # are tracking. Here is the main() function needed to create the |
|
308 # list of expected random numbers: |
|
309 # void main(void){ |
|
310 # int i; |
|
311 # unsigned long init[4]={61731, 24903, 614, 42143}, length=4; |
|
312 # init_by_array(init, length); |
|
313 # for (i=0; i<2000; i++) { |
|
314 # printf("%.15f ", genrand_res53()); |
|
315 # if (i%5==4) printf("\n"); |
|
316 # } |
|
317 # } |
|
318 expected = [0.45839803073713259, |
|
319 0.86057815201978782, |
|
320 0.92848331726782152, |
|
321 0.35932681119782461, |
|
322 0.081823493762449573, |
|
323 0.14332226470169329, |
|
324 0.084297823823520024, |
|
325 0.53814864671831453, |
|
326 0.089215024911993401, |
|
327 0.78486196105372907] |
|
328 |
|
329 self.gen.seed(61731L + (24903L<<32) + (614L<<64) + (42143L<<96)) |
|
330 actual = self.randomlist(2000)[-10:] |
|
331 for a, e in zip(actual, expected): |
|
332 self.assertAlmostEqual(a,e,places=14) |
|
333 |
|
334 def test_strong_reference_implementation(self): |
|
335 # Like test_referenceImplementation, but checks for exact bit-level |
|
336 # equality. This should pass on any box where C double contains |
|
337 # at least 53 bits of precision (the underlying algorithm suffers |
|
338 # no rounding errors -- all results are exact). |
|
339 from math import ldexp |
|
340 |
|
341 expected = [0x0eab3258d2231fL, |
|
342 0x1b89db315277a5L, |
|
343 0x1db622a5518016L, |
|
344 0x0b7f9af0d575bfL, |
|
345 0x029e4c4db82240L, |
|
346 0x04961892f5d673L, |
|
347 0x02b291598e4589L, |
|
348 0x11388382c15694L, |
|
349 0x02dad977c9e1feL, |
|
350 0x191d96d4d334c6L] |
|
351 self.gen.seed(61731L + (24903L<<32) + (614L<<64) + (42143L<<96)) |
|
352 actual = self.randomlist(2000)[-10:] |
|
353 for a, e in zip(actual, expected): |
|
354 self.assertEqual(long(ldexp(a, 53)), e) |
|
355 |
|
356 def test_long_seed(self): |
|
357 # This is most interesting to run in debug mode, just to make sure |
|
358 # nothing blows up. Under the covers, a dynamically resized array |
|
359 # is allocated, consuming space proportional to the number of bits |
|
360 # in the seed. Unfortunately, that's a quadratic-time algorithm, |
|
361 # so don't make this horribly big. |
|
362 seed = (1L << (10000 * 8)) - 1 # about 10K bytes |
|
363 self.gen.seed(seed) |
|
364 |
|
365 def test_53_bits_per_float(self): |
|
366 # This should pass whenever a C double has 53 bit precision. |
|
367 span = 2 ** 53 |
|
368 cum = 0 |
|
369 for i in xrange(100): |
|
370 cum |= int(self.gen.random() * span) |
|
371 self.assertEqual(cum, span-1) |
|
372 |
|
373 def test_bigrand(self): |
|
374 # The randrange routine should build-up the required number of bits |
|
375 # in stages so that all bit positions are active. |
|
376 span = 2 ** 500 |
|
377 cum = 0 |
|
378 for i in xrange(100): |
|
379 r = self.gen.randrange(span) |
|
380 self.assert_(0 <= r < span) |
|
381 cum |= r |
|
382 self.assertEqual(cum, span-1) |
|
383 |
|
384 def test_bigrand_ranges(self): |
|
385 for i in [40,80, 160, 200, 211, 250, 375, 512, 550]: |
|
386 start = self.gen.randrange(2 ** i) |
|
387 stop = self.gen.randrange(2 ** (i-2)) |
|
388 if stop <= start: |
|
389 return |
|
390 self.assert_(start <= self.gen.randrange(start, stop) < stop) |
|
391 |
|
392 def test_rangelimits(self): |
|
393 for start, stop in [(-2,0), (-(2**60)-2,-(2**60)), (2**60,2**60+2)]: |
|
394 self.assertEqual(set(range(start,stop)), |
|
395 set([self.gen.randrange(start,stop) for i in xrange(100)])) |
|
396 |
|
397 def test_genrandbits(self): |
|
398 # Verify cross-platform repeatability |
|
399 self.gen.seed(1234567) |
|
400 self.assertEqual(self.gen.getrandbits(100), |
|
401 97904845777343510404718956115L) |
|
402 # Verify ranges |
|
403 for k in xrange(1, 1000): |
|
404 self.assert_(0 <= self.gen.getrandbits(k) < 2**k) |
|
405 |
|
406 # Verify all bits active |
|
407 getbits = self.gen.getrandbits |
|
408 for span in [1, 2, 3, 4, 31, 32, 32, 52, 53, 54, 119, 127, 128, 129]: |
|
409 cum = 0 |
|
410 for i in xrange(100): |
|
411 cum |= getbits(span) |
|
412 self.assertEqual(cum, 2**span-1) |
|
413 |
|
414 # Verify argument checking |
|
415 self.assertRaises(TypeError, self.gen.getrandbits) |
|
416 self.assertRaises(TypeError, self.gen.getrandbits, 'a') |
|
417 self.assertRaises(TypeError, self.gen.getrandbits, 1, 2) |
|
418 self.assertRaises(ValueError, self.gen.getrandbits, 0) |
|
419 self.assertRaises(ValueError, self.gen.getrandbits, -1) |
|
420 |
|
421 def test_randbelow_logic(self, _log=log, int=int): |
|
422 # check bitcount transition points: 2**i and 2**(i+1)-1 |
|
423 # show that: k = int(1.001 + _log(n, 2)) |
|
424 # is equal to or one greater than the number of bits in n |
|
425 for i in xrange(1, 1000): |
|
426 n = 1L << i # check an exact power of two |
|
427 numbits = i+1 |
|
428 k = int(1.00001 + _log(n, 2)) |
|
429 self.assertEqual(k, numbits) |
|
430 self.assert_(n == 2**(k-1)) |
|
431 |
|
432 n += n - 1 # check 1 below the next power of two |
|
433 k = int(1.00001 + _log(n, 2)) |
|
434 self.assert_(k in [numbits, numbits+1]) |
|
435 self.assert_(2**k > n > 2**(k-2)) |
|
436 |
|
437 n -= n >> 15 # check a little farther below the next power of two |
|
438 k = int(1.00001 + _log(n, 2)) |
|
439 self.assertEqual(k, numbits) # note the stronger assertion |
|
440 self.assert_(2**k > n > 2**(k-1)) # note the stronger assertion |
|
441 |
|
442 def test_randrange_bug_1590891(self): |
|
443 start = 1000000000000 |
|
444 stop = -100000000000000000000 |
|
445 step = -200 |
|
446 x = self.gen.randrange(start, stop, step) |
|
447 self.assert_(stop < x <= start) |
|
448 self.assertEqual((x+stop)%step, 0) |
|
449 |
|
450 _gammacoeff = (0.9999999999995183, 676.5203681218835, -1259.139216722289, |
|
451 771.3234287757674, -176.6150291498386, 12.50734324009056, |
|
452 -0.1385710331296526, 0.9934937113930748e-05, 0.1659470187408462e-06) |
|
453 |
|
454 def gamma(z, cof=_gammacoeff, g=7): |
|
455 z -= 1.0 |
|
456 sum = cof[0] |
|
457 for i in xrange(1,len(cof)): |
|
458 sum += cof[i] / (z+i) |
|
459 z += 0.5 |
|
460 return (z+g)**z / exp(z+g) * sqrt(2*pi) * sum |
|
461 |
|
462 class TestDistributions(unittest.TestCase): |
|
463 def test_zeroinputs(self): |
|
464 # Verify that distributions can handle a series of zero inputs' |
|
465 g = random.Random() |
|
466 x = [g.random() for i in xrange(50)] + [0.0]*5 |
|
467 g.random = x[:].pop; g.uniform(1,10) |
|
468 g.random = x[:].pop; g.paretovariate(1.0) |
|
469 g.random = x[:].pop; g.expovariate(1.0) |
|
470 g.random = x[:].pop; g.weibullvariate(1.0, 1.0) |
|
471 g.random = x[:].pop; g.normalvariate(0.0, 1.0) |
|
472 g.random = x[:].pop; g.gauss(0.0, 1.0) |
|
473 g.random = x[:].pop; g.lognormvariate(0.0, 1.0) |
|
474 g.random = x[:].pop; g.vonmisesvariate(0.0, 1.0) |
|
475 g.random = x[:].pop; g.gammavariate(0.01, 1.0) |
|
476 g.random = x[:].pop; g.gammavariate(1.0, 1.0) |
|
477 g.random = x[:].pop; g.gammavariate(200.0, 1.0) |
|
478 g.random = x[:].pop; g.betavariate(3.0, 3.0) |
|
479 |
|
480 def test_avg_std(self): |
|
481 # Use integration to test distribution average and standard deviation. |
|
482 # Only works for distributions which do not consume variates in pairs |
|
483 g = random.Random() |
|
484 N = 5000 |
|
485 x = [i/float(N) for i in xrange(1,N)] |
|
486 for variate, args, mu, sigmasqrd in [ |
|
487 (g.uniform, (1.0,10.0), (10.0+1.0)/2, (10.0-1.0)**2/12), |
|
488 (g.expovariate, (1.5,), 1/1.5, 1/1.5**2), |
|
489 (g.paretovariate, (5.0,), 5.0/(5.0-1), |
|
490 5.0/((5.0-1)**2*(5.0-2))), |
|
491 (g.weibullvariate, (1.0, 3.0), gamma(1+1/3.0), |
|
492 gamma(1+2/3.0)-gamma(1+1/3.0)**2) ]: |
|
493 g.random = x[:].pop |
|
494 y = [] |
|
495 for i in xrange(len(x)): |
|
496 try: |
|
497 y.append(variate(*args)) |
|
498 except IndexError: |
|
499 pass |
|
500 s1 = s2 = 0 |
|
501 for e in y: |
|
502 s1 += e |
|
503 s2 += (e - mu) ** 2 |
|
504 N = len(y) |
|
505 self.assertAlmostEqual(s1/N, mu, 2) |
|
506 self.assertAlmostEqual(s2/(N-1), sigmasqrd, 2) |
|
507 |
|
508 class TestModule(unittest.TestCase): |
|
509 def testMagicConstants(self): |
|
510 self.assertAlmostEqual(random.NV_MAGICCONST, 1.71552776992141) |
|
511 self.assertAlmostEqual(random.TWOPI, 6.28318530718) |
|
512 self.assertAlmostEqual(random.LOG4, 1.38629436111989) |
|
513 self.assertAlmostEqual(random.SG_MAGICCONST, 2.50407739677627) |
|
514 |
|
515 def test__all__(self): |
|
516 # tests validity but not completeness of the __all__ list |
|
517 self.failUnless(set(random.__all__) <= set(dir(random))) |
|
518 |
|
519 def test_random_subclass_with_kwargs(self): |
|
520 # SF bug #1486663 -- this used to erroneously raise a TypeError |
|
521 class Subclass(random.Random): |
|
522 def __init__(self, newarg=None): |
|
523 random.Random.__init__(self) |
|
524 Subclass(newarg=1) |
|
525 |
|
526 |
|
527 def test_main(verbose=None): |
|
528 testclasses = [WichmannHill_TestBasicOps, |
|
529 MersenneTwister_TestBasicOps, |
|
530 TestDistributions, |
|
531 TestModule] |
|
532 |
|
533 try: |
|
534 random.SystemRandom().random() |
|
535 except NotImplementedError: |
|
536 pass |
|
537 else: |
|
538 testclasses.append(SystemRandom_TestBasicOps) |
|
539 |
|
540 test_support.run_unittest(*testclasses) |
|
541 |
|
542 # verify reference counting |
|
543 import sys |
|
544 if verbose and hasattr(sys, "gettotalrefcount"): |
|
545 counts = [None] * 5 |
|
546 for i in xrange(len(counts)): |
|
547 test_support.run_unittest(*testclasses) |
|
548 counts[i] = sys.gettotalrefcount() |
|
549 print counts |
|
550 |
|
551 if __name__ == "__main__": |
|
552 test_main(verbose=True) |