This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Upgrade to DB_File 1.838 from CPAN.
[perl5.git] / cpan / Scalar-List-Utils / t / product.t
1 #!./perl
2
3 use strict;
4 use warnings;
5
6 use Test::More tests => 14;
7
8 use List::Util qw(product);
9
10 my $v = product;
11 is( $v, 1, 'no args');
12
13 $v = product(9);
14 is( $v, 9, 'one arg');
15
16 $v = product(1,2,3,4);
17 is( $v, 24, '4 args');
18
19 $v = product(-1);
20 is( $v, -1, 'one -1');
21
22 $v = product(0, 1, 2);
23 is( $v, 0, 'first factor zero' );
24
25 my $x = -3;
26
27 $v = product($x, 3);
28 is( $v, -9, 'variable arg');
29
30 $v = product(-3.5,3);
31 is( $v, -10.5, 'real numbers');
32
33 my $one  = Foo->new(1);
34 my $two  = Foo->new(2);
35 my $four = Foo->new(4);
36
37 $v = product($one,$two,$four);
38 is($v, 8, 'overload');
39
40
41 { package Foo;
42
43 use overload
44   '""' => sub { ${$_[0]} },
45   '0+' => sub { ${$_[0]} },
46   fallback => 1;
47   sub new {
48     my $class = shift;
49     my $value = shift;
50     bless \$value, $class;
51   }
52 }
53
54 use Math::BigInt;
55 my $v1 = Math::BigInt->new(2) ** Math::BigInt->new(65);
56 my $v2 = $v1 - 1;
57 $v = product($v1,$v2);
58 is($v, $v1 * $v2, 'bigint');
59
60 $v = product(42, $v1);
61 is($v, $v1 * 42, 'bigint + builtin int');
62
63 $v = product(42, $v1, 2);
64 is($v, $v1 * 42 * 2, 'bigint + builtin int');
65
66 { package example;
67
68   use overload
69     '0+' => sub { $_[0][0] },
70     '""' => sub { my $r = "$_[0][0]"; $r = "+$r" unless $r =~ m/^\-/; $r .= " [$_[0][1]]"; $r },
71     fallback => 1;
72
73   sub new {
74     my $class = shift;
75
76     my $this = bless [@_], $class;
77
78     return $this;
79   }
80 }
81
82 {
83   my $e1 = example->new(7, "test");
84   my $t = product($e1, 7, 7);
85   is($t, 343, 'overload returning non-overload');
86   $t = product(8, $e1, 8);
87   is($t, 448, 'overload returning non-overload');
88   $t = product(9, 9, $e1);
89   is($t, 567, 'overload returning non-overload');
90 }
91