Notcurses-Native.git | xt/ | 06-direct.rakutest


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;