Selkie.git | t/ | 47-axis.rakutest
use Test;
use lib 'lib';
use Selkie::Widget::Axis;
use Selkie::Sizing;
plan 9;
subtest "construction with valid args" => {
plan 5;
my $a = Selkie::Widget::Axis.new(
edge => 'bottom', min => 0, max => 100,
);
isa-ok $a, Selkie::Widget::Axis;
is $a.edge, 'bottom', "edge stored";
is $a.min, 0, "min stored";
is $a.max, 100, "max stored";
is $a.tick-count, 5, "tick-count defaults to 5";
};
subtest "rejects invalid edge" => {
plan 1;
dies-ok { Selkie::Widget::Axis.new(edge => 'middle', min => 0, max => 1) },
"unknown edge is rejected";
};
subtest "rejects min > max" => {
plan 1;
dies-ok { Selkie::Widget::Axis.new(edge => 'bottom', min => 5, max => 1) },
"min > max is rejected";
};
subtest "reserved-rows reflects edge orientation" => {
plan 4;
my $bot = Selkie::Widget::Axis.new(edge => 'bottom', min => 0, max => 1);
my $top = Selkie::Widget::Axis.new(edge => 'top', min => 0, max => 1);
my $left = Selkie::Widget::Axis.new(edge => 'left', min => 0, max => 1);
my $right = Selkie::Widget::Axis.new(edge => 'right',min => 0, max => 1);
is $bot.reserved-rows, 2, "bottom needs 2 rows";
is $top.reserved-rows, 2, "top needs 2 rows";
is $left.reserved-rows, 0, "left doesn't reserve rows";
is $right.reserved-rows, 0, "right doesn't reserve rows";
};
subtest "reserved-cols accounts for label width" => {
plan 3;
# Range 0..100 → ticks at 0,20,40,...,100 → labels up to 3 chars → reserved 4
my $a = Selkie::Widget::Axis.new(edge => 'left', min => 0, max => 100);
is $a.reserved-cols, 4, "0..100 reserves 4 cols (label '100' + line)";
# Range 0..1 → ticks at 0,0.2,...,1.0 → labels 3 chars ('1.0') → reserved 4
my $b = Selkie::Widget::Axis.new(edge => 'left', min => 0, max => 1);
is $b.reserved-cols, 4, "0..1 reserves 4 cols";
# Negative range: '-100' is 4 chars → reserved 5
my $c = Selkie::Widget::Axis.new(edge => 'left', min => -100, max => 100);
ok $c.reserved-cols >= 5, "negative range reserves enough for '-100'";
};
subtest "horizontal axes' reserved-cols is 0" => {
plan 2;
my $bot = Selkie::Widget::Axis.new(edge => 'bottom', min => 0, max => 100);
my $top = Selkie::Widget::Axis.new(edge => 'top', min => 0, max => 100);
is $bot.reserved-cols, 0, "bottom doesn't reserve cols";
is $top.reserved-cols, 0, "top doesn't reserve cols";
};
subtest "tick-count carries through" => {
plan 1;
my $a = Selkie::Widget::Axis.new(
edge => 'bottom', min => 0, max => 100, tick-count => 11,
);
is $a.tick-count, 11, "tick-count stored";
};
subtest "show-line defaults to True and is configurable" => {
plan 2;
my $a = Selkie::Widget::Axis.new(edge => 'bottom', min => 0, max => 1);
ok $a.show-line, "show-line defaults to True";
my $b = Selkie::Widget::Axis.new(
edge => 'bottom', min => 0, max => 1, show-line => False,
);
nok $b.show-line, "show-line can be disabled";
};
subtest "non-focusable by default" => {
plan 1;
my $a = Selkie::Widget::Axis.new(edge => 'bottom', min => 0, max => 1);
nok $a.focusable, "axis isn't focusable (it's a display widget)";
};