package tests::TestDlfConverterTestCaseTest;

use strict;

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

use Lire::DlfConverter;
use Lire::Test::DlfConverterTestCase;

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

    return $self;
}

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

    $self->{'converter'} =
      new Class::Inner( 'parent' => 'Lire::DlfConverter',
                        methods =>
                        {
                         'new' => sub { bless {}, shift },
                         'name' => sub { 'myconverter' },
                         'schemas' => sub { 'test' },
                        } );

    $self->{'test'} =
      new Class::Inner( 'parent' => 'Lire::Test::DlfConverterTestCase',
                        'methods' =>
                        {
                         'new' => sub { bless {}, shift },
                         'create_converter' => sub { $self->{'converter'} }
                        } );
    return;
}

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

    return;
}

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

    my $process = $self->{'test'}->create_mock_process();
    $self->assert_isa( 'Lire::Test::MockDlfConverterProcess', $process );
    $self->assert_str_equals( $self->{'converter'}, $process->{'_converter'} );
    $self->assert_num_equals( 0, $process->{'_line_count'} );
    $self->assert_num_equals( 0, $process->{'_dlf_count'} );
    $self->assert_num_equals( 0, $process->{'_error_count'} );
    $self->assert_num_equals( 0, $process->{'_saved_count'} );
    $self->assert_num_equals( 0, $process->{'_ignored_count'} );

    $self->assert_deep_equals( [], $process->{'_errors'} );
    $self->assert_deep_equals( [], $process->{'_saved'} );
    $self->assert_deep_equals( [], $process->{'_ignored'} );
    $self->assert_deep_equals( { 'test' => [] }, $process->{'_dlf'} );
}

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

    my $process = $self->{'test'}->create_mock_process();
    $self->assert_isa( 'Lire::Test::MockDlfConverterProcess', $process );
    $process->error( 'Test error', 'A line' );
    $self->assert_deep_equals( [ [ 'Test error', 'A line' ] ],
                               $process->{'_errors'} );

    $process->error( 'Another error' );
    $self->assert_deep_equals( [ [ 'Test error', 'A line' ],
                                 ['Another error', undef ] ],
                               $process->errors() );
    $self->assert_num_equals( 2, $process->error_count() );
}

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

    my $process = $self->{'test'}->create_mock_process();
    $self->assert_isa( 'Lire::Test::MockDlfConverterProcess', $process );
    $process->save_log_line(  'A line' );
    $self->assert_deep_equals( [  'A line' ],
                               $process->{'_saved'} );

    $process->save_log_line( 'Another line' );
    $self->assert_deep_equals( [ 'A line', 'Another line' ],
                               $process->saved() );
    $self->assert_num_equals( 2, $process->saved_count() );
}

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

    my $process = $self->{'test'}->create_mock_process();
    $self->assert_isa( 'Lire::Test::MockDlfConverterProcess', $process );

    $self->assert_dies( qr/schema 'noschema' wasn't defined by 'myconverter' converter /,
                        sub { $process->write_dlf( 'noschema', {} ) } );

    my $dlf = { 'connection_id' => 'An id' };
    $process->write_dlf( 'test', $dlf );
    $self->assert_deep_equals( [ $dlf ], $process->{'_dlf'}{'test'} );
    $self->assert_str_not_equals( $dlf, $process->{'_dlf'}{'test'}[0] );

    $dlf->{'time_start'} = time;
    $process->write_dlf( 'test', $dlf );
    $self->assert_deep_equals( [ { 'connection_id' => 'An id' }, $dlf ],
                                 $process->dlf( 'test' )  );
    $self->assert_num_equals( 2, $process->dlf_count() );
}

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

    my $process = $self->{'test'}->create_mock_process();
    $self->assert_isa( 'Lire::Test::MockDlfConverterProcess', $process );
    $process->ignore_log_line( 'A line', 'A reason' );
    $self->assert_deep_equals( [ [ 'A line', 'A reason' ] ],
                               $process->{'_ignored'} );

    $process->ignore_log_line( 'Another line' );
    $self->assert_deep_equals( [ [ 'A line', 'A reason' ],
                                 ['Another line', undef ] ],
                               $process->ignored() );
    $self->assert_num_equals( 2, $process->ignored_count() );
}

1;


syntax highlighted by Code2HTML, v. 0.9.1