package tests::AverageTest;

use strict;

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

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

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

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

    $self->{'avg_op'} = new Lire::Average( 'report_spec' => $self->{'spec'},
                                           'parent' => $mock,
                                           'field' => 'file_size',
                                           'name' => 'avgTest' );

    $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_build_avg_query {
    my  $self = $_[0];

    foreach my $t ( [ 'file-size', undef, undef,
                      [ 'avgTest_total', 'sum("file-size")',
                        'avgTest_n', 'count(*)',
                        'avgTest', 'sum("file-size")/count(*)'] ],
                    [ 'file_size', 'time-taken', undef,
                      [ 'avgTest_total', 'sum(file_size*"time-taken")',
                        'avgTest_n', 'count(*)',
                        'avgTest', 'sum(file_size*"time-taken")/count(*)' ] ],
                    [ 'file-size', undef, [ 'connection-id', 'user' ],
                      [ 'avgTest_total', 'sum("file-size")',
                        'avgTest_n', 'lr_count_uniq("connection-id",user)',
                        'avgTest', 'sum("file-size")/lr_count_uniq("connection-id",user)'
                      ] ],
                      [ 'file-size', undef, [ 'time_taken' ],
                        [ 'avgTest_total', 'sum("file-size")',
                          'avgTest_n', 'sum(time_taken)',
                          'avgTest', 'sum("file-size")/sum(time_taken)'
                        ] ],
                      )
    {
        my ( $field, $weight, $by_fields, $aggrFields ) = @$t;

        $self->{'avg_op'}{'field'} = $field;
        $self->{'avg_op'}{'weight'} = $weight;
        $self->{'avg_op'}{'by_fields'} = $by_fields;
        my $e_query = new Lire::DlfQuery( 'test' );
        for ( my $i=0; $i < @$aggrFields; $i += 2) {
            $e_query->add_aggr_field( $aggrFields->[$i], $aggrFields->[$i+1] );
        }
        my $query = new Lire::DlfQuery( 'test' );
        $self->{'avg_op'}->_build_avg_query( $query );
        $self->assert_deep_equals( $e_query, $query );
    }
}

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

    $self->assert_deep_equals( [ 'file_size' ],
                               $self->{'avg_op'}->sql_required_fields() );

    $self->{'avg_op'}{'weight'} = 'time_taken';
    $self->assert_deep_equals( [ 'file_size', 'time_taken' ],
                               $self->{'avg_op'}->sql_required_fields() );

    $self->{'avg_op'}{'by_fields'} = [ 'connection_id', 'user' ];
    $self->assert_deep_equals( [ 'file_size', 'time_taken', 'connection_id',
                                 'user' ],
                               $self->{'avg_op'}->sql_required_fields() );
}

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

    foreach my $t ( [ 'transfer-complete', 0, 0, 10, 'NaN', 'NaN' ],
                    [ 'transfer-complete', 10, 5, 0, '2.00', '2.00' ],
                    [ 'file_size', 102400, 11, 0, '9.1k', '9309.09' ], )
    {
        my ($field, $total, $n, $mc, $content, $value ) = @$t;

        my $row = { 'avgTest_total' => $total,
                    'avgTest_n' => $n,
                    '_lr_avgTest_mc' => $mc };

        $self->{'avg_op'}{'field'} = $field;
        my $v = $self->{'avg_op'}->create_value( undef, $row );
        my $e_v = { 'value' => $value,
                    'missing_cases' => $mc,
                    'content' => $content,
                    'total' => $total,
                    'n' => $n };
        $self->assert_deep_equals( $e_v, $v );
    }
}


1;


syntax highlighted by Code2HTML, v. 0.9.1