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 / sum.t
1 #!./perl
2
3 use strict;
4 use warnings;
5
6 use Test::More tests => 17;
7
8 use Config;
9 use List::Util qw(sum);
10
11 my $v = sum;
12 is( $v, undef,  'no args');
13
14 $v = sum(9);
15 is( $v, 9, 'one arg');
16
17 $v = sum(1,2,3,4);
18 is( $v, 10, '4 args');
19
20 $v = sum(-1);
21 is( $v, -1, 'one -1');
22
23 my $x = -3;
24
25 $v = sum($x, 3);
26 is( $v, 0, 'variable arg');
27
28 $v = sum(-3.5,3);
29 is( $v, -0.5, 'real numbers');
30
31 $v = sum(3,-3.5);
32 is( $v, -0.5, 'initial integer, then real');
33
34 my $one = Foo->new(1);
35 my $two = Foo->new(2);
36 my $thr = Foo->new(3);
37
38 $v = sum($one,$two,$thr);
39 is($v, 6, 'overload');
40
41
42 { package Foo;
43
44 use overload
45   '""' => sub { ${$_[0]} },
46   '0+' => sub { ${$_[0]} },
47   fallback => 1;
48   sub new {
49     my $class = shift;
50     my $value = shift;
51     bless \$value, $class;
52   }
53 }
54
55 use Math::BigInt;
56 my $v1 = Math::BigInt->new(2) ** Math::BigInt->new(65);
57 my $v2 = $v1 - 1;
58 $v = sum($v1,$v2);
59 is($v, $v1 + $v2, 'bigint');
60
61 $v = sum(42, $v1);
62 is($v, $v1 + 42, 'bigint + builtin int');
63
64 $v = sum(42, $v1, 2);
65 is($v, $v1 + 42 + 2, 'bigint + builtin int');
66
67 { package example;
68
69   use overload
70     '0+' => sub { $_[0][0] },
71     '""' => sub { my $r = "$_[0][0]"; $r = "+$r" unless $r =~ m/^\-/; $r .= " [$_[0][1]]"; $r },
72     fallback => 1;
73
74   sub new {
75     my $class = shift;
76
77     my $this = bless [@_], $class;
78
79     return $this;
80   }
81 }
82
83 {
84   my $e1 = example->new(7, "test");
85   my $t = sum($e1, 7, 7);
86   is($t, 21, 'overload returning non-overload');
87   $t = sum(8, $e1, 8);
88   is($t, 23, 'overload returning non-overload');
89   $t = sum(9, 9, $e1);
90   is($t, 25, 'overload returning non-overload');
91 }
92
93 SKIP: {
94   skip "IV is not at least 64bit", 3 unless $Config{ivsize} >= 8;
95
96   # Sum using NV will only preserve 53 bits of integer precision
97   my $t = sum(1<<60, 1);
98   cmp_ok($t, '>', 1<<60, 'sum uses IV where it can');
99
100   my $min = -(1<<63);
101   my $max = (1<<63)-1;
102
103   $t = sum($min, $max);
104   is($t, -1, 'min + max');
105   $t = sum($max, $min);
106   is($t, -1, 'max + min');
107 }