package tests::UIXMLSpecListWidgetTest;

use strict;

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

use Lire::Config::TypeSpec;
use Lire::Test::CursesUIDriver;
use Lire::UI::XMLSpecListWidget;
use Curses::UI;
use Lire::Config::Index;
use Lire::UI;
use Lire::Test::Mock;

sub new {
    my $self = shift->SUPER::new( @_ );

    $self->init();

    return $self;
}

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

    $self->set_up_test_schema();
    $self->{'cfg'}{'lr_reports_path'} = [ "$self->{'testdir'}/reports" ];
    $self->{'cfg'}{'lr_filters_path'} = [ "$self->{'testdir'}/filters" ];

    $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' );

    $self->{'reports'} =
      new Lire::Config::XMLSpecListSpec( 'name' => 'reports',
                                         'type' => 'reports' )->instance();

    return;
}

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

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

    return;
}

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


    $self->assert_dies( qr/\'value\' parameter\'s spec should be a \'Lire::Config::XMLSpecListSpec\' instance, not \'Lire::Config::ListSpec/,
                        sub { $self->{'window'}->add( 'widget',
                                                      'Lire::UI::XMLSpecListWidget',
                                                      'Value' => new Lire::Config::ListSpec( 'name' => 'list' )->instance() ) } );
    my $widget = $self->{'window'}->add( 'widget', 'Lire::UI::Widget',
                                         'value' => $self->{'reports'},
                                         'superservice' => 'test'
                                       );
    $self->assert_isa( 'Lire::UI::XMLSpecListWidget', $widget );
    $self->assert_str_equals( 'test', $widget->{'superservice'} );
    $self->assert_str_equals( \&Lire::UI::XMLSpecListWidget::edit_element,
                              $widget->{'-routines'}{'edit-element'} );
}

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

    my $widget = $self->{'window'}->add( 'widget',
                                         'Lire::UI::XMLSpecListWidget',
                                         'value' => $self->{'reports'} );
    $self->assert_isa( 'Lire::UI::XMLSpecListWidget', $widget );
    $self->assert_null( $widget->superservice_filter() );
    $self->assert_null( $widget->{'superservice'} );

    my $type_popup = $widget->getobj( 'type_widget' );
    $self->assert_deep_equals( [], $type_popup->{'-values'} );
    $self->assert_deep_equals( {}, $type_popup->{'-labels'} );

    $self->assert_str_equals( 'test', $widget->superservice_filter( 'test' ) );
    $self->assert_str_equals( 'test', $widget->{'superservice'} );
    $self->assert_deep_equals( [ qw/avg-file_size-by-timeslot downloads-by-period sessions-by-length sessions-by-user_class top-dirs top-dirs2 top-files user-downloads-utf8 user_downloads-report / ],
                               $type_popup->{'-values'} );
    $self->assert_deep_equals( {}, $type_popup->{'-labels'} );
}

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

    my $widget = $self->{'window'}->add( 'list_widget',
                                         'Lire::UI::XMLSpecListWidget',
                                         'value' => $self->{'reports'},
                                         'superservice' => 'test' );
    my $popup = $widget->getobj( 'type_widget' );
    $self->assert_null( $widget->new_value(), 'new_value() != undef' );

    $popup->{'-selected'} = 1;
    my $value = $widget->new_value();
    $self->assert_isa( 'Lire::Config::Object', $value );
    $self->assert_str_equals( 'test:downloads-by-period', $value->name() );
}

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

    $self->{'reports'}->append( $self->{'reports'}->spec()->get( 'test:top-dirs' )->instance() );
    my $widget = $self->{'window'}->add( 'list_widget',
                                         'Lire::UI::XMLSpecListWidget',
                                         'value' => $self->{'reports'},
                                         'superservice' => 'test' );
    my $mock_ui = new Lire::Test::Mock( 'Lire::UI',
                                        'edit_value_dialog' => sub {
                                            $self->assert( Lire::Config::Index->has_index( 'variables' ) ? 1 : 0,
                                                           'missing "variables" index' ) } );
    $widget->root()->userdata( $mock_ui );
    my $list = $widget->getobj( 'list' );
    $list->{'-focusable'} = 0;
    $widget->do_routine( 'edit-element' ); 
    $self->assert_num_equals( 0, $mock_ui->invocation_count( 'edit_value_dialog' ) );

    $list->{'-focusable'} = 1;
    $list->{'-selected'} = 0;
    $widget->do_routine( 'edit-element' );
    $self->assert( !Lire::Config::Index->has_index( 'variables' ) ? 1 : 0,
                   '"variables" index should be removed' );
    $self->assert_num_equals( 1, $mock_ui->invocation_count( 'edit_value_dialog' ) );
}


1;


syntax highlighted by Code2HTML, v. 0.9.1