package tests::ReportColumnInfoTest;

use strict;

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

use Lire::Report::TableInfo;

sub set_up {
    my $self = shift->SUPER::set_up();

    $self->{'table_info'} = new Lire::Report::TableInfo();
    $self->{'num_col_info'} =
      new Lire::Report::ColumnInfo( $self->{'table_info'},
                                    'test', 'numerical',
                                    'int', 'A Label' );
    return $self;
}

sub tear_down {
    my $self = shift->SUPER::tear_down();

    return $self;
}

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

    my @arg_names = ( 'group_info', 'name', 'class', 'type' );
    my @args = ( $self->{'table_info'}, 'test', 'categorical', 'string' );
    for ( my $i=0; $i < @arg_names; $i++ ) {
        my @args = ($i == 0) ? () : @args[0..($i-1)];
        $self->assert_died( sub { new Lire::Report::ColumnInfo( @args ) },
                            qr/missing '$arg_names[$i]' parameter/ );
    }

    $self->assert_died( sub { new Lire::Report::ColumnInfo( $self->{'table_info'},
                                                            'invalid%',
                                                            'categorical',
                                                            'string' ) },
                        qr/'name' parameter isn't a valid XML name: 'invalid%'/ );

    $self->assert_died( sub { new Lire::Report::ColumnInfo( {},
                                                            'test',
                                                            'categorical',
                                                            'string' ) },
                        qr/\'group_info\' parameter should be a \'Lire::Report::GroupInfo\' instance, not \'HASH/ );

    $self->assert_died( sub { new Lire::Report::ColumnInfo( $self->{'table_info'},
                                                            'test',
                                                            'invalid',
                                                            'string' ) },
                        qr/'class' parameter should either be 'numerical' or 'categorical'/ );

    $self->assert_died( sub { new Lire::Report::ColumnInfo( $self->{'table_info'},
                                                            'test',
                                                            'categorical',
                                                            'nosuchtype' ) },
                        qr/'type' parameter isn't a valid Lire type: 'nosuchtype'/ );

    my $col_info = new Lire::Report::ColumnInfo( $self->{'table_info'},
                                                 'test', 'categorical',
                                                 'string', 'A Label' );

    $self->assert_not_null( $col_info,
                            "new() returned undef" );
    $self->assert_isa( 'Lire::Report::ColumnInfo', $col_info );
    $self->assert_equals( "test", $col_info->name() );
    $self->assert_equals( "categorical", $col_info->class() );
    $self->assert_equals( "string", $col_info->type() );
    $self->assert_equals( $self->{'table_info'}, $col_info->group_info() );
    $self->assert_equals( 'A Label', $col_info->label() );
    $self->assert_null( $col_info->{'max_chars'},
                        'max_chars() should be undef' );
    $self->assert_null( $col_info->{'index'},
                        "'index' attribute should be undef" );
    $self->assert_equals( 0, $col_info->{'col_width'} );
    $self->assert_equals( 0, $col_info->{'padding'} );
    $self->assert_null( $col_info->{'avg_chars'},
                        "'avg_chars' attribute should be undef" );
}

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

    my $col_info = $self->{'num_col_info'};
    $self->assert_died( sub { $col_info->avg_chars() },
                        qr/avg_chars\(\) called while stat is undefined. Was subreport's finalize\(\) called\?/ );
    $col_info->avg_chars( 10 );
    $self->assert_equals( 10, $col_info->{'avg_chars'} );
    $self->assert_equals( 10, $col_info->avg_chars() );
}

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

    my $col_info = $self->{'num_col_info'};
    $self->assert_died( sub { $col_info->max_chars() },
                        qr/max_chars\(\) called while stat is undefined. Was subreport's finalize\(\) called\?/ );
    $col_info->max_chars( 10 );
    $self->assert_equals( 10, $col_info->{'max_chars'} );
    $self->assert_equals( 10, $col_info->max_chars() );
}

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

    my $col_info = $self->{'num_col_info'};
    $self->assert_equals( 'A Label', $col_info->label() );
    $col_info->label( undef );
    $self->assert_null( $col_info->{'label'}, "'label' should be undef" );
    $self->assert_equals( 'test', $col_info->label() );

    $self->assert_equals( 'New label', $col_info->label( 'New label' ) );
}

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

    my $col_info = $self->{'num_col_info'};

    $col_info->init_chars_stats();

    $self->assert_equals( 0, $col_info->{'total_chars'} );
    $self->assert_equals( 0, $col_info->{'column_count'} );
    $self->assert_equals( length( $col_info->label() ),
                          $col_info->{'max_chars'} );
}

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

    my $col_info = $self->{'num_col_info'};
    $col_info->{'total_chars'} = 10;
    $col_info->{'column_count'} = 2;

    $col_info->finish_chars_stats();
    $self->assert_equals( 6, $col_info->avg_chars() );
    $self->assert_equals( 6, $col_info->{'avg_chars'} );
    $self->assert_null( $col_info->{'total_chars'},
                        "'total_chars' attribute should be removed" );
    $self->assert_null( $col_info->{'column_count'},
                        "'column_count' attribute should be removed" );
    $self->assert_equals( 6, $col_info->avg_chars() );

    $col_info->avg_chars( 8 );
    $self->assert_equals( 8, $col_info->{'avg_chars'} );
}

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

    my $col_info = $self->{'num_col_info'};
    $self->assert_null( $col_info->{'total_chars'},
                        "'total_chars' attribute should be undef" );
    $self->assert_null( $col_info->{'column_count'},
                        "'column_count' attribute should be undef" );

    my $len1 = length 'A longer value';
    $col_info->init_chars_stats();
    $col_info->update_chars_stats( 'A longer value' );
    $self->assert_equals( $len1, $col_info->{'total_chars'} );
    $self->assert_equals( $len1, $col_info->{'max_chars'} );
    $self->assert_equals( 1, $col_info->{'column_count'} );

    my $len2 = length 'A short';
    $col_info->update_chars_stats( 'A short' );
    $self->assert_equals( $len1+$len2, $col_info->{'total_chars'} );
    $self->assert_equals( $len1, $col_info->{'max_chars'} );
    $self->assert_equals( 2, $col_info->{'column_count'} );
}

1;



syntax highlighted by Code2HTML, v. 0.9.1