package tests::SumTest;

use strict;

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

use Lire::Sum;
use Lire::ReportSpec;
use Lire::Report::Subreport;
use Lire::Report::TableInfo;
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' );

    $self->_set_up_flat_subreport();
    $self->_set_up_nested_subreport();

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

    return  $self;
}

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

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

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

    $self->{'weight_sum'} = new Lire::Sum( 'report_spec' => $self->{'spec'},
                                           'parent' => $mock,
                                           'field' => 'file_size',
                                           'weight' => 'file_size',
                                           'name' => 'weight_sum' );

    $self->{'flat_subreport'} = new Lire::Report::Subreport( 'test', 'test' );
    my $info = new Lire::Report::TableInfo();
    $self->{'flat_subreport'}->table_info( $info );
    $info->create_column_info( 'sum', 'numerical', 'bytes' );

    return;
}

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

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

    $self->{'ratio_sum'} = new Lire::Sum( 'report_spec' => $self->{'spec'},
                                          'parent' => $mock,
                                          'field' => 'file_size',
                                          'ratio' => 'table',
                                          'name' => 'ratio_sum' );

    $self->{'nested_subreport'} =
      new Lire::Report::Subreport(  'test', 'test' );
    my $info = new Lire::Report::TableInfo();
    $self->{'nested_subreport'}->table_info( $info );
    my $group1_info = $info->create_group_info( 'group1' );
    $group1_info->create_column_info( 'ratio_sum', 'numerical', 'bytes' );
    return;
}

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

    return  $self;
}

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

    $self->{'sum'}{'field'} = 'file-size';

    $self->assert_equals( 'sum("file-size")', $self->{'sum'}->sql_aggr_expr());
}

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

    $self->{'sum'}{'field'} = 'file-size';
    $self->{'sum'}{'weight'} = 'connection-id';

    $self->assert_equals( 'sum("file-size"*"connection-id")',
                          $self->{'sum'}->sql_aggr_expr());
}

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

    my $table = $self->{'flat_subreport'};
    my $value = $self->{'sum'}->create_value( $table, { 'sum' => 2048*10,
                                                        '_lr_sum_mc' => 2 });
    $self->assert_deep_equals( { 'content' => '20k',
                                 'value' => 2048*10,
                                 'missing_cases' => 2 }, $value );
}

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

    my $table = $self->{'nested_subreport'};
    $self->{'ratio_sum'}{'ratio'} = 'table';
    my $table_value = 
      $self->{'ratio_sum'}->create_value( $table, { 'ratio_sum' => 100 * 2048,
                                                    '_lr_ratio_sum_mc' => 0 });
    $self->assert_deep_equals( { 'content' => '100.0',
                                 'value' => 2048*100,
                                 'missing_cases' => 0 },
                               $table_value );
}

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

    my $table = $self->{'nested_subreport'};
    $table->set_summary_value( 'ratio_sum', 'value' => 100*2048 );
    my $group1 = $table->create_entry()->create_group();

    $self->{'ratio_sum'}{'ratio'} = 'table';
    my $table_value = 
      $self->{'ratio_sum'}->create_value( $table, { 'ratio_sum' => 100 * 2048,
                                                    '_lr_ratio_sum_mc' => 0 });
    $self->assert_deep_equals( { 'content' => '100.0',
                                 'value' => 2048*100,
                                 'missing_cases' => 0 },
                               $table_value );

    my $group1_value =
      $self->{'ratio_sum'}->create_value( $group1, { 'ratio_sum' =>  5 * 2048,
                                                     '_lr_ratio_sum_mc' => 0});
    $self->assert_deep_equals( { 'content' => '5.0',
                                 'value' => 2048*5,
                                 'missing_cases' => 0 },
                               $group1_value );
}

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

    my $table = $self->{'nested_subreport'};
    $table->set_summary_value( 'ratio_sum', 'value' => 100*2048 );
    my $group1 = $table->create_entry()->create_group();

    $self->{'ratio_sum'}{'ratio'} = 'group';
    my $table_value =
      $self->{'ratio_sum'}->create_value( $table,
                                          { 'ratio_sum' =>  100 * 2048,
                                            '_lr_ratio_sum_mc' => 0 } );
    $self->assert_deep_equals( { 'content' => '100.0',
                                 'value' => 2048*100,
                                 'missing_cases' => 0 },
                               $table_value );

    $group1->set_summary_value( 'ratio_sum', 'value' => 5*2048 );
    my $group1_value =
      $self->{'ratio_sum'}->create_value( $group1,
                                          { 'ratio_sum' =>  1 * 2048,
                                            '_lr_ratio_sum_mc' => 0 } );

    $self->assert_deep_equals( { 'content' => '20.0',
                                 'value' => 1 * 2048,
                                 'missing_cases' => 0 },
                               $group1_value );
}

1;


syntax highlighted by Code2HTML, v. 0.9.1