Selkie.git | t/ | 55-line-chart.rakutest
use Test;
use lib 'lib';
use Selkie::Widget::LineChart;
plan 10;
subtest "construction with single series" => {
plan 4;
my $c = Selkie::Widget::LineChart.new(
series => [{ label => 's1', values => [1, 2, 3, 4, 5] }],
);
isa-ok $c, Selkie::Widget::LineChart;
is $c.series.elems, 1, "one series stored";
ok $c.show-axis, "show-axis defaults True";
ok $c.show-legend, "show-legend defaults True";
};
subtest "fill-below defaults to False" => {
plan 1;
my $c = Selkie::Widget::LineChart.new(series => []);
nok $c.fill-below, "fill-below defaults False";
};
subtest "fill-below configurable" => {
plan 1;
my $c = Selkie::Widget::LineChart.new(
series => [{ label => 's', values => [1, 2] }],
fill-below => True,
);
ok $c.fill-below, "fill-below set";
};
subtest "explicit y bounds stored" => {
plan 2;
my $c = Selkie::Widget::LineChart.new(
series => [],
y-min => -10,
y-max => 100,
);
is $c.y-min, -10, "y-min stored";
is $c.y-max, 100, "y-max stored";
};
subtest "set-series replaces and dirties" => {
plan 2;
my $c = Selkie::Widget::LineChart.new(
series => [{ label => 'a', values => [1, 2] }],
);
$c.clear-dirty;
$c.set-series([
{ label => 'b', values => [10, 20, 30] },
{ label => 'c', values => [5, 15, 25] },
]);
is $c.series.elems, 2, "two series";
ok $c.is-dirty, "marked dirty";
};
subtest "rejects series + store-path-fn combo" => {
plan 1;
dies-ok {
Selkie::Widget::LineChart.new(
series => [{ label => 's', values => [1] }],
store-path-fn => -> $s { [] },
);
}, "mutually exclusive";
};
subtest "rejects unknown overlap" => {
plan 1;
dies-ok {
Selkie::Widget::LineChart.new(series => [], overlap => 'blend');
}, "unknown overlap rejected";
};
subtest "set-series dies in store-path-fn mode" => {
plan 1;
my $c = Selkie::Widget::LineChart.new(store-path-fn => -> $s { [] });
dies-ok { $c.set-series([{ label => 'a', values => [1] }]) },
"set-series invalid in store-path-fn mode";
};
subtest "non-focusable by default" => {
plan 1;
my $c = Selkie::Widget::LineChart.new(series => []);
nok $c.focusable, "linechart isn't focusable";
};
subtest "series built from a Seq of values survives repeated access" => {
plan 2;
# TUI apps re-render on every frame; if values were stored as a
# one-shot Seq they'd appear empty after the first render walk.
my $c = Selkie::Widget::LineChart.new(
series => [{
label => 'wave',
values => (^5).map: { $_ * 2 },
}],
);
is $c.series[0]<values>[2], 4, "first access sees values[2] = 4";
is $c.series[0]<values>[2], 4, "second access still sees 4";
};