package tests::RangegroupTest;

use strict;

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

use Lire::Rangegroup;
use Lire::ReportSpec;
use Lire::Report::Group;
use Lire::Report::TableInfo;
use Lire::DlfQuery;

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( 'rangegroup-test' );

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

    $self->{'rangegroup5'} =
      new Lire::Rangegroup( 'report_spec' => $self->{'spec'},
                            'range-size' => '10k',
                            'field' =>  'file_size',
                            'label' => 'Range',
                          );

    $self->{'rangegroup5_min'} =
      new Lire::Rangegroup( 'report_spec' => $self->{'spec'},
                            'range-size' => '10k',
                            'range-start' => '1k',
                            'min-value' => 0,
                            'max-value' => '10k',
                            'field' =>  'file_size',
                            'label' => 'Range',
                          );

    $self->{'rangegroup5_geo'} =
      new Lire::Rangegroup( 'report_spec' => $self->{'spec'},
                            'size-scale' => 5,
                            'range-size' => '1k',
                            'field' =>  'file_size',
                            'label' => 'Range', );

    return;
}

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

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

    return;
}

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

    $self->assert_equals( 'rangegroup:file_size',
                          $self->{'rangegroup5'}->name() );
}

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

    my $info = new Lire::Report::TableInfo();
    $self->{'rangegroup5'}->create_categorical_info( $info );

    my @cols = $info->children();
    $self->assert_equals( 1, scalar @cols );

    my $col = $cols[0];
    $self->assert_equals( 'categorical', $col->class() );
    $self->assert_equals( 'rangegroup:file_size', $col->name() );
    $self->assert_equals( 'bytes', $col->type() );
    $self->assert_equals( 'Range', $col->label() );
}

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

    foreach my $t ( [ '5', 'lr_rangegroup(file_size,0,10240,NULL,NULL)' ],
                    [ '5_min', 'lr_rangegroup(file_size,1024,10240,0,10240)' ],
                    [ '5_geo', 'lr_rangegroup_geo(file_size,0,1024,5,NULL,NULL)' ] )
    {
        my $rangegroup = $self->{ 'rangegroup' . $t->[0] };
        $rangegroup->{'field'} = 'file_size';
        my $e_query = new Lire::DlfQuery( 'test' );
        $e_query->add_aggr_field( '_lr_nrecords', 'count(*)' );
        $e_query->add_group_field( 'rangegroup:file_size', $t->[1] );
        $e_query->set_sort_spec( 'rangegroup:file_size' );

        my $query = new Lire::DlfQuery( 'test' );
        $rangegroup->build_query( $query );
        $self->assert_deep_equals( $e_query, $query );
    }
}

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

    my $op =  $self->{'rangegroup5'};

    $op->{'field'} = 'file_size';
    $op->{'range-start'} = '1k';
    $self->assert_equals( 1024, $op->_param_value( 'range-start' ) );

    $op->{'field'} = 'time_taken';
    $op->{'range-min'} = '10s';
    $self->assert_equals( 10, $op->_param_value( 'range-min' ) );

}

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

    my $info = new Lire::Report::TableInfo();
    $self->{'rangegroup5'}->create_categorical_info( $info );

    foreach my $t ( [ '5', '[0k-10k>', 0, 10240 ],
                    [ '5_min', '[1k-11k>', 1024, 10240 ],
                    [ '5_geo', '[0k-1k>>', 0, 1024  ],
                    [ '5_geo', '[1k-6k>', 1024, 5*1024  ], )
    {
        my ( $range, $fmt_value, $value, $length ) = @$t;

        my $rangegroup = $self->{ 'rangegroup' . $range};
        my $dlf = { 'rangegroup:file_size' => $value };
        my $group = new Lire::Report::Group( bless( {}, 'Lire::Report::Entry'),
                                             $info );
        my $entry = $rangegroup->create_entry( $group, $dlf );

        $self->assert_not_null( $entry, "create_entry() returned undef" );
        my @data = $entry->data();
        $self->assert_equals( 1, scalar @data );
        $self->assert_equals( $fmt_value, $data[0]->{'content'} );
        $self->assert_equals( $value, $data[0]->{'value'} );
        $self->assert_equals( $length, $data[0]->{'range'} );
    }
}

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

    my $rangegroup = $self->{'rangegroup5'};
    my $info = new Lire::Report::TableInfo();
    $rangegroup->create_categorical_info( $info );
    my $group = new Lire::Report::Group( bless( {}, 'Lire::Report::Entry'),
                                         $info );

    my $entry = $rangegroup->create_entry( $group,
                                          { 'rangegroup:file_size' => undef,
                                            '_lr_nrecords' => 24 } );
    $self->assert_null( $entry, "create_entry() should have returned undef" );
    $self->assert_equals( 24, $group->missing_cases() );
}

1;


syntax highlighted by Code2HTML, v. 0.9.1