package tests::UISelectWidgetTest;

use strict;

use base qw/ Lire::Test::TestCase /;

use Lire::Config::TypeSpec;
use Lire::UI::Widget;
use Lire::Test::CursesUIDriver;
use Curses::UI;

sub set_up {
    my $self = $_[0];
    $self->SUPER::set_up();

    $self->{'driver'} = new Lire::Test::CursesUIDriver();
    $self->{'driver'}->setup_curses_ui();

    $self->{'ui'} = new Curses::UI();
    $self->{'driver'}->set_curses_ui( $self->{'ui'} );

    $self->{'window'} = $self->{'ui'}->add( 'window', 'Window' );

    my $spec = new Lire::Config::ConfigSpec( 'name' => 'lire' );
    my $select = new Lire::Config::SelectSpec( 'name' => 'test' );
    $spec->add( $select );
    foreach my $name ( qw/one two wawa/ ) {
        $select->add( new Lire::Config::OptionSpec( 'name' => $name ) );
    }
    $self->{'select_value'} =
      $spec->get( 'test' )->instance( 'value' => 'two' );
    $self->{'select_undef'} = $spec->get( 'test' )->instance();
    $self->{'spec'} = $spec;

    $self->{'empty_select'} =
        new Lire::Config::SelectSpec( 'name' => 'empty_select' );
    $spec->add( $self->{'empty_select'} );
    return;
}


sub tear_down {
    my $self = $_[0];
    $self->SUPER::tear_down();

    $self->{'driver'}->teardown_curses_ui();

    return;
}

sub test_new {
    my $self = $_[0];

    my $win = $self->{'window'};
    $self->assert_dies( qr/missing \'value\' parameter/,
                        sub { my $widget = $win->add( 'test_widget',
                                                      'Lire::UI::SelectWidget' ) } );
    $self->assert_dies( qr/\'value\' parameter should be a \'Lire::Config::Scalar\' instance, not \'HASH/,
                      sub { my $widget = $win->add( 'test_widget',
                                                    'Lire::UI::SelectWidget',
                                                    'Value' => {} ) } );

    my $widget = $win->add( 'test_widget', 'Lire::UI::SelectWidget',
                            'value' => $self->{'select_value'} );
    $self->assert_isa( 'Lire::UI::SelectWidget', $widget );

    $self->assert_deep_equals( [ 'one', 'two', 'wawa' ],
                               $widget->{'-values'} );
    $self->assert_num_equals( 1, $widget->{'-selected'} );
    $self->assert_str_equals( \&Lire::UI::SelectWidget::_on_change_cb,
                              $widget->{'-onchange'} );
    $self->assert_str_equals( 'two', $widget->get() );

    $widget = $win->add( 'undef_widget', 'Lire::UI::SelectWidget',
                         'value' => $self->{'select_undef'} );
    $self->assert_null( $widget->{'-selected'}, '-selected should be undef' );

    $widget = $win->add( 'empty_widget', 'Lire::UI::SelectWidget',
                         'value' => $self->{'empty_select'}->instance() );
    $self->assert_deep_equals( [ '-- empty list --' ], $widget->{'-values'} );
    $self->assert_num_equals( 0, $widget->{'-selected'} );
    $self->assert_num_equals( 0, $widget->{'-focusable'} );

    return;
}

sub test_on_change_cb {
    my $self = $_[0];

    my $called = 'onvaluechanged not called';
    my $win = $self->{'window'};
    my $widget = $win->add( 'test_widget', 'Lire::UI::SelectWidget',
                            'value' => $self->{'select_value'},
                            'onvaluechanged' => sub { $called = 'called' } );

    $self->assert_str_equals( 'two', $widget->get() );
    $widget->{'-selected'} = 2;
    Lire::UI::SelectWidget::_on_change_cb( $widget );
    $self->assert_str_equals( 'wawa', $self->{'select_value'}->get() );
    $self->assert_str_equals( 'called', $called );

    return;
}

1;


syntax highlighted by Code2HTML, v. 0.9.1