From deaa85dbd3f518cd0fb15cd356afa634bb546502 Mon Sep 17 00:00:00 2001 From: Dima Kogan Date: Sat, 19 Oct 2013 01:01:59 -0700 Subject: [PATCH] expanded test suite --- t/plots.t | 729 +++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 718 insertions(+), 11 deletions(-) diff --git a/t/plots.t b/t/plots.t index e510306..907a919 100644 --- a/t/plots.t +++ b/t/plots.t @@ -1,5 +1,11 @@ #!/usr/bin/perl +# This tests various features of feedgnuplot. Note that the tests look at actual +# plot output using the 'dumb' terminal, so any changes in gnuplot itself that +# change the way the output looks will show up as test failures. Hopefully this +# will not be a big deal + + # require a threaded perl for my tests. This block lifted verbatim from the cpantesters wiki BEGIN { use Config; @@ -9,12 +15,14 @@ BEGIN { } } -use Test::More tests => 1; +use Test::More tests => 16; use Test::Script::Run 'is_script_output'; use File::Temp 'tempfile'; - -tryplot( [], 'seq 5', <<'EOF' ); +tryplot( testname => 'basic line plot', + cmd => 'seq 5', + options => [qw(--lines --points)], + refplot => <<'EOF' ); 5 ++--+---+--+---+---+---+--+--+A @@ -57,32 +65,731 @@ tryplot( [], 'seq 5', <<'EOF' ); EOF +tryplot( testname => 'basic lines-only plot', + cmd => 'seq 5', + options => [qw(--lines)], + refplot => <<'EOF' ); + + + 5 ++--+---+--+---+---+---+--+--+* + + + + + + + + + *+ + | * | + | * | + 4.5 ++ * ++ + | * | + | * | + | * | + | * | + 4 ++ * ++ + | * | + | * | + | * | + 3.5 ++ * ++ + | * | + | * | + | * | + 3 ++ * ++ + | * | + | * | + | * | + | * | + 2.5 ++ * ++ + | * | + | * | + | * | + 2 ++ * ++ + | * | + | * | + | * | + | * | + 1.5 ++ * ++ + | * | + | * | + +* + + + + + + + + + 1 *+--+---+--+---+---+---+--+--++ + 1 1.5 2 2.5 3 3.5 4 4.5 5 + +EOF + +tryplot( testname => 'basic points-only plot', + cmd => 'seq 5', + options => [qw(--points)], + refplot => <<'EOF' ); + + + 5 ++--+---+--+---+---+---+--+--+A + + + + + + + + + + + | | + | | + 4.5 ++ ++ + | | + | | + | | + | | + 4 ++ A ++ + | | + | | + | | + 3.5 ++ ++ + | | + | | + | | + 3 ++ A ++ + | | + | | + | | + | | + 2.5 ++ ++ + | | + | | + | | + 2 ++ A ++ + | | + | | + | | + | | + 1.5 ++ ++ + | | + | | + + + + + + + + + + + 1 A+--+---+--+---+---+---+--+--++ + 1 1.5 2 2.5 3 3.5 4 4.5 5 + +EOF + +tryplot( testname => 'basic line plot with bounds', + cmd => 'seq 5', + options => [qw(--lines --points), + qw(--xmin -10.5 --xmax 4.5 --ymin -0.5 --ymax 5.5)], + refplot => <<'EOF' ); + + + ++---+----+---+---+---+----+---++ + |+ + + + + + + +| + | | + 5 ++ ++ + | | + | | + | * + | * + | *| + 4 ++ A+ + | *| + | * | + | * | + | * | + | * | + 3 ++ A ++ + | * | + | * | + | * | + | * | + 2 ++ A ++ + | * | + | * | + | * | + | * | + | * | + 1 ++ A ++ + | | + | | + | | + | | + | | + 0 ++ ++ + | | + |+ + + + + + + +| + ++---+----+---+---+---+----+---++ + -10 -8 -6 -4 -2 0 2 4 + +EOF + +tryplot( testname => 'basic line plot with bounds, square aspect ratio', + cmd => 'seq 5', + options => [qw(--lines --points), + qw(--xmin -10.5 --xmax 4.5 --ymin -0.5 --ymax 5.5 --square)], + refplot => <<'EOF' ); + + + + + + + + ++---+----+---+---+---+----+---++ + 5 ++ + + + + + + ++ + | * + 4 ++ A+ + | * | + 3 ++ A ++ + | * | + | * | + 2 ++ A ++ + | * | + 1 ++ A ++ + | | + 0 ++ + + + + + + ++ + ++---+----+---+---+---+----+---++ + -10 -8 -6 -4 -2 0 2 4 + + + + + + + + + + + + +EOF + +tryplot( testname => 'lines on both axes with labels, legends, titles', + cmd => q{seq 5 | awk '{print 2*$1, $1*$1}'}, + options => [qw(--lines --points), + '--legend', '0', 'data 0', + '--title', "Test plot", + qw(--y2 1 --y2label y2 --xlabel x --ylabel y --y2max 30)], + refplot => <<'EOF' ); + + Test plot + y2 + 10 ++-+---+--+--+--+---+--+-+A 30 + + + + + + + + + *+ + | data 0 **A****| + | * | + 9 ++ * | + | * +B 25 + | * #| + | * #| + 8 ++ A # | + | * # | + | * # | + | * # ++ 20 + 7 ++ * # | + | * # | + | * # | + | * B | + 6 ++ A # ++ 15 + | * # | + | * # | + | * # | + | * # | + 5 ++ * # | + | * # ++ 10 + | * B | + | * # | + 4 ++ A # | + | * # | + | * # ++ 5 + | * # | + 3 ++ * #B | + | *## | + | *# | + B* + + + + + + + + + 2 A+-+---+--+--+--+---+--+-++ 0 + 1 1.5 2 2.5 3 3.5 4 4.5 5 + x + +EOF + +tryplot( testname => 'lines on both axes with labels, legends, titles; different styles', + cmd => q{seq 5 | awk '{print 2*$1, $1*$1}'}, + options => ['--legend', '0', 'data 0', + '--title', "Test plot", + qw(--y2 1 --y2label y2 --xlabel x --ylabel y --y2max 30), + '--curvestyle', '0', 'with lines', + '--curvestyle', '1', 'with points ps 3 pt 7'], + refplot => <<'EOF' ); + + Test plot + y2 + 10 ++-+---+--+--+--+---+--+-+* 30 + + + + + + + + + *+ + | data 0 *******| + | * | + 9 ++ * | + | * +G 25 + | * | + | * | + 8 ++ * | + | * | + | * | + | * ++ 20 + 7 ++ * | + | * | + | * | + | * G | + 6 ++ * ++ 15 + | * | + | * | + | * | + | * | + 5 ++ * | + | * ++ 10 + | * G | + | * | + 4 ++ * | + | * | + | * ++ 5 + | * | + 3 ++ * G | + | * | + | * | + G* + + + + + + + + + 2 *+-+---+--+--+--+---+--+-++ 0 + 1 1.5 2 2.5 3 3.5 4 4.5 5 + x + +EOF + +tryplot( testname => 'domain plot', + cmd => q{seq 5 | awk '{print 2*$1, $1*$1}'}, + options => [qw(--lines --points), '--domain'], + refplot => <<'EOF' ); + + + 25 ++--+---+---+---+--+---+---+--+A + + + + + + + + + *+ + | *| + | * | + | * | + | * | + | * | + 20 ++ * ++ + | * | + | * | + | * | + | * | + | * | + | A | + 15 ++ * ++ + | * | + | * | + | * | + | * | + | * | + | * | + 10 ++ * ++ + | A | + | * | + | * | + | ** | + | * | + | * | + 5 ++ * ++ + | A | + | ** | + | ** | + | * | + |** | + A + + + + + + + + + 0 ++--+---+---+---+--+---+---+--++ + 2 3 4 5 6 7 8 9 10 + +EOF + +tryplot( testname => 'dataid plot', + cmd => q{seq 5 | awk '{print 2*$1, $1*$1}'}, + options => [qw(--lines --points), + qw(--dataid --autolegend)], + refplot => <<'EOF' ); + + + 25 ++--+---+---+---+--+---+---+--+E + + + + + + + + + + + | 2 **A*** | + | 4 ##B### | + | 6 $$C$$$ | + | 8 %%D%%% | + | 10 @@E@@@ | + 20 ++ ++ + | | + | | + | | + | | + | | + | D | + 15 ++ ++ + | | + | | + | | + | | + | | + | | + 10 ++ ++ + | C | + | | + | | + | | + | | + | | + 5 ++ ++ + | B | + | | + | | + | | + | | + A + + + + + + + + + 0 ++--+---+---+---+--+---+---+--++ + 1 1.5 2 2.5 3 3.5 4 4.5 5 + +EOF + +tryplot( testname => '3d spiral with bounds, labels', + cmd => q{seq 50 | awk '{print 2*cos($1/5), sin($1/5), $1}'}, + options => [qw(--lines --points), + qw(--3d --domain --zmin -5 --zmax 45 --zlabel z), + '--extracmds', 'set view 60,30'], + refplot => <<'EOF' ); + + + + + + + + A*AA*AA* + * A* + AA + A + A + * + + A + 40 |+ A*A*AAA* A + | A A*A* A + 30 |+ AA A A + | A A + z 20 |+ AA A A + | AA*AA*A*AA*A*A A + 10 |+ +- A + | -+ --- A + 0 |+ -+ + --- + | -+ +--- + | --+ + --- + | -++ +- 1 + | -+ 0.8 + |-+ 0.6 + ++--- - 0.4 + -21.5 +--- -+ 0.2 + -1+ + +-- +-0.2 + -0.50+ +--- +-0.4 + 0.51++-+-0.6 + 1.5+-1.8 + 2 + + + + + +EOF + +tryplot( testname => '3d spiral with bounds, labels, square xy aspect ratio', + cmd => q{seq 50 | awk '{print 2*cos($1/5), sin($1/5), $1}'}, + options => [qw(--lines --points), + qw(--3d --domain --zmin -5 --zmax 45 --zlabel z), + '--extracmds', 'set view 60,30', '--square_xy'], + refplot => <<'EOF' ); + + + + + + + + + *AA* + AA*A + A + + A*A + 40 |+ A + | A + 30 |+ A + | AAAAA* A + z 20 |+AA AA A + | AA* A*A AA + | AA*AAA*AA*A + 10 |+ AAA + 0 |+ A + | A + | +- A + | -++--- + | --+ +--- + |-++ +--- + +++-- --- + -21.5+--- +- 1 + -10.5--- + 0.6 + 0 +--- + 024 + 0.5 ++-0.4 + 1.521.8 + + + + + + + + +EOF + +tryplot( testname => 'Histogram plot', + cmd => q{seq 50 | awk '{print $1*$1}'}, + options => [qw(--lines --points), + qw(--histo 0 --binwidth 50 --ymin 0 --curvestyleall), 'with boxes'], + refplot => <<'EOF' ); + + + 4 ++--**---+---+---+---+----+--++ + + ** + + + + + + + | ** | + | ** | + 3.5 ++ ** ++ + | ** | + | ** | + | ** | + | ** | + 3 ++ ** ++ + | ** | + | ** | + | ** | + 2.5 ++ ** ++ + | ** | + | ** | + | ** | + 2 ++ **** ++ + | **** | + | **** | + | **** | + | **** | + 1.5 ++ **** ++ + | **** | + | **** | + | **** | + 1 ++ *********************** ++ + | *********************** | + | *********************** | + | *********************** | + | *********************** | + 0.5 ++ *********************** ++ + | *********************** | + | *********************** | + + *********************** + + 0 ++--***********************--++ + -500 0 500 100015002000 25003000 + +EOF + +tryplot( testname => 'Cumulative histogram', + cmd => q{seq 50 | awk '{print $1*$1}'}, + options => [qw(--lines --points), + qw(--histo 0 --histstyle cum --binwidth 50 --ymin 0 --curvestyleall), 'with boxes'], + refplot => <<'EOF' ); + + + 50 ++--+----+---+----+---+---**--++ + + + + + + + *** + + | **** | + | ****** | + | ******* | + | ******* | + | ********* | + 40 ++ ********** ++ + | *********** | + | ************ | + | ************* | + | ************** | + | ************** | + | *************** | + 30 ++ **************** ++ + | ***************** | + | ***************** | + | ****************** | + | ****************** | + | ******************* | + | ******************** | + 20 ++ ******************** ++ + | ********************* | + | ********************* | + | ********************** | + | ********************** | + | ********************** | + | *********************** | + 10 ++ *********************** ++ + | *********************** | + | *********************** | + | *********************** | + | ************************ | + | ************************ | + + ************************ + + 0 ++--************************--++ + -500 0 500 1000 15002000 25003000 + +EOF + +tryplot( testname => 'Circles', + cmd => q{seq 5 | awk '{print $1,$1,$1/10}'}, + options => [qw(--circles --domain)], + refplot => <<'EOF' ); + + + 5 ++-+--+--+--+--+--+--+--*--+-** + + + + + + + + + * + *+ + | * *| + | ******| + 4.5 ++ ++ + | | + | | + | * | + | **** | + 4 ++ * ** ++ + | * * | + | **** | + | | + 3.5 ++ ++ + | | + | * | + | **** | + 3 ++ * ** ++ + | * * | + | **** | + | | + | | + 2.5 ++ ++ + | | + | | + | * | + 2 ++ *** ++ + | ** | + | | + | | + | | + 1.5 ++ ++ + | | + | | + + * + + + + + + + + + + 1 ++***-+--+--+--+--+--+--+--+-++ + 0.5 1 1.5 2 2.5 3 3.5 4 4.5 5 5.5 + +EOF + +tryplot( testname => 'Error bars (using extraValuesPerPoint)', + cmd => q{seq 5 | awk '{print $1,$1,$1/10}'}, + options => [qw(--domain), + qw(--extraValuesPerPoint 1 --curvestyle 0), 'with errorbars'], + refplot => <<'EOF' ); + + + 5.5 ++--+---+--+---+---+---+--+--*** + + + + + + + + + * + | * + 5 ++ +A + | * + | * + | * + 4.5 ++ *** + | *** | + | * | + 4 ++ A ++ + | * | + | * | + | *** | + 3.5 ++ ++ + | *** | + | * | + 3 ++ A ++ + | * | + | * | + | *** | + 2.5 ++ ++ + | | + | *** | + 2 ++ A ++ + | * | + | *** | + | | + 1.5 ++ ++ + | | + | | + 1*A* ++ + *** | + | | + + + + + + + + + + + 0.5 ++--+---+--+---+---+---+--+--++ + 1 1.5 2 2.5 3 3.5 4 4.5 5 + +EOF + +tryplot( testname => 'Monotonicity check', + cmd => q{seq 10 | awk '{print (NR-1)%5,NR}'}, + options => [qw(--lines --points --domain --monotonic)], + refplot => <<'EOF' ); + + + 10 ++--+---+--+---+---+---+--+--+A + + + + + + + + + *+ + | * | + | * | + 9.5 ++ * ++ + | * | + | * | + | * | + | * | + 9 ++ A ++ + | * | + | * | + | * | + 8.5 ++ * ++ + | * | + | * | + | * | + 8 ++ A ++ + | * | + | * | + | * | + | * | + 7.5 ++ * ++ + | * | + | * | + | * | + 7 ++ A ++ + | * | + | * | + | * | + | * | + 6.5 ++ * ++ + | * | + | * | + +* + + + + + + + + + 6 A+--+---+--+---+---+---+--+--++ + 0 0.5 1 1.5 2 2.5 3 3.5 4 + +EOF + sub tryplot { - my $extraoptions = shift; - my $incmd = shift; - my $ref = shift; + my %args = @_; my ($fh, $input_filename) = tempfile( UNLINK => 1); - open IN, '-|', $incmd; + open IN, '-|', $args{cmd}; print $fh ; close IN; close $fh; - my @options = (qw(--lines --points --exit), + my @options = ('--exit', '--extracmds', 'unset grid', '--terminal', 'dumb 40,40', $input_filename); - unshift @options, @$extraoptions; + unshift @options, @{$args{options}}; is_script_output( 'feedgnuplot', \@options, - [$ref =~ /(.*)\n/g], [], - 'basic line plot'); + [$args{refplot} =~ /(.*)\n/g], [], + $args{testname}); }