The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl

use strict;
use warnings;

use Test::More;
use Test::Identity;

use Tickit::Test;

use Tickit::Widget::Static;
use Tickit::Widget::Frame;

my $win = mk_window;

my $static = Tickit::Widget::Static->new( text => "Widget" );

my $widget = Tickit::Widget::Frame->new(
   child => $static,
);

ok( defined $widget, 'defined $widget' );

$widget->set_window( $win );

ok( defined $static->window, '$static has window after $widget->set_window' );

flush_tickit;

is_display( [ [TEXT("+".("-"x78)."+")],
              [TEXT("|Widget".(" "x72)."|")],
              ( [TEXT("|"), BLANK(78), TEXT("|")] )  x 22,
              [TEXT("+".("-"x78)."+")] ],
            'Display initially' );

SKIP: {
   skip "No UTF-8 locale", 1 unless ${^UTF8LOCALE};

   $widget->set_style( linetype => "single" );

   flush_tickit;

   is_display( [ [TEXT("\x{250C}".("\x{2500}"x78)."\x{2510}")],
                 [TEXT("\x{2502}Widget".(" "x72)."\x{2502}")],
                 ( [TEXT("\x{2502}"), BLANK(78), TEXT("\x{2502}")] ) x 22,
                 [TEXT("\x{2514}".("\x{2500}"x78)."\x{2518}")] ],
               'Display after ->set_style(linetype)' );
}

# That linetype is hard to test against so put it back to ASCII
$widget->set_style( linetype => "ascii" );

$widget->set_title( "Title" );
flush_tickit;

is_display( [ [TEXT("+ Title ".("-"x71)."+")],
              [TEXT("|Widget".(" "x72)."|")],
              ( [TEXT("|"), BLANK(78), TEXT("|")] )  x 22,
              [TEXT("+".("-"x78)."+")] ],
            'Display with title' );

$widget->set_title_align( "right" );
flush_tickit;

is_display( [ [TEXT("+".("-"x71)." Title +")],
              [TEXT("|Widget".(" "x72)."|")],
              ( [TEXT("|"), BLANK(78), TEXT("|")] )  x 22,
              [TEXT("+".("-"x78)."+")] ],
            'Display with right-aligned title' );

$widget->set_style( frame_fg => "red" );
flush_tickit;

is_display( [ [TEXT("+".("-"x71)." Title +",fg=>1)],
              [TEXT("|",fg=>1), TEXT("Widget".(" "x72)), TEXT("|",fg=>1)],
              ( [TEXT("|",fg=>1), BLANK(78), TEXT("|",fg=>1)] ) x 22,
              [TEXT("+".("-"x78)."+",fg=>1)] ],
            'Display with correct pen' );

$static->set_text( "New text" );
flush_tickit;

is_display( [ [TEXT("+".("-"x71)." Title +",fg=>1)],
              [TEXT("|",fg=>1), TEXT("New text".(" "x70)), TEXT("|",fg=>1)],
              ( [TEXT("|",fg=>1), BLANK(78), TEXT("|",fg=>1)] ) x 22,
              [TEXT("+".("-"x78)."+",fg=>1)] ],
            'Display after $static->set_text' );

$widget->set_title( undef );
$widget->set_style( frame_fg => undef );

# Mixed linetypes
{
   $widget->set_style(
      linetype_top    => "double",
      linetype_bottom => "double",
      linetype_left   => "single",
      linetype_right  => "single",
   );
   flush_tickit;

   is_display( [ [TEXT("\x{2552}".("\x{2550}"x78)."\x{2555}")],
                 [TEXT("\x{2502}New text".(" "x70)."\x{2502}")],
                 ( [TEXT("\x{2502}"), BLANK(78), TEXT("\x{2502}")] ) x 22,
                 [TEXT("\x{2558}".("\x{2550}"x78)."\x{255b}")] ],
               'Display with mixed line styles' );

   $widget->set_style(
      linetype_left   => "solid_outside",
      linetype_right  => "solid_outside",
   );
   flush_tickit;

   is_display( [ [TEXT("\x{2550}"x80)],
                 [TEXT("\x{258c}New text".(" "x70)."\x{2590}")],
                 ( [TEXT("\x{258c}"), BLANK(78), TEXT("\x{2590}")] ) x 22,
                 [TEXT("\x{2550}"x80)] ],
               'Display with mixed line types' );
}

# Missing linetypes
{
   $widget->set_style(
      linetype_left  => "none",
      linetype_right => "none",
   );
   flush_tickit;

   is_display( [ [TEXT("\x{2550}"x80)],
                 [TEXT("New text".(" "x72))],
                 ( [BLANK(80)] ) x 22,
                 [TEXT("\x{2550}"x80)] ],
               'Display with left/right as none' );

   $widget->set_style(
      linetype_top    => "none",
      linetype_bottom => "none",
      linetype_left   => "single",
      linetype_right  => "single",
   );
   flush_tickit;

   is_display( [ [TEXT("\x{2502}New text".(" "x70)."\x{2502}")],
                 ( [TEXT("\x{2502}"), BLANK(78), TEXT("\x{2502}")] ) x 24 ],
               'Display with top/bottom as none' );
}

$widget->set_window( undef );

ok( !defined $static->window, '$static has no window after ->set_window undef' );

# Different linetypes to constructor
{
   my $widget = Tickit::Widget::Frame->new(
      style => {
         linetype => "none",
         linetype_left  => "single",
         linetype_right => "single",
      },
      child => $static,
   );

   $widget->set_window( $win );

   flush_tickit;

   is_display( [ [TEXT("\x{2502}"), TEXT("New text"), BLANK(70), TEXT("\x{2502}")],
                 ( [TEXT("\x{2502}"), BLANK(78), TEXT("\x{2502}")] ) x 24 ],
               'Display for $widget with individual linetypes to constructor' );

   $widget->set_window( undef );
}

done_testing;