#!/usr/bin/perl
use strict;
use warnings;
use Test::More;
use Tickit::Test 0.12;
use Tickit::Widget::Scroller;
use Tickit::Widget::Scroller::Item::Text;
# TODO: mk_window once Tickit::Test can take a size there too
my ( $term, $rootwin ) = mk_term_and_window cols => 20, lines => 8;
my $win = $rootwin->make_sub( 0, 0, 6, 20 );
$rootwin->focus( 7, 0 );
my $scroller = Tickit::Widget::Scroller->new(
gravity => "top",
);
$scroller->set_window( $win );
flush_tickit;
is_termlog( [ ( map { GOTO($_,0), SETBG(undef), ERASECH(20) } 0 .. 5 ),
GOTO(7,0) ],
'Termlog initially' );
is_display( [ ],
'Display initially' );
is_cursorpos( 7, 0, 'Cursor position intially' );
$scroller->unshift(
Tickit::Widget::Scroller::Item::Text->new( "A line of text" ),
);
flush_tickit;
is_termlog( [ GOTO(0,0),
SETPEN,
PRINT("A line of text"),
SETBG(undef),
ERASECH(6),
GOTO(7,0) ],
'Termlog after unshift' );
is_display( [ [TEXT("A line of text")] ],
'Display after unshift' );
is_cursorpos( 7, 0, 'Cursor position after unshift' );
$scroller->unshift( reverse
map { Tickit::Widget::Scroller::Item::Text->new( "Another line $_" ) } 1 .. 4,
);
flush_tickit;
is_termlog( [ SETBG(undef),
SCROLLRECT(0,0,6,20, -4,0),
GOTO(0,0),
SETPEN,
PRINT("Another line 4"),
SETBG(undef),
ERASECH(6),
GOTO(1,0),
SETPEN,
PRINT("Another line 3"),
SETBG(undef),
ERASECH(6),
GOTO(2,0),
SETPEN,
PRINT("Another line 2"),
SETBG(undef),
ERASECH(6),
GOTO(3,0),
SETPEN,
PRINT("Another line 1"),
SETBG(undef),
ERASECH(6),
GOTO(7,0) ],
'Termlog after unshift 4' );
is_display( [ [TEXT("Another line 4")],
[TEXT("Another line 3")],
[TEXT("Another line 2")],
[TEXT("Another line 1")],
[TEXT("A line of text")] ],
'Display after unshift 4' );
is_cursorpos( 7, 0, 'Cursor position after unshift 4' );
$scroller->unshift( Tickit::Widget::Scroller::Item::Text->new( "An item of text that wraps" ) );
flush_tickit;
is_termlog( [ SETBG(undef),
SCROLLRECT(0,0,6,20, -2,0),
GOTO(0,0),
SETPEN,
PRINT("An item of text that"),
GOTO(1,0),
SETPEN,
PRINT("wraps"),
SETBG(undef),
ERASECH(15),
GOTO(7,0) ],
'Termlog after unshift wrapping' );
is_display( [ [TEXT("An item of text that")],
[TEXT("wraps")],
[TEXT("Another line 4")],
[TEXT("Another line 3")],
[TEXT("Another line 2")],
[TEXT("Another line 1")] ],
'Display after unshift wrapping' );
is_cursorpos( 7, 0, 'Cursor position after unshift wrapping' );
$scroller->unshift( reverse
map { Tickit::Widget::Scroller::Item::Text->new( "Another line $_" ) } 5 .. 10,
);
flush_tickit;
drain_termlog;
is_display( [ [TEXT("Another line 10")],
[TEXT("Another line 9")],
[TEXT("Another line 8")],
[TEXT("Another line 7")],
[TEXT("Another line 6")],
[TEXT("Another line 5")], ],
'Display after unshift 6' );
is_cursorpos( 7, 0, 'Cursor position after unshift 6' );
$scroller->set_window( undef );
$scroller->unshift( Tickit::Widget::Scroller::Item::Text->new( "A line while offscreen" ) );
$scroller->set_window( $win );
flush_tickit;
drain_termlog;
is_display( [ [TEXT("Another line 10")],
[TEXT("Another line 9")],
[TEXT("Another line 8")],
[TEXT("Another line 7")],
[TEXT("Another line 6")],
[TEXT("Another line 5")], ],
'Display after unshift while offscreen' );
is_cursorpos( 7, 0, 'Cursor position after unshift while offscreen' );
$scroller->scroll_to_bottom;
flush_tickit;
drain_termlog;
is_display( [ [TEXT("wraps")],
[TEXT("Another line 4")],
[TEXT("Another line 3")],
[TEXT("Another line 2")],
[TEXT("Another line 1")],
[TEXT("A line of text")] ],
'Display after scroll_to_bottom' );
is_cursorpos( 7, 0, 'Cursor position after scroll_to_bottom' );
$scroller->unshift(
Tickit::Widget::Scroller::Item::Text->new( "Unseen line" ),
);
is_termlog( [],
'Termlog empty after unshift at tail' );
is_display( [ [TEXT("wraps")],
[TEXT("Another line 4")],
[TEXT("Another line 3")],
[TEXT("Another line 2")],
[TEXT("Another line 1")],
[TEXT("A line of text")] ],
'Display after unshift at tail' );
is_cursorpos( 7, 0, 'Cursor position after unshift at tail' );
done_testing;