1#!./perl 2 3use strict; 4use warnings; 5 6use Test::More tests => 22; 7use List::Util qw(min); 8 9my $v; 10 11ok(defined &min, 'defined'); 12 13$v = min(9); 14is($v, 9, 'single arg'); 15 16$v = min (1,2); 17is($v, 1, '2-arg ordered'); 18 19$v = min(2,1); 20is($v, 1, '2-arg reverse ordered'); 21 22my @a = map { rand() } 1 .. 20; 23my @b = sort { $a <=> $b } @a; 24$v = min(@a); 25is($v, $b[0], '20-arg random order'); 26 27my $one = Foo->new(1); 28my $two = Foo->new(2); 29my $thr = Foo->new(3); 30 31$v = min($one,$two,$thr); 32is($v, 1, 'overload'); 33 34$v = min($thr,$two,$one); 35is($v, 1, 'overload'); 36 37{ package Foo; 38 39use overload 40 '""' => sub { ${$_[0]} }, 41 '0+' => sub { ${$_[0]} }, 42 '<' => sub { ${$_[0]} < ${$_[1]} }, 43 fallback => 1; 44 sub new { 45 my $class = shift; 46 my $value = shift; 47 bless \$value, $class; 48 } 49} 50 51use Math::BigInt; 52 53my $v1 = Math::BigInt->new(2) ** Math::BigInt->new(65); 54my $v2 = $v1 - 1; 55my $v3 = $v2 - 1; 56$v = min($v1,$v2,$v1,$v3,$v1); 57is($v, $v3, 'bigint'); 58 59$v = min($v1, 1, 2, 3); 60is($v, 1, 'bigint and normal int'); 61 62$v = min(1, 2, $v1, 3); 63is($v, 1, 'bigint and normal int'); 64 65{ 66 # test that min/max and sum call GETMAGIC properly 67 # note, in my tests how this fails depends on exactly 68 # which List::Util subs are called and in what order. 69 my @list; 70 for my $size (10, 20, 10, 30) { 71 @list = ( 1 ) x $size; 72 73 my $sum= List::Util::sum( 0, $#list ); 74 ok( $sum == $size-1, "sum(\$#list, 0) == $size-1"); 75 76 my $min= List::Util::min( 15, $#list ); 77 ok( $min <= 15, "min(15,$size)" ); 78 79 my $max= List::Util::max( 0, $#list ); 80 ok( $max == $size-1, "max(\$#list, 0) == $size-1"); 81 } 82} 83