xref: /openbsd-src/gnu/usr.bin/perl/cpan/Scalar-List-Utils/t/sample.t (revision de8cc8edbc71bd3e3bc7fbffa27ba0e564c37d8b)
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