package tests::UIPolyListWidgetTest;

use strict;

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

use Lire::Config::TypeSpec;
use Lire::Test::CursesUIDriver;
use Lire::UI::PolyListWidget;
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::ListSpec( 'name' => 'poly' );
    $spec->add( new Lire::Config::StringSpec( 'name' => 'string',
                                              'summary' => 'String' ) );
    $spec->add( new Lire::Config::BooleanSpec( 'name' => 'boolean',
                                               'summary' => 'Bool' ) );
    $self->{'poly_value'} = $spec->instance();

    return;
}

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

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

    return;
}

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

    my $value = $self->{'poly_value'};
    my $widget = $self->{'window'}->add( 'list_widget', 'Lire::UI::ListWidget',
                                         'value' => $value );
    $self->assert_isa( 'Lire::UI::PolyListWidget', $widget );

    my $popup = $widget->getobj( 'type_widget' );
    $self->assert_isa( 'Curses::UI::Popupmenu', $popup );

    $self->assert_deep_equals( [ $value->spec()->get( 'boolean' ),
                                 $value->spec()->get( 'string' ) ],
                               $popup->{'-values'} );

    $self->assert_deep_equals( { $value->spec()->get( 'boolean' ) => 'Bool',
                                 $value->spec()->get( 'string' ) => 'String' },
                               $popup->{'-labels'} );
}

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

    my $widget = $self->{'window'}->add( 'list_widget', 'Lire::UI::ListWidget',
                                         'value' => $self->{'poly_value'} );
    my $popup = $widget->getobj( 'type_widget' );

    $self->assert_null( $widget->new_value(), 'new_value() != undef' );

    $popup->{'-selected'} = 0;
    my $value = $widget->new_value();
    $self->assert_isa( 'Lire::Config::Scalar', $value );
    $self->assert_str_equals( $self->{'poly_value'}->spec()->get( 'boolean' ),
                              $value->spec() );

    $popup->{'-selected'} = 1;
    $value = $widget->new_value();
    $self->assert_str_equals( $self->{'poly_value'}->spec()->get( 'string' ),
                              $value->spec() );
}

1;


syntax highlighted by Code2HTML, v. 0.9.1