Notcurses-Native.git | xt/ | 06-direct.rakutest edit
use Test;
use lib 'lib';
use lib 't/lib';
use TestHelper;
use NativeCall;
use Notcurses::Native;
use Notcurses::Native::Types;
use Notcurses::Native::Direct;
plan 7;
# Single context for all tests — avoids multiple init/stop terminal resets
my $ncd = do { my ($n, $) = test-init-direct(); $n };
unless $ncd.defined {
skip 'No direct mode', 7;
exit 0;
}
subtest 'Direct mode init' => {
plan 1;
ok $ncd.defined, 'ncdirect_core_init succeeded';
};
subtest 'Direct mode dimensions' => {
plan 2;
my $rows = ncdirect_dim_y($ncd);
my $cols = ncdirect_dim_x($ncd);
ok $rows > 0, "Rows > 0 (got $rows)";
ok $cols > 0, "Cols > 0 (got $cols)";
};
subtest 'Direct mode capabilities' => {
plan 6;
ok ncdirect_canutf8($ncd).defined, "canutf8 defined";
ok ncdirect_cantruecolor($ncd).defined, "cantruecolor defined";
ok ncdirect_canhalfblock($ncd).defined, "canhalfblock defined";
ok ncdirect_canbraille($ncd).defined, "canbraille defined";
ok ncdirect_detected_terminal($ncd).defined, "terminal detected";
ok ncdirect_palette_size($ncd) > 0, "palette size > 0";
};
subtest 'Direct mode colors' => {
plan 4;
is ncdirect_set_fg_rgb($ncd, 0xFF0000), 0, 'Set FG red';
is ncdirect_set_bg_rgb($ncd, 0x0000FF), 0, 'Set BG blue';
is ncdirect_set_fg_rgb8($ncd, 0, 255, 0), 0, 'Set FG green via rgb8';
is ncdirect_set_fg_default($ncd), 0, 'Reset FG to default';
};
subtest 'Direct mode styles' => {
plan 4;
ok ncdirect_supported_styles($ncd).defined, "Supported styles defined";
is ncdirect_on_styles($ncd, NCSTYLE_BOLD), 0, 'Bold on';
ok ncdirect_styles($ncd) +& NCSTYLE_BOLD, 'Bold is set';
is ncdirect_off_styles($ncd, NCSTYLE_BOLD), 0, 'Bold off';
};
subtest 'Direct mode cursor' => {
plan 3;
is ncdirect_cursor_move_yx($ncd, 0, 0), 0, 'Move cursor to (0,0)';
is ncdirect_cursor_down($ncd, 1), 0, 'Cursor down 1';
is ncdirect_cursor_right($ncd, 5), 0, 'Cursor right 5';
};
subtest 'Direct mode output' => {
plan 2;
# ncdirect_putstr returns the underlying fputs() return value.
# POSIX only requires "non-negative on success, EOF (-1) on
# failure" — and the two libcs diverge:
# glibc fputs → 1 (or larger) on success
# musl fputs → 0 on success
# Both are conformant; only `>= 0` is portable. (Despite the
# name, ncdirect_putstr does NOT return columns written — that's
# ncdirect_putegc, which returns its own utf8_egc_len.)
ok ncdirect_putstr($ncd, 0, 'Hello Direct') >= 0, "putstr succeeded";
is ncdirect_flush($ncd), 0, 'Flush succeeded';
};
ncdirect_stop($ncd);
done-testing;