feedgnuplot/t/plots.t

2160 lines
175 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-20 14:55:47 +08:00
use Test::More tests => 52;
use File::Temp 'tempfile';
use IPC::Run 'run';
use String::ShellQuote;
use File::Basename;
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-20 10:44:59 +08:00
tryplot( testname => 'basic line plot to piped hardcopy',
cmd => 'seq 5',
options => [qw(--lines --points),
'--hardcopy', '|cat'],
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
2013-10-20 10:44:59 +08:00
Wrote output to |cat
EOF
2013-10-19 16:01:59 +08:00
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
2013-10-19 16:01:59 +08:00
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
2013-10-19 16:01:59 +08:00
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
2013-10-19 16:01:59 +08:00
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
2013-10-19 16:01:59 +08:00
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
2013-10-19 16:01:59 +08:00
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
2013-10-19 16:01:59 +08:00
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
2013-10-19 16:01:59 +08:00
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
2013-10-19 16:01:59 +08:00
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****A****A****A***A**
* **A**
**A***A*
*A*
*A
*
+ A
40 |+ **A****A****A****A***A** A
| **A **A****A** A
30 |+ A*A *A** *A
| A *AA*
z 20 |+ AA** **A* *A*
| A**A***A***A****A*****A***A****A****A* AA
10 |+ -+---- A
| ---- +--------- A
0 |+ ---+ + ---------
| ---++ +-+---------
| ----++ + ---------
| ---+ + ----- 1
| ---+ --- 0.8
| ----+ --++ 0.6
+-+++--------- --- 0.20.4
-2 -1.5 ++ +--------- --- 0
-1 + ++ --+------ --- -0.2
-0.5 0 + ++ --------- ---+ -0.4
0.5 1 ++ -+--- --0.8.6
1.5 + +-1+
2
2013-10-19 16:01:59 +08:00
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
2013-10-19 16:01:59 +08:00
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 1000 1500 2000 2500 3000
2013-10-19 16:01:59 +08:00
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 1500 2000 2500 3000
2013-10-19 16:01:59 +08:00
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
2013-10-19 16:01:59 +08:00
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
2013-10-19 16:01:59 +08:00
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
2013-10-19 16:01:59 +08:00
EOF
2013-10-20 14:55:47 +08:00
tryplot( testname => 'basic --timefmt plot',
cmd => q{seq 5 | awk '{print strftime("%d %b %Y %T",1382249107+$1,1),$1}'},
options => ['--domain', '--timefmt', '%d %b %Y %H:%M:%S'],
refplot => <<'EOF' );
5 ++---------+-----------+----------+----------+----------+-----------+----------+---------+A
+ + + + + + + + +
| |
| |
4.5 ++ ++
| |
| |
| |
| |
4 ++ A ++
| |
| |
| |
3.5 ++ ++
| |
| |
| |
3 ++ A ++
| |
| |
| |
| |
2.5 ++ ++
| |
| |
| |
2 ++ A ++
| |
| |
| |
| |
1.5 ++ ++
| |
| |
+ + + + + + + + +
1 A+---------+-----------+----------+----------+----------+-----------+----------+---------++
05:08 05:08 05:09 05:09 05:10 05:10 05:11 05:11 05:12
2013-10-20 14:55:47 +08:00
EOF
tryplot( testname => '--timefmt plot with bounds',
cmd => q{seq 5 | awk '{print strftime("%d %b %Y %T",1382249107+$1,1),$1}'},
options => ['--domain', '--timefmt', '%d %b %Y %H:%M:%S',
'--xmin', '20 Oct 2013 06:05:00',
'--xmax', '20 Oct 2013 06:05:20'],
refplot => <<'EOF' );
5 ++---+---+----+---+----+---+----+---+----+---+----+---A----+---+----+---+----+---+----+--++
+ + + + +
| |
| |
4.5 ++ ++
| |
| |
| |
| |
4 ++ A ++
| |
| |
| |
3.5 ++ ++
| |
| |
| |
3 ++ A ++
| |
| |
| |
| |
2.5 ++ ++
| |
| |
| |
2 ++ A ++
| |
| |
| |
| |
1.5 ++ ++
| |
| |
+ + + + +
1 ++---+---+----+---+----+---+----+---A----+---+----+---+----+---+----+---+----+---+----+--++
05:00 05:05 05:10 05:15 05:20
2013-10-20 14:55:47 +08:00
EOF
tryplot( testname => '--timefmt plot with --monotonic',
cmd => q{seq 10 | awk '{x=(NR-1)%5; print strftime("%d %b %Y %T",1382249107+x,1),$1}'},
options => ['--domain', '--timefmt', '%d %b %Y %H:%M:%S',
'--monotonic'],
refplot => <<'EOF' );
10 ++---------+-----------+----------+----------+----------+-----------+----------+---------+A
+ + + + + + + + +
| |
| |
9.5 ++ ++
| |
| |
| |
| |
9 ++ A ++
| |
| |
| |
8.5 ++ ++
| |
| |
| |
8 ++ A ++
| |
| |
| |
| |
7.5 ++ ++
| |
| |
| |
7 ++ A ++
| |
| |
| |
| |
6.5 ++ ++
| |
| |
+ + + + + + + + +
6 A+---------+-----------+----------+----------+----------+-----------+----------+---------++
05:07 05:07 05:08 05:08 05:09 05:09 05:10 05:10 05:11
2013-10-20 14:55:47 +08:00
EOF
2013-10-20 13:34:03 +08:00
note( "Starting to run streaming tests. These will take several seconds each" );
# replotting every 1.0 seconds. Data comes in every 1.1 seconds. Two data
# points, and then "exit", so I should have two frames worth of data plotted. I
# pre-send a 0 so that the gnuplot autoscaling is always well-defined
tryplot( testname => 'basic streaming test',
2013-10-20 14:55:47 +08:00
cmd => q{seq 500 | awk 'BEGIN{ print 0; } {print (NR==3)? "exit" : $0; fflush(); system("sleep 1.2");}'},
2013-10-20 13:34:03 +08:00
options => [qw(--lines --points --stream)],
refplot => <<'EOF' );
1 ++----------------+-----------------+-----------------+-----------------+----------------*A
+ + + + + ** +
| *** |
| *** |
| ** |
| *** |
| ** |
0.8 ++ *** ++
| ** |
| *** |
| *** |
| ** |
| *** |
| ** |
0.6 ++ *** ++
| ** |
| *** |
| *** |
| ** |
| *** |
| ** |
0.4 ++ *** ++
| ** |
| *** |
| *** |
| ** |
| *** |
| ** |
0.2 ++ *** ++
| ** |
| *** |
| *** |
| ** |
| *** |
+ ** + + + + +
0 A*----------------+-----------------+-----------------+-----------------+----------------++
1 1.2 1.4 1.6 1.8 2
2013-10-20 13:34:03 +08:00
2 ++---------------------+---------------------+----------------------+--------------------*A
+ + + + ** +
| *** |
| *** |
| ** |
| *** |
| *** |
| ** |
| *** |
1.5 ++ *** ++
| ** |
| *** |
| *** |
| ** |
| *** |
| *** |
| ** |
1 ++ *A* ++
| ** |
| *** |
| ** |
| *** |
| ** |
| *** |
| ** |
| *** |
0.5 ++ ** ++
| *** |
| ** |
| *** |
| ** |
| *** |
| ** |
| *** |
+ ** + + + +
0 A*---------------------+---------------------+----------------------+--------------------++
1 1.5 2 2.5 3
2013-10-20 13:34:03 +08:00
EOF
tryplot( testname => 'basic streaming test, twice as fast',
cmd => q{seq 500 | awk 'BEGIN{ print 0; } {print (NR==3)? "exit" : $0; fflush(); system("sleep 0.6");}'},
options => [qw(--lines --points --stream 0.4)],
refplot => <<'EOF' );
1 ++----------------+-----------------+-----------------+-----------------+----------------*A
+ + + + + ** +
| *** |
| *** |
| ** |
| *** |
| ** |
0.8 ++ *** ++
| ** |
| *** |
| *** |
| ** |
| *** |
| ** |
0.6 ++ *** ++
| ** |
| *** |
| *** |
| ** |
| *** |
| ** |
0.4 ++ *** ++
| ** |
| *** |
| *** |
| ** |
| *** |
| ** |
0.2 ++ *** ++
| ** |
| *** |
| *** |
| ** |
| *** |
+ ** + + + + +
0 A*----------------+-----------------+-----------------+-----------------+----------------++
1 1.2 1.4 1.6 1.8 2
2013-10-20 13:34:03 +08:00
2 ++---------------------+---------------------+----------------------+--------------------*A
+ + + + ** +
| *** |
| *** |
| ** |
| *** |
| *** |
| ** |
| *** |
1.5 ++ *** ++
| ** |
| *** |
| *** |
| ** |
| *** |
| *** |
| ** |
1 ++ *A* ++
| ** |
| *** |
| ** |
| *** |
| ** |
| *** |
| ** |
| *** |
0.5 ++ ** ++
| *** |
| ** |
| *** |
| ** |
| *** |
| ** |
| *** |
+ ** + + + +
0 A*---------------------+---------------------+----------------------+--------------------++
1 1.5 2 2.5 3
2013-10-20 13:34:03 +08:00
EOF
tryplot( testname => 'streaming with --xlen',
cmd => q{seq 500 | awk 'BEGIN{ print 0; } {print (NR==3)? "exit" : $0; fflush(); system("sleep 0.6");}'},
options => [qw(--lines --points --stream 0.4 --xlen 1.1)],
refplot => <<'EOF' );
1 ++------+----------------+---------------+---------------+----------------+--------------*A
| + + + + + ** +
| ** |
| *** |
| ** |
| ** |
| *** |
0.8 ++ ** ++
| ** |
| *** |
| ** |
| ** |
| *** |
| ** |
0.6 ++ ** ++
| *** |
| ** |
| *** |
| ** |
| ** |
| *** |
0.4 ++ ** ++
| ** |
| *** |
| ** |
| ** |
| *** |
| ** |
0.2 ++ ** ++
| *** |
| ** |
| ** |
| *** |
| ** |
| + ** + + + + +
0 ++------A*---------------+---------------+---------------+----------------+--------------++
1 1.2 1.4 1.6 1.8 2
2013-10-20 13:34:03 +08:00
2 ++------+----------------+---------------+---------------+----------------+--------------*A
| + + + + + ** +
| ** |
| *** |
| ** |
| ** |
| *** |
1.8 ++ ** ++
| ** |
| *** |
| ** |
| ** |
| *** |
| ** |
1.6 ++ ** ++
| *** |
| ** |
| *** |
| ** |
| ** |
| *** |
1.4 ++ ** ++
| ** |
| *** |
| ** |
| ** |
| *** |
| ** |
1.2 ++ ** ++
| *** |
| ** |
| ** |
| *** |
| ** |
| + ** + + + + +
1 ++------A*---------------+---------------+---------------+----------------+--------------++
2 2.2 2.4 2.6 2.8 3
2013-10-20 13:34:03 +08:00
EOF
tryplot( testname => 'streaming with --monotonic',
cmd => q{seq 500 | awk '{if(NR==11) {print "exit";} else {x=(NR-1)%5; if(x==0) {print -1,-1;} print x,NR;}; fflush(); system("sleep 0.6");}'},
options => [qw(--lines --points --stream 0.4 --domain --monotonic)],
refplot => <<'EOF' );
1 ++----------------+-----------------+-----------------+-----------------+----------------*A
+ + + + + ** +
| *** |
| *** |
| ** |
| *** |
| ** |
| *** |
| ** |
0.5 ++ *** ++
| *** |
| ** |
| *** |
| ** |
| *** |
| ** |
| *** |
0 ++ *** ++
| ** |
| *** |
| ** |
| *** |
| ** |
| *** |
| *** |
| ** |
-0.5 ++ *** ++
| ** |
| *** |
| ** |
| *** |
| *** |
| ** |
| *** |
+ ** + + + + +
-1 A*----------------+-----------------+-----------------+-----------------+----------------++
-1 -0.8 -0.6 -0.4 -0.2 0
2013-10-20 13:34:03 +08:00
2 ++---------------------+---------------------+----------------------+--------------------*A
+ + + + **** +
| **** |
| **** |
| *** |
| **** |
1.5 ++ **** ++
| **** |
| *** |
| **** |
| **** |
| **** |
1 ++ A* ++
| ** |
| ** |
| ** |
| ** |
0.5 ++ ** ++
| ** |
| ** |
| ** |
| ** |
| ** |
0 ++ ** ++
| ** |
| ** |
| ** |
| ** |
| ** |
-0.5 ++ ** ++
| ** |
| ** |
| ** |
| ** |
+** + + + +
-1 A+---------------------+---------------------+----------------------+--------------------++
-1 -0.5 0 0.5 1
2013-10-20 13:34:03 +08:00
3 ++-------------+--------------+--------------+--------------+--------------+-------------*A
+ + + + + + **** +
| *** |
| *** |
2.5 ++ **** ++
| *** |
| *** |
| **** |
| *** |
2 ++ *A* ++
| **** |
| **** |
| **** |
1.5 ++ *** ++
| **** |
| **** |
| **** |
1 ++ A* ++
| ** |
| ** |
| * |
| ** |
0.5 ++ ** ++
| * |
| ** |
| ** |
0 ++ * ++
| ** |
| ** |
| * |
| ** |
-0.5 ++ ** ++
| * |
| ** |
+** + + + + + +
-1 A+-------------+--------------+--------------+--------------+--------------+-------------++
-1 -0.5 0 0.5 1 1.5 2
2013-10-20 13:34:03 +08:00
4 ++----------+----------+-----------+----------+-----------+----------+-----------+---------*A
+ + + + + + + + *** +
| **** |
| *** |
| *** |
| **** |
| *** |
3 ++ *A* ++
| *** |
| **** |
| *** |
| *** |
| **** |
| *** |
2 ++ *A* ++
| *** |
| **** |
| *** |
| *** |
| **** |
| *** |
1 ++ A* ++
| ** |
| ** |
| * |
| ** |
| ** |
| * |
0 ++ ** ++
| * |
| ** |
| ** |
| * |
| ** |
+** + + + + + + + +
-1 A+----------+----------+-----------+----------+-----------+----------+-----------+---------++
-1 -0.5 0 0.5 1 1.5 2 2.5 3
2013-10-20 13:34:03 +08:00
5 ++----------------+------------------+-----------------+------------------+----------------*A
+ + + + + *** +
| *** |
| *** |
| *** |
| *** |
4 ++ *A* ++
| *** |
| *** |
| **** |
| *** |
| *** |
3 ++ *A* ++
| **** |
| **** |
| *** |
| **** |
2 ++ *A* ++
| *** |
| *** |
| **** |
| *** |
| *** |
1 ++ A* ++
| ** |
| * |
| ** |
| * |
| ** |
0 ++ * ++
| ** |
| * |
| ** |
| * |
+** + + + + +
-1 A+----------------+------------------+-----------------+------------------+----------------++
-1 0 1 2 3 4
2013-10-20 13:34:03 +08:00
6 ++----------------+------------------+-----------------+------------------+----------------*A
+ + + + + ** +
| *** |
| *** |
| ** |
5 ++ *** ++
| *** |
| ** |
| *** |
| ** |
4 ++ *** ++
| *** |
| ** |
| *** |
| *** |
3 ++ ** ++
| *** |
| *** |
| ** |
| *** |
2 ++ ** ++
| *** |
| *** |
| ** |
| *** |
1 ++ *** ++
| ** |
| *** |
| ** |
| *** |
0 ++ *** ++
| ** |
| *** |
| *** |
+ ** + + + + +
-1 A*----------------+------------------+-----------------+------------------+----------------++
-1 -0.8 -0.6 -0.4 -0.2 0
2013-10-20 13:34:03 +08:00
7 ++---------------------+----------------------+----------------------+-----------------*****A
+ + + + ************ +
| *********** |
| ************ |
6 ++ A***** ++
| ** |
| * |
| ** |
| * |
5 ++ ** ++
| * |
| ** |
| * |
4 ++ ** ++
| * |
| ** |
| * |
3 ++ ** ++
| * |
| ** |
| * |
| * |
2 ++ ** ++
| * |
| ** |
| * |
1 ++ ** ++
| * |
| ** |
| * |
| ** |
0 ++ * ++
| ** |
| * |
+** + + + +
-1 A+---------------------+----------------------+----------------------+---------------------++
-1 -0.5 0 0.5 1
2013-10-20 13:34:03 +08:00
8 ++-------------+---------------+--------------+--------------+---------------+-----------***A
+ + + + + + ******** +
| ******** |
| ******** |
7 ++ ***A*** ++
| ******** |
| ******* |
| ******** |
6 ++ A*** ++
| * |
| * |
| ** |
5 ++ * ++
| * |
| * |
| * |
4 ++ * ++
| * |
| ** |
3 ++ * ++
| * |
| * |
| * |
2 ++ * ++
| * |
| ** |
| * |
1 ++ * ++
| * |
| * |
| * |
0 ++ * ++
| ** |
| * |
+* + + + + + +
-1 A+-------------+---------------+--------------+--------------+---------------+-------------++
-1 -0.5 0 0.5 1 1.5 2
2013-10-20 13:34:03 +08:00
10 ++---------+-----------+----------+-----------+----------+----------+-----------+---------++
+ + + + + + + + +
| |
| ***A
| ******** |
| ******** |
8 ++ ***A*** ++
| ******** |
| ******* |
| ***A*** |
| ******** |
| ******** |
6 ++ A*** ++
| * |
| * |
| ** |
| * |
4 ++ * ++
| * |
| * |
| * |
| * |
| ** |
2 ++ * ++
| * |
| * |
| * |
| * |
| * |
0 ++ ** ++
| * |
|* |
A |
| |
+ + + + + + + + +
-2 ++---------+-----------+----------+-----------+----------+----------+-----------+---------++
-1 -0.5 0 0.5 1 1.5 2 2.5 3
2013-10-20 13:34:03 +08:00
10 ++----------------+-----------------+------------------+-----------------+--------------***A
+ + + + + ****** +
| ****** |
| ***A** |
| ****** |
| ****** |
8 ++ ***A** ++
| ****** |
| ****** |
| ***A*** |
| ****** |
| ****** |
6 ++ A** ++
| * |
| * |
| * |
| * |
4 ++ * ++
| * |
| * |
| * |
| * |
| * |
2 ++ * ++
| * |
| * |
| * |
| * |
| * |
0 ++ * ++
| * |
|* |
A |
| |
+ + + + + +
-2 ++----------------+-----------------+------------------+-----------------+----------------++
-1 0 1 2 3 4
2013-10-20 13:34:03 +08:00
EOF
2013-10-20 14:55:47 +08:00
tryplot( testname => '--timefmt streaming plot with --xlen',
cmd => q{seq 5 | awk 'BEGIN{ print strftime("%d %b %Y %T",1382249107-1,1),-4;} {if(NR==3) {print "exit";} else{ print strftime("%d %b %Y %T",1382249107+$1,1),$1;} fflush(); system("sleep 0.6")}'},
options => ['--points', '--lines',
'--domain', '--timefmt', '%d %b %Y %H:%M:%S',
qw(--stream 0.4 --xlen 3)],
refplot => <<'EOF' );
1 ++-------------+---------------+--------------+--------------+---------------+-------------+A
+ + + + + + **+
| ** |
| ** |
| * |
| ** |
| ** |
0 ++ ** ++
| * |
| ** |
| ** |
| ** |
| * |
| ** |
-1 ++ ** ++
| ** |
| * |
| ** |
| ** |
| * |
| ** |
-2 ++ ** ++
| ** |
| * |
| ** |
| ** |
| ** |
| * |
-3 ++ ** ++
| ** |
| ** |
| * |
| ** |
| ** |
+ + +** + + + +
-4 ++-------------+---------------A--------------+--------------+---------------+-------------++
05:05 05:05 05:06 05:06 05:07 05:07 05:08
2013-10-20 14:55:47 +08:00
2 ++-------------+---------------+--------------+--------------+---------------+------------**A
+ + + + + + ***** +
| ***** |
| ****** |
| ***** |
| ***** |
1 ++ *A** ++
| ** |
| ** |
| ** |
| ** |
| ** |
0 ++ ** ++
| ** |
| ** |
| ** |
| *** |
-1 ++ ** ++
| ** |
| ** |
| ** |
| ** |
| ** |
-2 ++ ** ++
| ** |
| *** |
| ** |
| ** |
| ** |
-3 ++ ** ++
| ** |
| ** |
| ** |
| ** |
+ ** + + + + + +
-4 A*-------------+---------------+--------------+--------------+---------------+-------------++
05:06 05:06 05:07 05:07 05:08 05:08 05:09
2013-10-20 14:55:47 +08:00
EOF
tryplot( testname => '--timefmt streaming plot with --monotonic',
cmd => q{seq 10 | awk '{x=(NR-1)%5; if(x==0) {print strftime("%d %b %Y %T",1382249107-1,-4),-4;} print strftime("%d %b %Y %T",1382249107+x,1),NR; fflush(); system("sleep 0.6")}'},
options => ['--points', '--lines',
'--domain', '--timefmt', '%d %b %Y %H:%M:%S',
qw(--stream 0.4 --monotonic)],
refplot => <<'EOF' );
1 ++----------------+------------------+-----------------+------------------+----------------*A
+ + + + + ** +
| *** |
| *** |
| ** |
| *** |
| *** |
0 ++ ** ++
| *** |
| ** |
| *** |
| *** |
| ** |
| *** |
-1 ++ *** ++
| ** |
| *** |
| *** |
| ** |
| *** |
| ** |
-2 ++ *** ++
| *** |
| ** |
| *** |
| *** |
| ** |
| *** |
-3 ++ ** ++
| *** |
| *** |
| ** |
| *** |
| *** |
+ ** + + + + +
-4 A*----------------+------------------+-----------------+------------------+----------------++
05:06 05:06 05:06 05:06 05:06 05:07
2013-10-20 14:55:47 +08:00
2 ++---------------------+----------------------+----------------------+-------------------***A
+ + + + ******** +
| ******** |
| ******* |
| ******** |
| ******** |
1 ++ A*** ++
| ** |
| * |
| ** |
| ** |
| * |
0 ++ ** ++
| * |
| ** |
| ** |
| * |
-1 ++ ** ++
| * |
| ** |
| ** |
| * |
| ** |
-2 ++ * ++
| ** |
| * |
| ** |
| ** |
| * |
-3 ++ ** ++
| * |
| ** |
| ** |
| * |
+** + + + +
-4 A+---------------------+----------------------+----------------------+---------------------++
05:06 05:06 05:07 05:07 05:08
2013-10-20 14:55:47 +08:00
3 ++-------------+---------------+--------------+--------------+---------------+-----------***A
+ + + + + + ****** +
| ****** |
| ****** |
| ****** |
2 ++ ***A*** ++
| ****** |
| ****** |
| ****** |
| ****** |
1 ++ A** ++
| * |
| ** |
| * |
| * |
0 ++ * ++
| ** |
| * |
| * |
| * |
-1 ++ ** ++
| * |
| * |
| * |
| * |
-2 ++ ** ++
| * |
| * |
| * |
| ** |
-3 ++ * ++
| * |
| * |
| ** |
+* + + + + + +
-4 A+-------------+---------------+--------------+--------------+---------------+-------------++
05:06 05:06 05:07 05:07 05:08 05:08 05:09
2013-10-20 14:55:47 +08:00
4 ++----------+----------+-----------+----------+-----------+----------+-----------+--------**A
+ + + + + + + + ****** +
| ****** |
| ****** |
3 ++ **A** ++
| **** |
| ***** |
| ***** |
| **** |
2 ++ **A** ++
| ****** |
| ****** |
| ****** |
1 ++ A** ++
| * |
| * |
| * |
0 ++ * ++
| * |
| * |
| * |
| * |
-1 ++ * ++
| * |
| ** |
| * |
-2 ++ * ++
| * |
| * |
| * |
| * |
-3 ++ * ++
| * |
| * |
+* + + + + + + + +
-4 A+----------+----------+-----------+----------+-----------+----------+-----------+---------++
05:06 05:06 05:07 05:07 05:08 05:08 05:09 05:09 05:10
2013-10-20 14:55:47 +08:00
5 ++----------------+------------------+-----------------+------------------+---------------**A
+ + + + + **** +
| ***** |
| **** |
4 ++ **A** ++
| ***** |
| **** |
| ***** |
3 ++ **A** ++
| **** |
| ***** |
| **** |
2 ++ **A** ++
| ***** |
| **** |
| ***** |
1 ++ A** ++
| * |
| * |
0 ++ * ++
| * |
| * |
| * |
-1 ++ * ++
| * |
| * |
| * |
-2 ++ * ++
| * |
| * |
| * |
-3 ++ * ++
| * |
| * |
+* + + + + +
-4 A+----------------+------------------+-----------------+------------------+----------------++
05:06 05:07 05:08 05:09 05:10 05:11
2013-10-20 14:55:47 +08:00
6 ++----------------+------------------+-----------------+------------------+----------------*A
+ + + + + ** +
| *** |
| *** |
| ** |
| *** |
| *** |
4 ++ ** ++
| *** |
| ** |
| *** |
| *** |
| ** |
| *** |
2 ++ *** ++
| ** |
| *** |
| *** |
| ** |
| *** |
| ** |
0 ++ *** ++
| *** |
| ** |
| *** |
| *** |
| ** |
| *** |
-2 ++ ** ++
| *** |
| *** |
| ** |
| *** |
| *** |
+ ** + + + + +
-4 A*----------------+------------------+-----------------+------------------+----------------++
05:06 05:06 05:06 05:06 05:06 05:07
2013-10-20 14:55:47 +08:00
8 ++---------------------+----------------------+----------------------+---------------------++
+ + + + +
| |
| *******A
| **************** |
| *************** |
6 ++ A******* ++
| ** |
| * |
| ** |
| ** |
| * |
4 ++ ** ++
| * |
| ** |
| ** |
| * |
2 ++ ** ++
| * |
| ** |
| ** |
| * |
| ** |
0 ++ * ++
| ** |
| * |
| ** |
| ** |
| * |
-2 ++ ** ++
| * |
| ** |
| ** |
| * |
+** + + + +
-4 A+---------------------+----------------------+----------------------+---------------------++
05:06 05:06 05:07 05:07 05:08
2013-10-20 14:55:47 +08:00
8 ++-------------+---------------+--------------+--------------+---------------+---------*****A
+ + + + + ********** +
| ********** |
| *****A***** |
| ********** |
| ********** |
6 ++ A**** ++
| * |
| * |
| * |
| * |
| * |
4 ++ * ++
| ** |
| * |
| * |
| * |
2 ++ * ++
| * |
| * |
| * |
| * |
| * |
0 ++ * ++
| * |
| * |
| * |
| * |
| ** |
-2 ++ * ++
| * |
| * |
| * |
| * |
+* + + + + + +
-4 A+-------------+---------------+--------------+--------------+---------------+-------------++
05:06 05:06 05:07 05:07 05:08 05:08 05:09
2013-10-20 14:55:47 +08:00
10 ++---------+-----------+----------+-----------+----------+----------+-----------+---------++
+ + + + + + + + +
| ***A
| ******** |
| ******** |
8 ++ *****A*** ++
| *********** |
| ***A***** |
| ******** |
| ******** |
6 ++ A*** ++
| * |
| * |
| * |
| * |
4 ++ * ++
| * |
| * |
| * |
| * |
2 ++ * ++
| * |
| * |
| * |
| * |
0 ++ * ++
| * |
| * |
| * |
| * |
-2 ++ * ++
| * |
| * |
| * |
+* + + + + + + + +
-4 A+---------+-----------+----------+-----------+----------+----------+-----------+---------++
05:06 05:06 05:07 05:07 05:08 05:08 05:09 05:09 05:10
2013-10-20 14:55:47 +08:00
10 ++----------------+-----------------+------------------+-----------------+-------------****A
+ + + + + ********* +
| ***A**** |
| ****** |
| ****** |
8 ++ ****A** ++
| ********** |
| ***A**** |
| ****** |
| ****** |
6 ++ A** ++
| * |
| * |
| * |
| * |
4 ++ * ++
| * |
| * |
| * |
| * |
2 ++ * ++
| * |
| * |
| * |
| * |
0 ++ * ++
| * |
| * |
| * |
| * |
-2 ++ * ++
| * |
| * |
|* |
+* + + + + +
-4 A+----------------+-----------------+------------------+-----------------+----------------++
05:06 05:07 05:08 05:09 05:10 05:11
2013-10-20 14:55:47 +08:00
EOF
2013-10-20 13:34:03 +08:00
sub tryplot
{
2013-10-19 16:01:59 +08:00
my %args = @_;
2013-10-19 16:01:59 +08:00
my @options = ('--exit',
'--extracmds', 'unset grid',
'--terminal', 'dumb 100,40');
2013-10-19 16:01:59 +08:00
unshift @options, @{$args{options}};
my $feedgnuplot = dirname($0) . "/../bin/feedgnuplot";
my $out = '';
my $err = '';
open IN, '-|', $args{cmd} or die "Couldn't open pipe to $args{cmd}";
run [$feedgnuplot, @options],
\*IN, \$out, \$err;
note( "Running test '$args{testname}'. Running: $args{cmd} | $feedgnuplot " .
shell_quote(@options));
is($err, '', "$args{testname} stderr" );
is($out, $args{refplot}, "$args{testname} stdout");
}