Commit | Line | Data |
---|---|---|
efec44ca AB |
1 | #!./perl -w |
2 | ||
69026470 JH |
3 | BEGIN { |
4 | chdir "t" if -d "t"; | |
5 | @INC = qw(. ../lib); | |
6 | } | |
7 | ||
efec44ca AB |
8 | # Test srand. |
9 | ||
10 | use strict; | |
69026470 JH |
11 | |
12 | require "test.pl"; | |
da1010ec | 13 | plan(tests => 9); |
efec44ca AB |
14 | |
15 | # Generate a load of random numbers. | |
16 | # int() avoids possible floating point error. | |
17 | sub mk_rand { map int rand 10000, 1..100; } | |
18 | ||
19 | ||
20 | # Check that rand() is deterministic. | |
21 | srand(1138); | |
22 | my @first_run = mk_rand; | |
23 | ||
24 | srand(1138); | |
25 | my @second_run = mk_rand; | |
26 | ||
27 | ok( eq_array(\@first_run, \@second_run), 'srand(), same arg, same rands' ); | |
28 | ||
29 | ||
30 | # Check that different seeds provide different random numbers | |
31 | srand(31337); | |
32 | @first_run = mk_rand; | |
33 | ||
34 | srand(1138); | |
35 | @second_run = mk_rand; | |
36 | ||
37 | ok( !eq_array(\@first_run, \@second_run), | |
38 | 'srand(), different arg, different rands' ); | |
39 | ||
40 | ||
97458a6f MS |
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 | ||
efec44ca AB |
54 | # This test checks whether Perl called srand for you. |
55 | @first_run = `$^X -le "print int rand 100 for 1..100"`; | |
dc459aad | 56 | sleep(1); # in case our srand() is too time-dependent |
efec44ca AB |
57 | @second_run = `$^X -le "print int rand 100 for 1..100"`; |
58 | ||
59 | ok( !eq_array(\@first_run, \@second_run), 'srand() called automatically'); | |
1c761d95 RGS |
60 | |
61 | # check srand's return value | |
62 | my $seed = srand(1764); | |
63 | is( $seed, 1764, "return value" ); | |
da1010ec NC |
64 | |
65 | $seed = srand(0); | |
66 | ok( $seed, "true return value for srand(0)"); | |
67 | cmp_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 | } |