Update to Scalar-List-Utils-1.15
[p5sagit/p5-mst-13.2.git] / ext / List / Util / t / reduce.t
1 #!./perl
2
3 BEGIN {
4     unless (-d 'blib') {
5         chdir 't' if -d 't';
6         @INC = '../lib';
7         require Config; import Config;
8         keys %Config; # Silence warning
9         if ($Config{extensions} !~ /\bList\/Util\b/) {
10             print "1..0 # Skip: List::Util was not built\n";
11             exit 0;
12         }
13     }
14 }
15
16
17 use List::Util qw(reduce min);
18 use Test::More tests => 14;
19
20 my $v = reduce {};
21
22 is( $v, undef,  'no args');
23
24 $v = reduce { $a / $b } 756,3,7,4;
25 is( $v, 9,      '4-arg divide');
26
27 $v = reduce { $a / $b } 6;
28 is( $v, 6,      'one arg');
29
30 @a = map { rand } 0 .. 20;
31 $v = reduce { $a < $b ? $a : $b } @a;
32 is( $v, min(@a),        'min');
33
34 @a = map { pack("C", int(rand(256))) } 0 .. 20;
35 $v = reduce { $a . $b } @a;
36 is( $v, join("",@a),    'concat');
37
38 sub add {
39   my($aa, $bb) = @_;
40   return $aa + $bb;
41 }
42
43 $v = reduce { my $t="$a $b\n"; 0+add($a, $b) } 3, 2, 1;
44 is( $v, 6,      'call sub');
45
46 # Check that eval{} inside the block works correctly
47 $v = reduce { eval { die }; $a + $b } 0,1,2,3,4;
48 is( $v, 10,     'use eval{}');
49
50 $v = !defined eval { reduce { die if $b > 2; $a + $b } 0,1,2,3,4 };
51 ok($v, 'die');
52
53 sub foobar { reduce { (defined(wantarray) && !wantarray) ? $a+1 : 0 } 0,1,2,3 }
54 ($v) = foobar();
55 is( $v, 3,      'scalar context');
56
57 sub add2 { $a + $b }
58
59 $v = reduce \&add2, 1,2,3;
60 is( $v, 6,      'sub reference');
61
62 $v = reduce { add2() } 3,4,5;
63 is( $v, 12,     'call sub');
64
65
66 $v = reduce { eval "$a + $b" } 1,2,3;
67 is( $v, 6, 'eval string');
68
69 $a = 8; $b = 9;
70 $v = reduce { $a * $b } 1,2,3;
71 is( $a, 8, 'restore $a');
72 is( $b, 9, 'restore $b');