package tests::LrFirstTest;

use strict;

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

use Lire::SQLExt::LrFirst;

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

    $self->{'lr_first'} = new Lire::SQLExt::LrFirst();
    $self->{'lr_first_key'} = new Lire::SQLExt::LrFirst( 'key' );

    return;
}

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

    $self->SUPER::tear_down();

    return;
}

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

    $self->assert_null( $self->{'lr_first'}{'_value'},
                        '_value should be undefined' );
    $self->assert_deep_equals( [], $self->{'lr_first'}{'_sort_values'} );
    $self->assert_deep_equals( [], $self->{'lr_first'}{'_sort_str'} );
    $self->assert_equals( 'value', $self->{'lr_first'}{'_return'} );

    $self->assert_equals( 'key', $self->{'lr_first_key'}{'_return'} );

    $self->assert_deep_equals( $self->{'lr_first'},
                               $self->{'lr_first'}->new() );
    $self->assert_deep_equals( $self->{'lr_first_key'},
                               $self->{'lr_first_key'}->new() );
}

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

    my @tests = ( [ 0, 1 ], [ '0', 1 ], [ 0xFF, 1 ],
                  [ 'abcde', 0 ], [ '0astring', 0 ],
                  [ '0xFF', 0 ] );
    foreach my $t ( @tests ) {
        if ( $t->[1] ) {
            $self->assert( Lire::SQLExt::LrFirst::is_number( $t->[0] ),
                           "is_number( $t->[0] ) should be true" );
        } else {
            $self->assert( ! Lire::SQLExt::LrFirst::is_number( $t->[0] ),
                           "is_number( $t->[0] ) should be false" );
        }
    }
}

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

    my $aggr = $self->{'lr_first'};
    $aggr->step( undef );
    $self->assert_null( $aggr->{'_value'}, 'value should be undef' );
    $aggr->step( 'abcde' );
    $self->assert_equals( 'abcde', $aggr->{'_value'} );
    $aggr->step( '0123' );
    $self->assert_equals( 'abcde', $aggr->{'_value'} );
}

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

    my $aggr = $self->{'lr_first'};

    $aggr->step( undef, 'host1', 10 );
    $self->assert_null( $aggr->{'_value'},
                        "'_value' attribute should be undef"  );

    $aggr->step( 'user1', undef, 10 );
    $self->assert_null( $aggr->{'_value'},
                        "'_value' attribute should be undef"  );

    $aggr->step( 'user1', 'host1', 'user1' );
    $self->assert_equals( 'user1', $aggr->{'_value'} );
    $self->assert_deep_equals( [ 1, 1 ], $aggr->{'_sort_str'} );
    $self->assert_deep_equals( [ 'host1', 'user1' ], $aggr->{'_sort_values'} );

    $aggr->step( 'user1', undef, 'user1' );
    $self->assert_equals( 'user1', $aggr->{'_value'} );
    $self->assert_deep_equals( [ 1, 1 ], $aggr->{'_sort_str'} );
    $self->assert_deep_equals( [ 'host1', 'user1' ], $aggr->{'_sort_values'} );

    $aggr->step( 'user2', 'host1', 'abcde' );
    $self->assert_equals( 'user2', $aggr->{'_value'} );
    $self->assert_deep_equals( [ 1, 1 ], $aggr->{'_sort_str'} );
    $self->assert_deep_equals( [ 'host1', 'abcde' ], $aggr->{'_sort_values'} );

    $aggr->step( 'user3', 'ahost', 'user1' );
    $self->assert_equals( 'user3', $aggr->{'_value'} );
    $self->assert_deep_equals( [ 1, 1 ], $aggr->{'_sort_str'} );
    $self->assert_deep_equals( [ 'ahost', 'user1' ], $aggr->{'_sort_values'} );

    $aggr->step( 'user5', 'ahost', 10 );
    $self->assert_equals( 'user5', $aggr->{'_value'} );
    $self->assert_deep_equals( [ 1, 1 ], $aggr->{'_sort_str'} );
    $self->assert_deep_equals( [ 'ahost', '10' ], $aggr->{'_sort_values'} );
}

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

    my $aggr = $self->{'lr_first'};

    $aggr->step( 'user1', 'host1', '1024' );
    $self->assert_equals( 'user1', $aggr->{'_value'} );
    $self->assert_deep_equals( [ 1, 0 ], $aggr->{'_sort_str'} );
    $self->assert_deep_equals( [ 'host1', 1024 ], $aggr->{'_sort_values'} );

    $aggr->step( 'user0', 'host1', '512' );
    $self->assert_equals( 'user0', $aggr->{'_value'} );
    $self->assert_deep_equals( [ 1, 0 ], $aggr->{'_sort_str'} );
    $self->assert_deep_equals( [ 'host1', 512 ], $aggr->{'_sort_values'} );

    $aggr->step( 'usera', 'host1', '0a512' );
    $self->assert_equals( 'usera', $aggr->{'_value'} );
    $self->assert_deep_equals( [ 1, 1 ], $aggr->{'_sort_str'} );
    $self->assert_deep_equals( [ 'host1', '0a512' ], $aggr->{'_sort_values'} );

    $aggr->step( 'userb', 'host1', '0512' );
    $self->assert_equals( 'userb', $aggr->{'_value'} );
    $self->assert_deep_equals( [ 1, 1 ], $aggr->{'_sort_str'} );
    $self->assert_deep_equals( [ 'host1', '0512' ], $aggr->{'_sort_values'} );
}

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

    $self->{'lr_first'}{'_value'} = 10;
    $self->assert_num_equals( 10, $self->{'lr_first'}->finalize() );

    $self->{'lr_first_key'}{'_sort_values'} = [ 'test', 'test1'];
    $self->assert_str_equals( 'test test1',
                              $self->{'lr_first_key'}->finalize() );

    $self->{'lr_first_key'}{'_sort_values'} = [];
    $self->assert_str_equals( '', $self->{'lr_first_key'}->finalize() );
}
1;


syntax highlighted by Code2HTML, v. 0.9.1