feedgnuplot/t/plots.t
Dima Kogan cc0b41e270 Some tests aren't 100% reliable, and are no longer included in automated testing
These are:

- Histogram and circle-plotting tests: these have inconsistent round-off
  behavior on different arches; specifically 32-bit and 64-bit x86. So both
  plots look fine, but not identical, thus the tests fail

- Streaming tests. These tests have a temporal component, so the loading of
  the host machine can cause a test failure. It's fine pretty much all the
  time on my not-too-new laptop, but this is bad for automated testing

The RUN_ALL_TESTS environment variable can be set to turn all ALL tests
2013-12-02 21:26:32 -08:00

2196 lines
176 KiB
Perl
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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. Currently the
# reference plots come from gnuplot 4.6.4, and I make sure this is the version
# we're testing with
#
# Note that some tests are only executed when the RUN_ALL_TESTS environment
# variable is set.
# 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);
}
open(my $pipe, 'gnuplot --version |');
if( !$pipe )
{
print("1..0 # Skip: gnuplot not installed. Tests require ver. 4.6.4; feedgnuplot works with any.\n");
exit(0);
}
my $gnuplotVersion = <$pipe>;
chomp $gnuplotVersion;
if ($gnuplotVersion ne "gnuplot 4.6 patchlevel 4")
{
print("1..0 # Skip: tests require gnuplot 4.6.4. Instead I detected '$gnuplotVersion'.\n");
exit(0);
}
}
use Test::More tests => 52;
use File::Temp 'tempfile';
use IPC::Run 'run';
use String::ShellQuote;
use File::Basename;
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
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
Wrote output to |cat
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****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
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 => '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
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
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
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
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
SKIP:
{
# Some tests aren't 100% reliable, so I do not include them in automated testing. These are
#
# - Histogram and circle-plotting tests: these have inconsistent round-off
# behavior on different arches; specifically 32-bit and 64-bit x86. So both
# plots look fine, but not identical, thus the tests fail
#
# - Streaming tests. These tests have a temporal component, so the loading of
# the host machine can cause a test failure. It's fine pretty much all the
# time on my not-too-new laptop, but this is bad for automated testing
skip "Skipping unreliable tests. Set RUN_ALL_TESTS environment variable to run them all", 18 unless $ENV{RUN_ALL_TESTS};
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
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
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
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',
cmd => q{seq 500 | awk 'BEGIN{ print 0; } {print (NR==3)? "exit" : $0; fflush(); system("sleep 1.2");}'},
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
2 ++---------------------+---------------------+----------------------+--------------------*A
+ + + + ** +
| *** |
| *** |
| ** |
| *** |
| *** |
| ** |
| *** |
1.5 ++ *** ++
| ** |
| *** |
| *** |
| ** |
| *** |
| *** |
| ** |
1 ++ *A* ++
| ** |
| *** |
| ** |
| *** |
| ** |
| *** |
| ** |
| *** |
0.5 ++ ** ++
| *** |
| ** |
| *** |
| ** |
| *** |
| ** |
| *** |
+ ** + + + +
0 A*---------------------+---------------------+----------------------+--------------------++
1 1.5 2 2.5 3
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
2 ++---------------------+---------------------+----------------------+--------------------*A
+ + + + ** +
| *** |
| *** |
| ** |
| *** |
| *** |
| ** |
| *** |
1.5 ++ *** ++
| ** |
| *** |
| *** |
| ** |
| *** |
| *** |
| ** |
1 ++ *A* ++
| ** |
| *** |
| ** |
| *** |
| ** |
| *** |
| ** |
| *** |
0.5 ++ ** ++
| *** |
| ** |
| *** |
| ** |
| *** |
| ** |
| *** |
+ ** + + + +
0 A*---------------------+---------------------+----------------------+--------------------++
1 1.5 2 2.5 3
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
2 ++------+----------------+---------------+---------------+----------------+--------------*A
| + + + + + ** +
| ** |
| *** |
| ** |
| ** |
| *** |
1.8 ++ ** ++
| ** |
| *** |
| ** |
| ** |
| *** |
| ** |
1.6 ++ ** ++
| *** |
| ** |
| *** |
| ** |
| ** |
| *** |
1.4 ++ ** ++
| ** |
| *** |
| ** |
| ** |
| *** |
| ** |
1.2 ++ ** ++
| *** |
| ** |
| ** |
| *** |
| ** |
| + ** + + + + +
1 ++------A*---------------+---------------+---------------+----------------+--------------++
2 2.2 2.4 2.6 2.8 3
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
2 ++---------------------+---------------------+----------------------+--------------------*A
+ + + + **** +
| **** |
| **** |
| *** |
| **** |
1.5 ++ **** ++
| **** |
| *** |
| **** |
| **** |
| **** |
1 ++ A* ++
| ** |
| ** |
| ** |
| ** |
0.5 ++ ** ++
| ** |
| ** |
| ** |
| ** |
| ** |
0 ++ ** ++
| ** |
| ** |
| ** |
| ** |
| ** |
-0.5 ++ ** ++
| ** |
| ** |
| ** |
| ** |
+** + + + +
-1 A+---------------------+---------------------+----------------------+--------------------++
-1 -0.5 0 0.5 1
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
4 ++----------+----------+-----------+----------+-----------+----------+-----------+---------*A
+ + + + + + + + *** +
| **** |
| *** |
| *** |
| **** |
| *** |
3 ++ *A* ++
| *** |
| **** |
| *** |
| *** |
| **** |
| *** |
2 ++ *A* ++
| *** |
| **** |
| *** |
| *** |
| **** |
| *** |
1 ++ A* ++
| ** |
| ** |
| * |
| ** |
| ** |
| * |
0 ++ ** ++
| * |
| ** |
| ** |
| * |
| ** |
+** + + + + + + + +
-1 A+----------+----------+-----------+----------+-----------+----------+-----------+---------++
-1 -0.5 0 0.5 1 1.5 2 2.5 3
5 ++----------------+------------------+-----------------+------------------+----------------*A
+ + + + + *** +
| *** |
| *** |
| *** |
| *** |
4 ++ *A* ++
| *** |
| *** |
| **** |
| *** |
| *** |
3 ++ *A* ++
| **** |
| **** |
| *** |
| **** |
2 ++ *A* ++
| *** |
| *** |
| **** |
| *** |
| *** |
1 ++ A* ++
| ** |
| * |
| ** |
| * |
| ** |
0 ++ * ++
| ** |
| * |
| ** |
| * |
+** + + + + +
-1 A+----------------+------------------+-----------------+------------------+----------------++
-1 0 1 2 3 4
6 ++----------------+------------------+-----------------+------------------+----------------*A
+ + + + + ** +
| *** |
| *** |
| ** |
5 ++ *** ++
| *** |
| ** |
| *** |
| ** |
4 ++ *** ++
| *** |
| ** |
| *** |
| *** |
3 ++ ** ++
| *** |
| *** |
| ** |
| *** |
2 ++ ** ++
| *** |
| *** |
| ** |
| *** |
1 ++ *** ++
| ** |
| *** |
| ** |
| *** |
0 ++ *** ++
| ** |
| *** |
| *** |
+ ** + + + + +
-1 A*----------------+------------------+-----------------+------------------+----------------++
-1 -0.8 -0.6 -0.4 -0.2 0
7 ++---------------------+----------------------+----------------------+-----------------*****A
+ + + + ************ +
| *********** |
| ************ |
6 ++ A***** ++
| ** |
| * |
| ** |
| * |
5 ++ ** ++
| * |
| ** |
| * |
4 ++ ** ++
| * |
| ** |
| * |
3 ++ ** ++
| * |
| ** |
| * |
| * |
2 ++ ** ++
| * |
| ** |
| * |
1 ++ ** ++
| * |
| ** |
| * |
| ** |
0 ++ * ++
| ** |
| * |
+** + + + +
-1 A+---------------------+----------------------+----------------------+---------------------++
-1 -0.5 0 0.5 1
8 ++-------------+---------------+--------------+--------------+---------------+-----------***A
+ + + + + + ******** +
| ******** |
| ******** |
7 ++ ***A*** ++
| ******** |
| ******* |
| ******** |
6 ++ A*** ++
| * |
| * |
| ** |
5 ++ * ++
| * |
| * |
| * |
4 ++ * ++
| * |
| ** |
3 ++ * ++
| * |
| * |
| * |
2 ++ * ++
| * |
| ** |
| * |
1 ++ * ++
| * |
| * |
| * |
0 ++ * ++
| ** |
| * |
+* + + + + + +
-1 A+-------------+---------------+--------------+--------------+---------------+-------------++
-1 -0.5 0 0.5 1 1.5 2
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
10 ++----------------+-----------------+------------------+-----------------+--------------***A
+ + + + + ****** +
| ****** |
| ***A** |
| ****** |
| ****** |
8 ++ ***A** ++
| ****** |
| ****** |
| ***A*** |
| ****** |
| ****** |
6 ++ A** ++
| * |
| * |
| * |
| * |
4 ++ * ++
| * |
| * |
| * |
| * |
| * |
2 ++ * ++
| * |
| * |
| * |
| * |
| * |
0 ++ * ++
| * |
|* |
A |
| |
+ + + + + +
-2 ++----------------+-----------------+------------------+-----------------+----------------++
-1 0 1 2 3 4
EOF
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
2 ++-------------+---------------+--------------+--------------+---------------+------------**A
+ + + + + + ***** +
| ***** |
| ****** |
| ***** |
| ***** |
1 ++ *A** ++
| ** |
| ** |
| ** |
| ** |
| ** |
0 ++ ** ++
| ** |
| ** |
| ** |
| *** |
-1 ++ ** ++
| ** |
| ** |
| ** |
| ** |
| ** |
-2 ++ ** ++
| ** |
| *** |
| ** |
| ** |
| ** |
-3 ++ ** ++
| ** |
| ** |
| ** |
| ** |
+ ** + + + + + +
-4 A*-------------+---------------+--------------+--------------+---------------+-------------++
05:06 05:06 05:07 05:07 05:08 05:08 05:09
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:06
2 ++---------------------+----------------------+----------------------+-------------------***A
+ + + + ******** +
| ******** |
| ******* |
| ******** |
| ******** |
1 ++ A*** ++
| ** |
| * |
| ** |
| ** |
| * |
0 ++ ** ++
| * |
| ** |
| ** |
| * |
-1 ++ ** ++
| * |
| ** |
| ** |
| * |
| ** |
-2 ++ * ++
| ** |
| * |
| ** |
| ** |
| * |
-3 ++ ** ++
| * |
| ** |
| ** |
| * |
+** + + + +
-4 A+---------------------+----------------------+----------------------+---------------------++
05:06 05:06 05:07 05:07 05:08
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
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
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
6 ++----------------+------------------+-----------------+------------------+----------------*A
+ + + + + ** +
| *** |
| *** |
| ** |
| *** |
| *** |
4 ++ ** ++
| *** |
| ** |
| *** |
| *** |
| ** |
| *** |
2 ++ *** ++
| ** |
| *** |
| *** |
| ** |
| *** |
| ** |
0 ++ *** ++
| *** |
| ** |
| *** |
| *** |
| ** |
| *** |
-2 ++ ** ++
| *** |
| *** |
| ** |
| *** |
| *** |
+ ** + + + + +
-4 A*----------------+------------------+-----------------+------------------+----------------++
05:06 05:06 05:06 05:06 05:06 05:06
8 ++---------------------+----------------------+----------------------+---------------------++
+ + + + +
| |
| *******A
| **************** |
| *************** |
6 ++ A******* ++
| ** |
| * |
| ** |
| ** |
| * |
4 ++ ** ++
| * |
| ** |
| ** |
| * |
2 ++ ** ++
| * |
| ** |
| ** |
| * |
| ** |
0 ++ * ++
| ** |
| * |
| ** |
| ** |
| * |
-2 ++ ** ++
| * |
| ** |
| ** |
| * |
+** + + + +
-4 A+---------------------+----------------------+----------------------+---------------------++
05:06 05:06 05:07 05:07 05:08
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
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
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
EOF
}
sub tryplot
{
my %args = @_;
my @options = ('--exit',
'--extracmds', 'unset grid',
'--terminal', 'dumb 100,40');
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");
}