1#!./perl -w 2 3BEGIN { 4 chdir "t" if -d "t"; 5 require "./test.pl"; 6 set_up_inc( qw(. ../lib) ); 7} 8 9# Test srand. 10 11use strict; 12 13plan(tests => 10); 14 15# Generate a load of random numbers. 16# int() avoids possible floating point error. 17sub mk_rand { map int rand 10000, 1..100; } 18 19 20# Check that rand() is deterministic. 21srand(1138); 22my @first_run = mk_rand; 23 24srand(1138); 25my @second_run = mk_rand; 26 27ok( eq_array(\@first_run, \@second_run), 'srand(), same arg, same rands' ); 28 29 30# Check that different seeds provide different random numbers 31srand(31337); 32@first_run = mk_rand; 33 34srand(1138); 35@second_run = mk_rand; 36 37ok( !eq_array(\@first_run, \@second_run), 38 'srand(), different arg, different rands' ); 39 40 41# Check that srand() isn't affected by $_ 42{ 43 local $_ = 42; 44 srand(); 45 @first_run = mk_rand; 46 47 srand(42); 48 @second_run = mk_rand; 49 50 ok( !eq_array(\@first_run, \@second_run), 51 'srand(), no arg, not affected by $_'); 52} 53 54# This test checks whether Perl called srand for you. 55@first_run = `$^X -le "print int rand 100 for 1..100"`; 56sleep(1); # in case our srand() is too time-dependent 57@second_run = `$^X -le "print int rand 100 for 1..100"`; 58 59ok( !eq_array(\@first_run, \@second_run), 'srand() called automatically'); 60 61# check srand's return value 62my $seed = srand(1764); 63is( $seed, 1764, "return value" ); 64 65$seed = srand(0); 66ok( $seed, "true return value for srand(0)"); 67cmp_ok( $seed, '==', 0, "numeric 0 return value for srand(0)"); 68 69{ 70 my @warnings; 71 my $b; 72 { 73 local $SIG{__WARN__} = sub { 74 push @warnings, "@_"; 75 warn @_; 76 }; 77 $b = $seed + 0; 78 } 79 is( $b, 0, "Quacks like a zero"); 80 is( "@warnings", "", "Does not warn"); 81} 82 83# [perl #40605] 84{ 85 use warnings; 86 my $w = ''; 87 local $SIG{__WARN__} = sub { $w .= $_[0] }; 88 srand(2**100); 89 like($w, qr/^Integer overflow in srand at /, "got a warning"); 90} 91