package tests::ReportParserTest;

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

use IO::Scalar;

use Lire::ReportParser;
use Lire::Report::TableInfo;
use Lire::Test::Mock;

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

    return;
}

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

    return;
}

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

    my $parser = new Lire::ReportParser();
    my $info = new Lire::Report::TableInfo();
    $parser->init_stack( 'lrp_group-info' );
    $parser->stack_push( 'lrp_group-info', $info );

    my $attr = {
                'name' => 'file',
                'class' => 'categorical',
                'type' => 'string',
                'label' => 'A File',
                'col-start' => 1,
                'col-end' => 1,
                'col-width' => 20,
                'max-chars' => 20,
                'avg-chars' => 8,
                };
    $parser->column_info_start( 'lire:column-info', $attr );

    my $col_info = $info->column_info_by_name( 'file' );
    $self->assert_not_null( $col_info,
                            "no ColumnInfo named 'file' created" );
    $self->assert_equals( "categorical", $col_info->class() );
    $self->assert_equals( "string", $col_info->type() );
    $self->assert_equals( "A File", $col_info->label() );
    $self->assert_equals( 1, $col_info->col_start() );
    $self->assert_equals( 1, $col_info->col_end() );
    $self->assert_equals( 20, $col_info->col_width() );
    $self->assert_equals( 20, $col_info->max_chars() );
    $self->assert_equals( 8, $col_info->avg_chars() );
}

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

    my $parser = new_proxy Lire::Test::Mock( 'Lire::ReportParser' );
    my $now = time;
    $self->assert_null( $parser->{'lrp_curr_timespan'} );
    my $infos = { 'timespan' => '',
                  'period' => 'daily',
                  'start' => $now,
                  'end' => $now + 86400 };
    $parser->timespan_start( 'lire:timespan', { 'period' => $infos->{'period'},
                                                'start' => $infos->{'start'},
                                                'end' => $infos->{'end'}  } );
    $self->assert_deep_equals( $infos, $parser->{'lrp_curr_timespan'} );
    $self->assert_deep_equals( $infos, $parser->current_timespan() );
    $parser->timespan_char( 'My ' );
    $self->assert_str_equals( 'My ',
                              $parser->{'lrp_curr_timespan'}{'timespan'} );
    $parser->timespan_char( 'timespan' );
    $self->assert_str_equals( 'My timespan',
                              $parser->{'lrp_curr_timespan'}{'timespan'} );
    $parser->timespan_end( 'lire:timespan' );
    $self->assert_deep_equals( [ $parser, 'My timespan', $now, $now + 86400,
                                 'daily' ],
                               $parser->get_invocation( 'handle_timespan' ) );
    $infos->{'timespan'} = 'My timespan';
    $self->assert_deep_equals( $infos, $parser->current_timespan() );
}

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

    my $parser = new_proxy Lire::Test::Mock( 'Lire::ReportParser' );
    my $now = time;
    $self->assert_null( $parser->{'lrp_curr_date'} );
    my $infos = { 'date' => '',
                  'time' => $now };
    $parser->date_start( 'lire:date', { 'time' => $now } );
    $self->assert_deep_equals( $infos, $parser->{'lrp_curr_date'} );
    $self->assert_deep_equals( $infos, $parser->current_date() );
    $parser->date_char( 'My ' );
    $self->assert_str_equals( 'My ', $parser->{'lrp_curr_date'}{'date'} );
    $parser->date_char( 'date' );
    $self->assert_str_equals( 'My date', $parser->{'lrp_curr_date'}{'date'} );
    $parser->date_end( 'lire:date' );
    $self->assert_deep_equals( [ $parser, 'My date', $now ],
                               $parser->get_invocation( 'handle_date' ) );
    $infos->{'date'} = 'My date';
    $self->assert_deep_equals( $infos, $parser->current_date() );
}

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

    my $parser = new_proxy Lire::Test::Mock( 'Lire::ReportParser' );
    $parser->set_result( 'error' => sub { shift; die @_ } );
    $self->assert_dies( qr/missing 'version' attribute/,
                        sub { $parser->report_start( 'lire:report' ) } );
    $self->assert_dies( qr/'version' attribute should be 2.0 or 2.1: 1.0 /,
                        sub { $parser->report_start( 'lire:report',
                                                     { 'version' => '1.0' } ) } );
    $parser->report_start( 'lire:report', { 'version' => '2.1' } );
    $self->assert_num_equals( 0, $parser->{'lrp_subreport_count'} );
}

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

    my $parser = new_proxy Lire::Test::Mock( 'Lire::ReportParser' );
    $parser->set_result( 'error' => sub { shift; die @_ } );
    $self->assert_dies( qr/missing 'superservice' attribute/,
                        sub { $parser->subreport_start( 'lire:subreport' ) } );
    $self->assert_dies( qr/missing 'type' attribute/,
                        sub { $parser->subreport_start( 'lire:subreport', 
                                                        { 'superservice' => 'test' } ) } );
    $parser->{'lrp_section_subreport_count'} = 0;
    $parser->{'lrp_subreport_count'} = 0;
    $parser->subreport_start( 'lire:subreport', { 'superservice' => 'test',
                                                  'type' => 'top-dirs' } );
    $self->assert_num_equals( 1, $parser->{'lrp_section_subreport_count'} );
    $self->assert_num_equals( 1, $parser->current_section_subreport_count() );
    $self->assert_num_equals( 1, $parser->is_stack_empty( 'lrp_group')  );
    $self->assert_num_equals( 1, $parser->is_stack_empty( 'lrp_entry')  );
    $self->assert_deep_equals( { 'superservice' => 'test',
                                 'type' => 'top-dirs' },
                               $parser->{'lrp_subreport'} );
    $self->assert_str_equals( 'top-dirs', $parser->current_type() );
    $self->assert_str_equals( 'test', $parser->current_superservice() );
}

1;


syntax highlighted by Code2HTML, v. 0.9.1