@@ -151,6 +151,7 @@ def test_sample(self):
151151        # Exception raised if size of sample exceeds that of population 
152152        self .assertRaises (ValueError , self .gen .sample , population , N + 1 )
153153        self .assertRaises (ValueError , self .gen .sample , [], - 1 )
154+         self .assertRaises (TypeError , self .gen .sample , population , 1.0 )
154155
155156    def  test_sample_distribution (self ):
156157        # For the entire allowable range of 0 <= k <= N, validate that 
@@ -268,6 +269,7 @@ def test_choices(self):
268269            choices (data , range (4 ), k = 5 ),
269270            choices (k = 5 , population = data , weights = range (4 )),
270271            choices (k = 5 , population = data , cum_weights = range (4 )),
272+             choices (data , k = MyIndex (5 )),
271273        ]:
272274            self .assertEqual (len (sample ), 5 )
273275            self .assertEqual (type (sample ), list )
@@ -378,122 +380,40 @@ def test_gauss(self):
378380            self .assertEqual (x1 , x2 )
379381            self .assertEqual (y1 , y2 )
380382
383+     @support .requires_IEEE_754  
384+     def  test_53_bits_per_float (self ):
385+         span  =  2  **  53 
386+         cum  =  0 
387+         for  i  in  range (100 ):
388+             cum  |=  int (self .gen .random () *  span )
389+         self .assertEqual (cum , span - 1 )
390+ 
381391    def  test_getrandbits (self ):
392+         getrandbits  =  self .gen .getrandbits 
382393        # Verify ranges 
383394        for  k  in  range (1 , 1000 ):
384-             self .assertTrue (0  <=  self . gen . getrandbits (k ) <  2 ** k )
385-         self .assertEqual (self . gen . getrandbits (0 ), 0 )
395+             self .assertTrue (0  <=  getrandbits (k ) <  2 ** k )
396+         self .assertEqual (getrandbits (0 ), 0 )
386397
387398        # Verify all bits active 
388-         getbits  =  self .gen .getrandbits 
389399        for  span  in  [1 , 2 , 3 , 4 , 31 , 32 , 32 , 52 , 53 , 54 , 119 , 127 , 128 , 129 ]:
390400            all_bits  =  2 ** span - 1 
391401            cum  =  0 
392402            cpl_cum  =  0 
393403            for  i  in  range (100 ):
394-                 v  =  getbits (span )
404+                 v  =  getrandbits (span )
395405                cum  |=  v 
396406                cpl_cum  |=  all_bits  ^  v 
397407            self .assertEqual (cum , all_bits )
398408            self .assertEqual (cpl_cum , all_bits )
399409
400410        # Verify argument checking 
401-         self .assertRaises (TypeError , self .gen .getrandbits )
402-         self .assertRaises (TypeError , self .gen .getrandbits , 1 , 2 )
403-         self .assertRaises (ValueError , self .gen .getrandbits , - 1 )
404-         self .assertRaises (OverflowError , self .gen .getrandbits , 1 << 1000 )
405-         self .assertRaises (ValueError , self .gen .getrandbits , - 1 << 1000 )
406-         self .assertRaises (TypeError , self .gen .getrandbits , 10.1 )
407- 
408-     def  test_pickling (self ):
409-         for  proto  in  range (pickle .HIGHEST_PROTOCOL  +  1 ):
410-             state  =  pickle .dumps (self .gen , proto )
411-             origseq  =  [self .gen .random () for  i  in  range (10 )]
412-             newgen  =  pickle .loads (state )
413-             restoredseq  =  [newgen .random () for  i  in  range (10 )]
414-             self .assertEqual (origseq , restoredseq )
415- 
416-     def  test_bug_1727780 (self ):
417-         # verify that version-2-pickles can be loaded 
418-         # fine, whether they are created on 32-bit or 64-bit 
419-         # platforms, and that version-3-pickles load fine. 
420-         files  =  [("randv2_32.pck" , 780 ),
421-                  ("randv2_64.pck" , 866 ),
422-                  ("randv3.pck" , 343 )]
423-         for  file , value  in  files :
424-             with  open (support .findfile (file ),"rb" ) as  f :
425-                 r  =  pickle .load (f )
426-             self .assertEqual (int (r .random ()* 1000 ), value )
427- 
428-     def  test_bug_9025 (self ):
429-         # Had problem with an uneven distribution in int(n*random()) 
430-         # Verify the fix by checking that distributions fall within expectations. 
431-         n  =  100000 
432-         randrange  =  self .gen .randrange 
433-         k  =  sum (randrange (6755399441055744 ) %  3  ==  2  for  i  in  range (n ))
434-         self .assertTrue (0.30  <  k / n  <  .37 , (k / n ))
435- 
436-     def  test_randbytes (self ):
437-         # Verify ranges 
438-         for  n  in  range (1 , 10 ):
439-             data  =  self .gen .randbytes (n )
440-             self .assertEqual (type (data ), bytes )
441-             self .assertEqual (len (data ), n )
442- 
443-         self .assertEqual (self .gen .randbytes (0 ), b'' )
444- 
445-         # Verify argument checking 
446-         self .assertRaises (TypeError , self .gen .randbytes )
447-         self .assertRaises (TypeError , self .gen .randbytes , 1 , 2 )
448-         self .assertRaises (ValueError , self .gen .randbytes , - 1 )
449-         self .assertRaises (OverflowError , self .gen .randbytes , 1 << 1000 )
450-         self .assertRaises ((ValueError , OverflowError ), self .gen .randbytes , - 1 << 1000 )
451-         self .assertRaises (TypeError , self .gen .randbytes , 1.0 )
452- 
453-     def  test_mu_sigma_default_args (self ):
454-         self .assertIsInstance (self .gen .normalvariate (), float )
455-         self .assertIsInstance (self .gen .gauss (), float )
456- 
457- 
458- try :
459-     random .SystemRandom ().random ()
460- except  NotImplementedError :
461-     SystemRandom_available  =  False 
462- else :
463-     SystemRandom_available  =  True 
464- 
465- @unittest .skipUnless (SystemRandom_available , "random.SystemRandom not available" ) 
466- class  SystemRandom_TestBasicOps (TestBasicOps , unittest .TestCase ):
467-     gen  =  random .SystemRandom ()
468- 
469-     def  test_autoseed (self ):
470-         # Doesn't need to do anything except not fail 
471-         self .gen .seed ()
472- 
473-     def  test_saverestore (self ):
474-         self .assertRaises (NotImplementedError , self .gen .getstate )
475-         self .assertRaises (NotImplementedError , self .gen .setstate , None )
476- 
477-     def  test_seedargs (self ):
478-         # Doesn't need to do anything except not fail 
479-         self .gen .seed (100 )
480- 
481-     def  test_gauss (self ):
482-         self .gen .gauss_next  =  None 
483-         self .gen .seed (100 )
484-         self .assertEqual (self .gen .gauss_next , None )
485- 
486-     def  test_pickling (self ):
487-         for  proto  in  range (pickle .HIGHEST_PROTOCOL  +  1 ):
488-             self .assertRaises (NotImplementedError , pickle .dumps , self .gen , proto )
489- 
490-     def  test_53_bits_per_float (self ):
491-         # This should pass whenever a C double has 53 bit precision. 
492-         span  =  2  **  53 
493-         cum  =  0 
494-         for  i  in  range (100 ):
495-             cum  |=  int (self .gen .random () *  span )
496-         self .assertEqual (cum , span - 1 )
411+         self .assertRaises (TypeError , getrandbits )
412+         self .assertRaises (TypeError , getrandbits , 1 , 2 )
413+         self .assertRaises (ValueError , getrandbits , - 1 )
414+         self .assertRaises (OverflowError , getrandbits , 1 << 1000 )
415+         self .assertRaises (ValueError , getrandbits , - 1 << 1000 )
416+         self .assertRaises (TypeError , getrandbits , 10.1 )
497417
498418    def  test_bigrand (self ):
499419        # The randrange routine should build-up the required number of bits 
@@ -572,6 +492,10 @@ def test_randrange_step(self):
572492            randrange (1000 , step = 100 )
573493        with  self .assertRaises (TypeError ):
574494            randrange (1000 , None , step = 100 )
495+         with  self .assertRaises (TypeError ):
496+             randrange (1000 , step = MyIndex (1 ))
497+         with  self .assertRaises (TypeError ):
498+             randrange (1000 , None , step = MyIndex (1 ))
575499
576500    def  test_randbelow_logic (self , _log = log , int = int ):
577501        # check bitcount transition points:  2**i and 2**(i+1)-1 
@@ -594,6 +518,116 @@ def test_randbelow_logic(self, _log=log, int=int):
594518            self .assertEqual (k , numbits )        # note the stronger assertion 
595519            self .assertTrue (2 ** k  >  n  >  2 ** (k - 1 ))   # note the stronger assertion 
596520
521+     def  test_randrange_index (self ):
522+         randrange  =  self .gen .randrange 
523+         self .assertIn (randrange (MyIndex (5 )), range (5 ))
524+         self .assertIn (randrange (MyIndex (2 ), MyIndex (7 )), range (2 , 7 ))
525+         self .assertIn (randrange (MyIndex (5 ), MyIndex (15 ), MyIndex (2 )), range (5 , 15 , 2 ))
526+ 
527+     def  test_randint (self ):
528+         randint  =  self .gen .randint 
529+         self .assertIn (randint (2 , 5 ), (2 , 3 , 4 , 5 ))
530+         self .assertEqual (randint (2 , 2 ), 2 )
531+         self .assertIn (randint (MyIndex (2 ), MyIndex (5 )), (2 , 3 , 4 , 5 ))
532+         self .assertEqual (randint (MyIndex (2 ), MyIndex (2 )), 2 )
533+ 
534+         self .assertRaises (ValueError , randint , 5 , 2 )
535+         self .assertRaises (TypeError , randint )
536+         self .assertRaises (TypeError , randint , 2 )
537+         self .assertRaises (TypeError , randint , 2 , 5 , 1 )
538+         self .assertRaises (TypeError , randint , 2.0 , 5 )
539+         self .assertRaises (TypeError , randint , 2 , 5.0 )
540+ 
541+     def  test_pickling (self ):
542+         for  proto  in  range (pickle .HIGHEST_PROTOCOL  +  1 ):
543+             state  =  pickle .dumps (self .gen , proto )
544+             origseq  =  [self .gen .random () for  i  in  range (10 )]
545+             newgen  =  pickle .loads (state )
546+             restoredseq  =  [newgen .random () for  i  in  range (10 )]
547+             self .assertEqual (origseq , restoredseq )
548+ 
549+     def  test_bug_1727780 (self ):
550+         # verify that version-2-pickles can be loaded 
551+         # fine, whether they are created on 32-bit or 64-bit 
552+         # platforms, and that version-3-pickles load fine. 
553+         files  =  [("randv2_32.pck" , 780 ),
554+                  ("randv2_64.pck" , 866 ),
555+                  ("randv3.pck" , 343 )]
556+         for  file , value  in  files :
557+             with  open (support .findfile (file ),"rb" ) as  f :
558+                 r  =  pickle .load (f )
559+             self .assertEqual (int (r .random ()* 1000 ), value )
560+ 
561+     def  test_bug_9025 (self ):
562+         # Had problem with an uneven distribution in int(n*random()) 
563+         # Verify the fix by checking that distributions fall within expectations. 
564+         n  =  100000 
565+         randrange  =  self .gen .randrange 
566+         k  =  sum (randrange (6755399441055744 ) %  3  ==  2  for  i  in  range (n ))
567+         self .assertTrue (0.30  <  k / n  <  .37 , (k / n ))
568+ 
569+     def  test_randrange_bug_1590891 (self ):
570+         start  =  1000000000000 
571+         stop  =  - 100000000000000000000 
572+         step  =  - 200 
573+         x  =  self .gen .randrange (start , stop , step )
574+         self .assertTrue (stop  <  x  <=  start )
575+         self .assertEqual ((x + stop )% step , 0 )
576+ 
577+     def  test_randbytes (self ):
578+         # Verify ranges 
579+         for  n  in  range (1 , 10 ):
580+             data  =  self .gen .randbytes (n )
581+             self .assertEqual (type (data ), bytes )
582+             self .assertEqual (len (data ), n )
583+ 
584+         self .assertEqual (self .gen .randbytes (0 ), b'' )
585+ 
586+         # Verify argument checking 
587+         self .assertRaises (TypeError , self .gen .randbytes )
588+         self .assertRaises (TypeError , self .gen .randbytes , 1 , 2 )
589+         self .assertRaises (ValueError , self .gen .randbytes , - 1 )
590+         self .assertRaises (OverflowError , self .gen .randbytes , 1 << 1000 )
591+         self .assertRaises ((ValueError , OverflowError ), self .gen .randbytes , - 1 << 1000 )
592+         self .assertRaises (TypeError , self .gen .randbytes , 1.0 )
593+ 
594+     def  test_mu_sigma_default_args (self ):
595+         self .assertIsInstance (self .gen .normalvariate (), float )
596+         self .assertIsInstance (self .gen .gauss (), float )
597+ 
598+ 
599+ try :
600+     random .SystemRandom ().random ()
601+ except  NotImplementedError :
602+     SystemRandom_available  =  False 
603+ else :
604+     SystemRandom_available  =  True 
605+ 
606+ @unittest .skipUnless (SystemRandom_available , "random.SystemRandom not available" ) 
607+ class  SystemRandom_TestBasicOps (TestBasicOps , unittest .TestCase ):
608+     gen  =  random .SystemRandom ()
609+ 
610+     def  test_autoseed (self ):
611+         # Doesn't need to do anything except not fail 
612+         self .gen .seed ()
613+ 
614+     def  test_saverestore (self ):
615+         self .assertRaises (NotImplementedError , self .gen .getstate )
616+         self .assertRaises (NotImplementedError , self .gen .setstate , None )
617+ 
618+     def  test_seedargs (self ):
619+         # Doesn't need to do anything except not fail 
620+         self .gen .seed (100 )
621+ 
622+     def  test_gauss (self ):
623+         self .gen .gauss_next  =  None 
624+         self .gen .seed (100 )
625+         self .assertEqual (self .gen .gauss_next , None )
626+ 
627+     def  test_pickling (self ):
628+         for  proto  in  range (pickle .HIGHEST_PROTOCOL  +  1 ):
629+             self .assertRaises (NotImplementedError , pickle .dumps , self .gen , proto )
630+ 
597631
598632class  TestRawMersenneTwister (unittest .TestCase ):
599633    @test .support .cpython_only  
@@ -779,38 +813,6 @@ def test_long_seed(self):
779813        seed  =  (1  <<  (10000  *  8 )) -  1   # about 10K bytes 
780814        self .gen .seed (seed )
781815
782-     def  test_53_bits_per_float (self ):
783-         # This should pass whenever a C double has 53 bit precision. 
784-         span  =  2  **  53 
785-         cum  =  0 
786-         for  i  in  range (100 ):
787-             cum  |=  int (self .gen .random () *  span )
788-         self .assertEqual (cum , span - 1 )
789- 
790-     def  test_bigrand (self ):
791-         # The randrange routine should build-up the required number of bits 
792-         # in stages so that all bit positions are active. 
793-         span  =  2  **  500 
794-         cum  =  0 
795-         for  i  in  range (100 ):
796-             r  =  self .gen .randrange (span )
797-             self .assertTrue (0  <=  r  <  span )
798-             cum  |=  r 
799-         self .assertEqual (cum , span - 1 )
800- 
801-     def  test_bigrand_ranges (self ):
802-         for  i  in  [40 ,80 , 160 , 200 , 211 , 250 , 375 , 512 , 550 ]:
803-             start  =  self .gen .randrange (2  **  (i - 2 ))
804-             stop  =  self .gen .randrange (2  **  i )
805-             if  stop  <=  start :
806-                 continue 
807-             self .assertTrue (start  <=  self .gen .randrange (start , stop ) <  stop )
808- 
809-     def  test_rangelimits (self ):
810-         for  start , stop  in  [(- 2 ,0 ), (- (2 ** 60 )- 2 ,- (2 ** 60 )), (2 ** 60 ,2 ** 60 + 2 )]:
811-             self .assertEqual (set (range (start ,stop )),
812-                 set ([self .gen .randrange (start ,stop ) for  i  in  range (100 )]))
813- 
814816    def  test_getrandbits (self ):
815817        super ().test_getrandbits ()
816818
@@ -848,27 +850,6 @@ def test_randrange_uses_getrandbits(self):
848850        self .assertEqual (self .gen .randrange (2 ** 99 ),
849851                         97904845777343510404718956115 )
850852
851-     def  test_randbelow_logic (self , _log = log , int = int ):
852-         # check bitcount transition points:  2**i and 2**(i+1)-1 
853-         # show that: k = int(1.001 + _log(n, 2)) 
854-         # is equal to or one greater than the number of bits in n 
855-         for  i  in  range (1 , 1000 ):
856-             n  =  1  <<  i  # check an exact power of two 
857-             numbits  =  i + 1 
858-             k  =  int (1.00001  +  _log (n , 2 ))
859-             self .assertEqual (k , numbits )
860-             self .assertEqual (n , 2 ** (k - 1 ))
861- 
862-             n  +=  n  -  1       # check 1 below the next power of two 
863-             k  =  int (1.00001  +  _log (n , 2 ))
864-             self .assertIn (k , [numbits , numbits + 1 ])
865-             self .assertTrue (2 ** k  >  n  >  2 ** (k - 2 ))
866- 
867-             n  -=  n  >>  15      # check a little farther below the next power of two 
868-             k  =  int (1.00001  +  _log (n , 2 ))
869-             self .assertEqual (k , numbits )        # note the stronger assertion 
870-             self .assertTrue (2 ** k  >  n  >  2 ** (k - 1 ))   # note the stronger assertion 
871- 
872853    def  test_randbelow_without_getrandbits (self ):
873854        # Random._randbelow() can only use random() when the built-in one 
874855        # has been overridden but no new getrandbits() method was supplied. 
@@ -903,14 +884,6 @@ def test_randbelow_without_getrandbits(self):
903884            self .gen ._randbelow_without_getrandbits (n , maxsize = maxsize )
904885            self .assertEqual (random_mock .call_count , 2 )
905886
906-     def  test_randrange_bug_1590891 (self ):
907-         start  =  1000000000000 
908-         stop  =  - 100000000000000000000 
909-         step  =  - 200 
910-         x  =  self .gen .randrange (start , stop , step )
911-         self .assertTrue (stop  <  x  <=  start )
912-         self .assertEqual ((x + stop )% step , 0 )
913- 
914887    def  test_choices_algorithms (self ):
915888        # The various ways of specifying weights should produce the same results 
916889        choices  =  self .gen .choices 
0 commit comments