use Test::More; use PDL; BEGIN { eval "use PDL::Slatec;"; if ( !$@ ) { eval "use PDL::Graphics::Limits;"; plan tests => 26; } else { plan skip_all => 'PDL::Slatec not available'; } }; ##################################################################### # test user override limits. only need to worry about how they affect # the bounding algorithms. they shouldn't be affected by errors, # so don't toss them in the test. $x1 = pdl( 1, 2, 3 ); $x2 = pdl( 2, 3, 4 ); $y1 = pdl( 10, 8, 3 ); $y2 = pdl( 0, 2, 4 ); @udsets_arr = ( [ $x1, $y1 ], [ $x2, $y2 ] ); @udsets_hash = ( [ { x => $x1, y => $y1 }, { x => $x2, y => $y2 } ] ); #############################################################3 #### Bounds => MinMax %attr = ( Bounds => 'MinMax', Clean => 'None' ); # array based @tests = ( [ 'none 0', [ ], [ 1, 4, 0, 10 ] ], [ 'none 1', [ [ ] ], [ 1, 4, 0, 10 ] ], [ 'none 2', [ [ ], [ ] ], [ 1, 4, 0, 10 ] ], [ 'xmin', [ [ -20 ] ], [ -20, 4, 0, 10 ] ], [ 'xmax', [ [ undef, 20 ] ], [ 1, 20, 0, 10 ] ], [ 'xmin+xmax', [ [ -20, 20 ] ], [ -20, 20, 0, 10 ] ], [ 'ymin', [ [ ], [ -20 ] ], [ 1, 4, -20, 10 ] ], [ 'ymax', [ [ ], [ undef, 20 ] ], [ 1, 4, 0, 20 ] ], [ 'ymin+ymax', [ [], [ -20, 20 ] ], [ 1, 4, -20, 20 ] ], [ 'xmin+xmax+ymin+ymax', [ [-20, 10], [ -20, 20 ] ], [ -20, 10, -20, 20 ] ], ); foreach my $test ( @tests ) { my ( $msg, $limits, $exp ) = @$test; my @range = limits( @udsets_arr, { %attr, Limits => $limits } ); ok( mostly_eq_array( \@range, $exp ), "array: $msg" ); } @tests = ( [ 'none', { }, [ 1, 4, 0, 10 ] ], [ 'xmin', { x => { min => -20 } }, [ -20, 4, 0, 10 ] ], [ 'xmax', { x => { max => 20 } }, [ 1, 20, 0, 10 ] ], [ 'xmin+xmax', { x => { min => -20, max => 20 } }, [ -20, 20, 0, 10 ] ], [ 'ymin', { y => { min => -20 } }, [ 1, 4, -20, 10 ] ], [ 'ymax', { y => { max => 20 } }, [ 1, 4, 0, 20 ] ], [ 'ymin+ymax', { y => { min => -20, max => 20 } }, [ 1, 4, -20, 20 ] ], [ 'xmin+xmax+ymin+ymax', { x => { min => -20, max => 10 }, y => { min => -20, max => 20 } }, [ -20, 10, -20, 20 ] ], ); foreach my $test ( @tests ) { my ( $msg, $limits, $exp ) = @$test; my @range = limits( @udsets_hash, { %attr, Limits => $limits, VecKeys => [ qw/ x y / ] } ); ok( mostly_eq_array( \@range, $exp ), "hash: $msg" ); } ############################################################# #### Bounds => ZScale # just use arrays here; tests above suffice to ensure hashes are ok %attr = ( Bounds => 'Zscale', Clean => 'None' ); @tests = ( [ 'none', [ ], [ 1, 4, 0, 10.5 ] ], [ 'xmin', [ [ -20 ] ], [ -20, 4, 0, 10.5 ] ], [ 'xmax', [ [ undef, 20 ] ], [ 1, 20, 0, 10.5 ] ], [ 'xmin+xmax', [ [ -20, 20 ] ], [ -20, 20, 0, 10.5 ] ], [ 'ymin', [ [ ], [ -20 ] ], [ 1, 4, -20, 10.5 ] ], [ 'ymax', [ [ ], [ undef, 20 ] ], [ 1, 4, 0, 20 ] ], [ 'ymin+ymax', [ [], [ -20, 20 ] ], [ 1, 4, -20, 20 ] ], [ 'xmin+xmax+ymin+ymax', [ [-20, 10], [ -20, 20 ] ], [ -20, 10, -20, 20 ] ], ); foreach my $test ( @tests ) { my ( $msg, $limits, $exp ) = @$test; my @range = limits( @udsets_arr, { %attr, Limits => $limits } ); ok( mostly_eq_array( \@range, $exp ), "array: $msg" ); } # check equality of array refs up to a tolerance sub mostly_eq_array { my ($a, $b) = @_; my $tol = 1e-9; for (my $i=0;$i<@$a;$i++) { return 0 unless (abs($$a[$i] - $$b[$i]) < $tol); } return 1; }