package tests::SimpleStatTest;

use strict;

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

use Lire::ReportSpec;
use tests::MockAggregator;

use Class::Inner;

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

    $self->init();

    return $self;
}

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

    $self->set_up_test_schema();

    $self->{'spec'} = new Lire::ReportSpec();
    $self->{'spec'}->superservice( 'test' );
    $self->{'spec'}->id( 'test-simplestat' );

    $self->{'mock_aggr'} =
      new tests::MockAggregator( 'report_spec' => $self->{'spec'} );

    $self->{'mock_stat'} = bless ( {}, 'Lire::SimpleStat' );
    $self->{'mock_stat'}->init( 'report_spec' => $self->{'spec'},
                                'name' => 'statTest',
                                'parent' => $self->{'mock_aggr'},
                                'field' => 'time_taken',
                                'op' => 'mock',
                                'label' => 'Time Taken' );

    $self->{'cfg'}{'lr_scale_numbers'} = 0;
    $self->{'cfg'}{'lr_scale_bytes'} = 1;
    $self->{'cfg'}{'lr_scale_seconds'} = 1;

    return;
}

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

    $self->SUPER::tear_down( @_ );

    return;
}

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

    $self->assert_equals( 'time_taken',
                          $self->{'mock_stat'}{'field'} );

    my %args = ( 'report_spec' => $self->{'spec'},
                 'name' => 'statTest',
                 'parent' => $self->{'mock_aggr'},
                 'op' => 'mock' );
    $self->assert_died( sub { $self->{'mock_stat'}->init( %args ) },
                        qr/missing 'field' parameter/ );

    $args{'field'} = 'connection_id';
    $self->assert_died( sub { $self->{'mock_stat'}->init( %args ) },
                        qr/'field' parameter should be a numerical field: 'connection_id'/ );
}

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

    my $field = $self->{'mock_stat'}->dlf_field();
    $self->assert_not_null( $field, "dlf_field() returned undef" );
    $self->assert( UNIVERSAL::isa( $field, 'Lire::Field' ),
                   "dlf_field() should have returned a Lire::Field instance, not $field" );
    $self->assert_equals( 'time_taken', $field->name() );
}

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

    my $info = new Lire::Report::TableInfo();
    $self->{'mock_stat'}->create_numerical_info( $info );
    my $col_info = $info->info_by_index( 0 );
    $self->assert_not_null( $col_info, 'create_numerical_info() should have create a ColumnInfo' );
    $self->assert_equals( 'statTest', $col_info->name() );
    $self->assert_equals( 'duration', $col_info->type() );
    $self->assert_equals( 'numerical', $col_info->class() );
    $self->assert_equals( 'Time Taken', $col_info->label() );
}

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

    $self->assert_deep_equals( [ 'time_taken' ],
                                 $self->{'mock_stat'}->sql_required_fields() );
}

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

    $self->{'mock_stat'}{'field'} = 'time_taken';
    my $value = $self->{'mock_stat'}->create_value( undef,
                                                    { 'statTest' => 120,
                                                      '_lr_statTest_mc' => 2 });
    $self->assert_deep_equals( { 'content' => '2m',
                                 'value' => 120,
                                 'missing_cases' => 2 }, $value );

    $self->{'mock_stat'}{'field'} = 'file_size';
    $value = $self->{'mock_stat'}->create_value( undef,
                                                 { 'statTest' => 1024,
                                                   '_lr_statTest_mc' => 0 });
    $self->assert_deep_equals( { 'content' => '1k',
                                 'value' => 1024,
                                 'missing_cases' => 0 }, $value );
}


1;


syntax highlighted by Code2HTML, v. 0.9.1