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 utf8;

use Test::More;

use Tickit::Test;

use Tickit::Widget::MenuBar;
use Tickit::Widget::Menu;

my ( $term, $win ) = mk_term_and_window;

my $activated;

my $menubar = Tickit::Widget::MenuBar->new(
   items => [
      Tickit::Widget::Menu->new( name => "File",
         items => [
            Tickit::Widget::Menu::Item->new( name => "File 1", on_activate => sub { $activated = "F1" } ),
            Tickit::Widget::Menu::Item->new( name => "File 2", on_activate => sub { $activated = "F2" } ),
         ],
      ),
      Tickit::Widget::Menu->new( name => "Edit",
         items => [
            Tickit::Widget::Menu::Item->new( name => "Edit 1", on_activate => sub { $activated = "E1" } ),
         ],
      ),
   ]
);

$menubar->set_window( $win );
flush_tickit;

# Start/end of every test should have the display in initial state
my @INITIAL = ( [TEXT("File  Edit",rv=>1)] );
is_display( \@INITIAL,
            'Display initially' );

{
   pressmouse( press => 1, 0, 3 );
   flush_tickit;

   is_display( [ [TEXT("File",rv=>0,bg=>2), TEXT("  Edit",rv=>1)],
                 [TEXT("┌────────┐",rv=>1)],
                 [TEXT("│ File 1 │",rv=>1)],
                 [TEXT("│ File 2 │",rv=>1)],
                 [TEXT("└────────┘",rv=>1)] ],
               'Display after mouse press on File' );

   pressmouse( drag => 1, 0, 9 );
   flush_tickit;

   is_display( [ [TEXT("File  ",rv=>1), TEXT("Edit",rv=>0,bg=>2)],
                 [BLANK(6), TEXT("┌────────┐",rv=>1)],
                 [BLANK(6), TEXT("│ Edit 1 │",rv=>1)],
                 [BLANK(6), TEXT("└────────┘",rv=>1)] ],
               'Display after mouse drag to Edit' );

   pressmouse( drag => 1, 2, 9 );
   flush_tickit;

   is_display( [ [TEXT("File  ",rv=>1), TEXT("Edit",rv=>0,bg=>2)],
                 [BLANK(6), TEXT("┌────────┐",rv=>1)],
                 [BLANK(6), TEXT("│ ",rv=>1), TEXT("Edit 1",rv=>0,bg=>2), TEXT(" │",rv=>1)],
                 [BLANK(6), TEXT("└────────┘",rv=>1)] ],
               'Display after mouse drag to Edit 1' );

   pressmouse( release => 1, 2, 9 );
   flush_tickit;

   is( $activated, "E1", '$activated is E1 after mouse release on Edit 1' );

   is_display( \@INITIAL,
               'Display after mouse release on Edit 1' );
}

# Click to dismiss should restore display to quiescent state
{
   pressmouse( press => 1, 0, 3 );
   flush_tickit;

   is_display( [ [TEXT("File",rv=>0,bg=>2), TEXT("  Edit",rv=>1)],
                 [TEXT("┌────────┐",rv=>1)],
                 [TEXT("│ File 1 │",rv=>1)],
                 [TEXT("│ File 2 │",rv=>1)],
                 [TEXT("└────────┘",rv=>1)] ],
               'Display after mouse press on File' );

   pressmouse( press => 1, 0, 3 );
   flush_tickit;

   is_display( \@INITIAL,
               'Display after second press dismisses menu' );
}

done_testing;