1*de8cc8edSafresh1#!./perl 2*de8cc8edSafresh1 3*de8cc8edSafresh1use strict; 4*de8cc8edSafresh1use warnings; 5*de8cc8edSafresh1 6*de8cc8edSafresh1use Test::More tests => 9; 7*de8cc8edSafresh1 8*de8cc8edSafresh1use List::Util qw(sample); 9*de8cc8edSafresh1 10*de8cc8edSafresh1{ 11*de8cc8edSafresh1 my @items = sample 3, 1 .. 10; 12*de8cc8edSafresh1 is( scalar @items, 3, 'returns correct count when plentiful' ); 13*de8cc8edSafresh1 14*de8cc8edSafresh1 @items = sample 10, 1 .. 10; 15*de8cc8edSafresh1 is( scalar @items, 10, 'returns correct count when exact' ); 16*de8cc8edSafresh1 17*de8cc8edSafresh1 @items = sample 20, 1 .. 10; 18*de8cc8edSafresh1 is( scalar @items, 10, 'returns correct count when short' ); 19*de8cc8edSafresh1} 20*de8cc8edSafresh1 21*de8cc8edSafresh1{ 22*de8cc8edSafresh1 my @items = sample 5, 1 .. 5; 23*de8cc8edSafresh1 is_deeply( [ sort { $a <=> $b } @items ], [ 1 .. 5 ], 24*de8cc8edSafresh1 'returns a permutation of the input list when exact' ); 25*de8cc8edSafresh1} 26*de8cc8edSafresh1 27*de8cc8edSafresh1{ 28*de8cc8edSafresh1 # These two seeds happen to give different results for me, but there is the 29*de8cc8edSafresh1 # smallest 1-in-2**48 chance that they happen to agree on some platform. If 30*de8cc8edSafresh1 # so then pick a different seed value. 31*de8cc8edSafresh1 32*de8cc8edSafresh1 srand 1234; 33*de8cc8edSafresh1 my $x = join "", sample 3, 'a'..'z'; 34*de8cc8edSafresh1 35*de8cc8edSafresh1 srand 5678; 36*de8cc8edSafresh1 my $y = join "", sample 3, 'a'..'z'; 37*de8cc8edSafresh1 38*de8cc8edSafresh1 isnt( $x, $y, 'returns different result on different random seed' ); 39*de8cc8edSafresh1 40*de8cc8edSafresh1 srand; 41*de8cc8edSafresh1} 42*de8cc8edSafresh1 43*de8cc8edSafresh1{ 44*de8cc8edSafresh1 my @nums = ( 1..5 ); 45*de8cc8edSafresh1 sample 5, @nums; 46*de8cc8edSafresh1 47*de8cc8edSafresh1 is_deeply( \@nums, [ 1..5 ], 48*de8cc8edSafresh1 'sample does not mutate passed array' 49*de8cc8edSafresh1 ); 50*de8cc8edSafresh1} 51*de8cc8edSafresh1 52*de8cc8edSafresh1{ 53*de8cc8edSafresh1 my $destroyed_count; 54*de8cc8edSafresh1 sub Guardian::DESTROY { $destroyed_count++ } 55*de8cc8edSafresh1 56*de8cc8edSafresh1 my @ret = sample 3, map { bless [], "Guardian" } 1 .. 10; 57*de8cc8edSafresh1 58*de8cc8edSafresh1 is( $destroyed_count, 7, 'the 7 unselected items were destroyed' ); 59*de8cc8edSafresh1 60*de8cc8edSafresh1 @ret = (); 61*de8cc8edSafresh1 62*de8cc8edSafresh1 is( $destroyed_count, 10, 'all the items were destroyed' ); 63*de8cc8edSafresh1} 64*de8cc8edSafresh1 65*de8cc8edSafresh1{ 66*de8cc8edSafresh1 local $List::Util::RAND = sub { 4/10 }; 67*de8cc8edSafresh1 68*de8cc8edSafresh1 is( 69*de8cc8edSafresh1 join( "", sample 5, 'A'..'Z' ), 70*de8cc8edSafresh1 join( "", sample 5, 'A'..'Z' ), 71*de8cc8edSafresh1 'rigged rand() yields predictable output' 72*de8cc8edSafresh1 ); 73*de8cc8edSafresh1} 74