This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Upgrade to Scalar-List-Utils 1.45 from CPAN
[perl5.git] / cpan / Scalar-List-Utils / t / product.t
index 38c923b..1aad877 100644 (file)
@@ -3,8 +3,9 @@
 use strict;
 use warnings;
 
-use Test::More tests => 14;
+use Test::More tests => 25;
 
+use Config;
 use List::Util qw(product);
 
 my $v = product;
@@ -22,6 +23,15 @@ is( $v, -1, 'one -1');
 $v = product(0, 1, 2);
 is( $v, 0, 'first factor zero' );
 
+$v = product(0, 1);
+is( $v, 0, '0 * 1');
+
+$v = product(1, 0);
+is( $v, 0, '1 * 0');
+
+$v = product(0, 0);
+is( $v, 0, 'two 0');
+
 my $x = -3;
 
 $v = product($x, 3);
@@ -89,3 +99,29 @@ is($v, $v1 * 42 * 2, 'bigint + builtin int');
   is($t, 567, 'overload returning non-overload');
 }
 
+SKIP: {
+  skip "IV is not at least 64bit", 8 unless $Config{ivsize} >= 8;
+
+  my $t;
+  my $min = -(1<<31);
+  my $max = (1<<31)-1;
+
+  $t = product($min, $min);
+  is($t,  1<<62, 'min * min');
+  $t = product($min, $max);
+  is($t, (1<<31) - (1<<62), 'min * max');
+  $t = product($max, $min);
+  is($t, (1<<31) - (1<<62), 'max * min');
+  $t = product($max, $max);
+  is($t,  (1<<62)-(1<<32)+1, 'max * max');
+
+  $t = product($min*8, $min);
+  cmp_ok($t, '>',  (1<<61), 'min*8*min'); # may be an NV
+  $t = product($min*8, $max);
+  cmp_ok($t, '<', -(1<<61), 'min*8*max'); # may be an NV
+  $t = product($max, $min*8);
+  cmp_ok($t, '<', -(1<<61), 'min*max*8'); # may be an NV
+  $t = product($max, $max*8);
+  cmp_ok($t, '>',  (1<<61), 'max*max*8'); # may be an NV
+
+}