# Before `make install' is performed this script should be runnable with
# `make test'. After `make install' it should work as `perl test.pl'
######################### We start with some black magic to print on failure.
# Change 1..1 below to 1..last_test_to_print .
# (It may become useful if the test is moved to ./t subdirectory.)
use PDL;
use Test::More;
BEGIN{
eval " use PDL::Graphics::PLplot; ";
unless ($@){
plan tests => 25;
}
else {
plan tests => 1;
ok (1, "PDL::Graphics::PLplot not installed");
exit;
}
}
######################### End of black magic.
# Insert your test code below (better if it prints "ok 13"
# (correspondingly "not ok 13") depending on the success of chunk 13
# of the test code):
# Use xfig driver because it should always be installed.
# redirect STDERR to purge silly 'opened *.xfig' messages
require IO::File;
local *SAVEERR;
*SAVEERR = *SAVEERR; # stupid fix to shut up -w (AKA pain-in-the-...-flag)
open(SAVEERR, ">&STDERR");
my $tmp = new_tmpfile IO::File || die "couldn't open tmpfile";
my $pos = $tmp->getpos;
local *IN;
*IN = *$tmp; # doesn't seem to work otherwise
open(STDERR,">&IN") or warn "couldn't redirect stdder";
my ($pl, $x, $y, $min, $max, $oldwin, $nbins);
###
# Initial test to work around font file brain damage: for some kinds of
# PLplot errors, control never returns to us. FMH.
# --CED
###
if($pid = fork()) {
$a = waitpid($pid,0);
} else {
sleep 1;
$pl = PDL::Graphics::PLplot->new(DEV=>"xfig",FILE=>"/tmp/foo$$.xfig");
exit(0);
}
ok( ($not_ok = $? & 0xff )==0 , "PLplot crash test" );
unlink "/tmp/foo$pid.xfig";
if($not_ok) {
printf SAVEERR <<"EOERR" ;
Return value $not_ok; a is $a; pid is $pid
************************************************************************
* PLplot failed the crash test: it appears to crash its owner process. *
* This is probably due to a misconfiguration of the PLplot libraries. *
* Next we'll try creating a test window from which will probably dump *
* some (hopefully helpful) error messages and then die. *
************************************************************************
EOERR
open(STDERR,">&SAVEERR");
}
$pl = PDL::Graphics::PLplot->new (DEV => "xfig",
FILE => "test2.xfig",
BACKGROUND => [255,255,255]);
isa_ok( $pl, "PDL::Graphics::PLplot" ) or die;
$x = sequence(10);
$y = $x**2;
$pl->xyplot($x, $y,
BOX => [-5,10,0,200],
PLOTTYPE => 'LINE');
$pl->close;
ok (-s "test2.xfig" > 0, "Simple line plot");
$pl = PDL::Graphics::PLplot->new (DEV => "xfig", FILE => "test3.xfig",
BACKGROUND => 'WHITE');
$pl->xyplot($x, $y, PLOTTYPE => 'POINTS', COLOR => 'BLUEVIOLET', SYMBOL => 1, SYMBOLSIZE => 4);
$pl->close;
ok (-s "test3.xfig" > 0, "Symbol plot");
$pl = PDL::Graphics::PLplot->new (DEV => "xfig", FILE => "test4.xfig", FRAMECOLOR => 'BLUE');
$pl->xyplot($x, $y, PLOTTYPE => 'LINEPOINTS', COLOR => [50,230,30]);
$pl->close;
ok (-s "test4.xfig" > 0, "Lines and symbols");
$y = sequence(30)+1;
my $m = (50* (exp(1/$y**2) - 1) * random (30,20))->xchg(0,1);
my ($mean, $rms) = statsover($m);
my $x1 = $mean + $rms;
my $x2 = $mean - $rms;
my $n = 500 - exp($y/5);
#$pl = PDL::Graphics::PLplot->new (DEV => "xwin", FILE => "trillian.cosmic.ucar.edu:0");
# Setting text to 1 like this does not work. text is hard coded in ps.c ;(
#$pl = PDL::Graphics::PLplot->new (DEV => "psc", FILE => "test5.ps", OPTS => {'text' => '1'});
$pl = PDL::Graphics::PLplot->new (DEV => "xfig", FILE => "test5.xfig");
$pl->xyplot($x1, $y, COLOR => 'GREEN',
BOX => [($mean - $rms)->minmax, $y->minmax],
XBOX => 'bnst', # bottom line, bottom numbers, ticks, subticks
YBOX => 'bnst', # left line, left numbers, ticks, subticks
TITLE => 'Test statistics plot',
XLAB => 'X label',
YLAB => 'Y label');
$pl->xyplot($x2, $y, COLOR => 'GREEN');
$pl->xyplot($mean, $y, COLOR => 'RED');
$pl->xyplot($n, $y, COLOR => 'BLUE',
XBOX => 'cmst', # top line, top numbers, ticks, subticks
YBOX => 'cst', # right line, ticks, subticks
BOX => [0, int(1.1*$n->max), $y->minmax]);
$pl->text("Count", COLOR => 'PINK',
TEXTPOSITION => ['t', 3, 0.5, 0.5]); # top, 3 units out, string ref. pt in
# center of string, middle of axis
$pl->close;
ok (-s "test5.xfig" > 0, "Sample layer statistics plot");
# test of setting page size.
$pl = PDL::Graphics::PLplot->new (DEV => "xfig",
FILE => "test6.xfig",
PAGESIZE => [50,80]);
$x = sequence(10);
$y = $x**2;
$pl->xyplot($x, $y, PLOTTYPE => 'LINE');
$pl->close;
ok (-s "test6.xfig" > 0, "Setting pagesize");
# test of lines with gaps (plgapline)
$pl = PDL::Graphics::PLplot->new (DEV => "xfig",
FILE => "test7.xfig");
$x = sequence(10);
$y = $x**2;
$x->inplace->setbadat(5); # insert gap
$y->inplace->setbadat(5); # insert gap
$pl->xyplot($x, $y, PLOTTYPE => 'LINE');
$pl->close;
ok (-s "test7.xfig" > 0, "Line plot with gaps (plgapline)");
# test of setting JUSTify = 1
$pl = PDL::Graphics::PLplot->new (DEV => "xfig", FILE => "test8.xfig");
$x = sequence(10);
$y = $x**2;
$pl->xyplot($x, $y, PLOTTYPE => 'LINEPOINTS', JUST => 1);
$pl->close;
ok (-s "test8.xfig" > 0, "Setting JUSTify = 1");
$pl = PDL::Graphics::PLplot->new (DEV => 'xfig', FILE => "test9.xfig");
$pl->text("Test string outside of window", TEXTPOSITION => ['T', 1, 0, 0]);
$pl->text("Test string inside window", TEXTPOSITION => [0, 0, 0.5, 0.5, 0]);
$pl->close;
ok (-s "test9.xfig" > 0, "Printing text inside and outside of plot window");
# test rainbow point plotting with color key
$pl = PDL::Graphics::PLplot->new (DEV => 'xfig', FILE => "test10.xfig");
my $pi = atan2(1,1)*4;
my $a = (sequence(20)/20) * 2 * $pi;
my $b = sin($a);
my $c = cos($a);
$pl->xyplot ($a, $b, SYMBOL => 850, SYMBOLSIZE => 1.5, PALETTE => 'RAINBOW', PLOTTYPE => 'POINTS', COLORMAP => $c);
$pl->colorkey ($c, 'v', VIEWPORT => [0.93, 0.96, 0.15, 0.85]);
$pl->colorkey ($c, 'h', VIEWPORT => [0.15, 0.85, 0.92, 0.95]);
$pl->close;
ok (-s "test10.xfig" > 0, "Colored symbol plot with key");
# Test plot and color key (low level interface)
plsdev ("xfig");
plsfnam ("test11.xfig");
plspage (0,0, 600,600, 0,0);
plinit();
pladv (0);
plvsta();
plwind (0, 1, 0, 1);
plvpor(0.1,0.85,0.1,0.9);
plwind (0, 10, 0, 100);
plcol0(1);
plbox (0, 0, 0, 0, 'BCNST', 'BCNST');
plpoin(10, $x, $y, 2);
plvpor(0.86,0.90,0.1,0.9);
plwind (0, 10, 0, 100);
plbox (0, 0, 0, 0, '', 'TM');
plscmap1l (0, 2, PDL->new(0,1), PDL->new(0,360), PDL->new(0.5, 0.5), PDL->new(1,1), PDL->new(0));
for (my $i=0;$i<10;$i++) {
plcol1($i/10);
plfill (4, PDL->new(0,10,10,0), PDL->new($i*10,$i*10,($i+1)*10,($i+1)*10));
}
plend1();
ok (-s "test11.xfig" > 0, "Colored symbol plot with key, via low level interface");
# Test shade plotting (low level interface)
plsdev ("xfig");
plsfnam ("test12.xfig");
plspage (0,0, 600,600, 0,0);
plinit();
pladv (0);
plvpor(0.1, 0.9, 0.1, 0.9);
plwind (-1, 1, -1, 1);
plpsty(0);
my $nx = 35;
my $ny = 46;
$x = (sequence($nx) - ($nx/2))/($nx/2);
$y = (sequence($ny) - ($ny/2))/(($ny/2) - 1.0);
my $xv = $x->dummy(0, $y->nelem);
my $yv = $y->dummy(1, $x->nelem);
my $z = -sin(7*$xv) * cos (7*$yv) + $xv**2 - $yv**2;
my $nsteps = 15;
my ($zmin, $zmax) = $z->minmax;
my $clevel = ((sequence($nsteps)*(($zmax - $zmin)/($nsteps-1))) + $zmin);
my $fill_width = 2;
my $cont_color = 0;
my $cont_width = 0;
my $xmap = ((sequence($nx)*(2/($nx-1))) + -1); # map X coords linearly to -1 to 1
my $ymap = ((sequence($ny)*(2/($ny-1))) + -1);
plshades($z, -1, 1, -1, 1,
$clevel, $fill_width,
$cont_color, $cont_width, 1, $xmap, $ymap);
plend1();
ok (-s "test12.xfig" > 0, "3D color plot, low level interface");
# test shade plots with higher level interface.
$pl = PDL::Graphics::PLplot->new (DEV => 'xfig', FILE => "test13.xfig");
$pl->shadeplot ($z, $nsteps, BOX => [-1, 1, -1, 1], PALETTE => 'RAINBOW');
$pl->colorkey ($z, 'v', VIEWPORT => [0.93, 0.96, 0.15, 0.85]);
$pl->close;
ok (-s "test13.xfig" > 0, "3D color plot, high level interface");
# Test histogram plotting (low level interface)
plsdev ("xfig");
plsfnam ("test14.xfig");
plspage (0,0, 600,600, 0,0);
plinit();
pladv (0);
plvpor(0.1, 0.9, 0.1, 0.9);
$x = random(100)*100;
($min, $max) = $x->minmax;
$nbins = 15;
$oldwin = 1; # dont call plenv
plwind ($min, $max, 0, 100);
plbox (0, 0, 0, 0, 'bcnst', 'bcnst');
plhist (100, $x, $min, $max, $nbins, $oldwin);
plend1();
ok (-s "test14.xfig" > 0, "Histogram plotting, low level interface");
# test histograms with higher level interface.
$pl = PDL::Graphics::PLplot->new (DEV => 'xfig', FILE => "test15.xfig");
$pl->histogram ($x, $nbins, BOX => [$min, $max, 0, 100]);
$pl->close;
ok (-s "test15.xfig" > 0, "Histogram plotting, high level interface");
# Test multiple plots per page (low level interface)
plsdev ("xfig");
plsfnam ("test16.xfig");
plspage (0,0, 300,600, 0,0);
plssub (1,2);
plinit();
pladv (1);
plvpor(0.1, 0.9, 0.1, 0.9);
$x = random(100)*100;
($min, $max) = $x->minmax;
$nbins = 15;
$oldwin = 1; # dont call plenv
plwind ($min, $max, 0, 100);
plbox (0, 0, 0, 0, 'bcnst', 'bcnst');
plhist (100, $x, $min, $max, $nbins, $oldwin);
pladv (2);
plvpor(0.1, 0.9, 0.1, 0.9);
$x = random(200)*100;
($min, $max) = $x->minmax;
$nbins = 15;
$oldwin = 1; # dont call plenv
plwind ($min, $max, 0, 100);
plbox (0, 0, 0, 0, 'bcnst', 'bcnst');
plhist (100, $x, $min, $max, $nbins, $oldwin);
plend1();
ok (-s "test16.xfig" > 0, "Multiple plots per page, low level interface");
# test multiple pages per plot (high level interface)
$pl = PDL::Graphics::PLplot->new (DEV => 'xfig', FILE => "test17.xfig", SUBPAGES => [1,2]);
$pl->histogram ($x, $nbins, BOX => [$min, $max, 0, 100]);
$pl->histogram ($x, $nbins, BOX => [$min, $max, 0, 100], SUBPAGE => 2);
$pl->close;
ok (-s "test17.xfig" > 0, "Multiple plots per page, high level interface");
$pl = PDL::Graphics::PLplot->new (DEV => 'xfig', FILE => "test18.xfig");
$x = sequence(10);
$y = $x**2;
$pl->xyplot($x, $y, PLOTTYPE => 'LINE', LINESTYLE => 2);
$pl->close;
ok (-s "test18.xfig" > 0, "Setting LINESTYLE");
# test setting plot orientation
$pl = PDL::Graphics::PLplot->new (DEV => 'xfig', FILE => "test19.xfig", ORIENTATION => 1);
$x = sequence(10);
$y = $x**2;
$pl->xyplot($x, $y, PLOTTYPE => 'LINE', LINESTYLE => 2);
$pl->close;
ok (-s "test19.xfig" > 0, "Setting plot orientation");
# test symbol plotting
$pl = PDL::Graphics::PLplot->new (DEV => 'xfig', FILE => "test20.xfig");
$pl->setparm (BOX => [0,200,0,200]);
for (my $x=0;$x<20;$x++) {
for (my $y=0;$y<20;$y++) {
my $xp = pdl(10*$x);
my $yp = pdl(10*$y);
$pl->xyplot($xp, $yp, PLOTTYPE => 'POINTS', SYMBOL => 20*$x+$y);
}
}
$pl->close;
ok (-s "test20.xfig" > 0, "Symbol plotting");
# test label plotting in multiple subpage plots
$pl = PDL::Graphics::PLplot->new(DEV => 'xfig',
FILE => "test21.xfig",
PAGESIZE => [500,900],
SUBPAGES => [1,6]);
my @colors = qw(GREEN BLUE RED BROWN BLACK YELLOW);
for my $i (0..5) {
my $x = sequence(100)*0.1;
my $y = sin($x);
$pl->xyplot($x, $y,
COLOR => $colors[$i],
SUBPAGE => $i+1,
TITLE => "Title $i",
XLAB => "1 to 10",
YLAB => "sin(x)");
}
$pl->close;
ok (-s "test21.xfig" > 0, "Multiple subpages");
# test bar graphs
$pl = PDL::Graphics::PLplot->new(DEV => 'xfig', FILE => "test22.xfig");
$pl->bargraph([map { sprintf ("2002.%03d", $_) } (1..100)], 100*random(100), COLOR => 'BLUE');
$pl->close;
ok (-s "test22.xfig" > 0, "Bar graph");
$pl = PDL::Graphics::PLplot->new(DEV => 'xfig', FILE => "test23.xfig");
my @labels = ((map { sprintf ("2001.%03d", $_) } (240..365)), (map { sprintf ("2002.%03d", $_) } (1..100)));
$pl->bargraph(\@labels, 100*random(scalar(@labels)), COLOR => 'GREEN');
$pl->close;
ok (-s "test23.xfig" > 0, "Bar graph part 2");
$pl = PDL::Graphics::PLplot->new(DEV => 'xfig', FILE => "test24.xfig");
$x = sequence(10);
$y = $x**2;
$pl->xyplot($x, $y, PLOTTYPE => 'LINE', XERRORBAR => ones(10)*0.5, XTICK => 2, NXSUB => 5,
YERRORBAR => $y*0.1, YTICK => 20, NYSUB => 10,
MINTICKSIZE => 2, MAJTICKSIZE => 3);
$pl->close;
ok (-s "test24.xfig" > 0, "Setting error bars and tick size");
unlink glob ("test*.xfig");
# stop STDERR redirection and examine output
open(STDERR, ">&SAVEERR");
$tmp->setpos($pos); # rewind
my $txt = join '',<IN>;
close IN; undef $tmp;
print "\ncaptured STDERR: ('Opened ...' messages are harmless)\n$txt\n";
$txt =~ s/Opened test\d*\.xfig\n//sg;
warn $txt unless $txt =~ /\s*/;