feedgnuplot/t/plots.t

796 lines
25 KiB
Perl
Raw Normal View History

#!/usr/bin/perl
2013-10-19 16:01:59 +08:00
# 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;
if (! $Config{'useithreads'}) {
print("1..0 # Skip: Perl not compiled with 'useithreads'\n");
exit(0);
}
}
2013-10-19 16:01:59 +08:00
use Test::More tests => 16;
use Test::Script::Run 'is_script_output';
use File::Temp 'tempfile';
2013-10-19 16:01:59 +08:00
tryplot( testname => 'basic line plot',
cmd => 'seq 5',
options => [qw(--lines --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
2013-10-19 16:01:59 +08:00
tryplot( testname => 'basic lines-only plot',
cmd => 'seq 5',
options => [qw(--lines)],
refplot => <<'EOF' );
2013-10-19 16:01:59 +08:00
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
2013-10-19 16:01:59 +08:00
EOF
tryplot( testname => 'basic points-only plot',
cmd => 'seq 5',
options => [qw(--points)],
refplot => <<'EOF' );
2013-10-19 16:01:59 +08:00
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
2013-10-19 16:01:59 +08:00
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' );
2013-10-19 16:01:59 +08:00
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
{
2013-10-19 16:01:59 +08:00
my %args = @_;
my ($fh, $input_filename) = tempfile( UNLINK => 1);
2013-10-19 16:01:59 +08:00
open IN, '-|', $args{cmd};
print $fh <IN>;
close IN;
close $fh;
2013-10-19 16:01:59 +08:00
my @options = ('--exit',
'--extracmds', 'unset grid',
'--terminal', 'dumb 40,40',
$input_filename);
2013-10-19 16:01:59 +08:00
unshift @options, @{$args{options}};
is_script_output( 'feedgnuplot', \@options,
2013-10-19 16:01:59 +08:00
[$args{refplot} =~ /(.*)\n/g], [],
$args{testname});
}