package tests::ReportTest;

use strict;

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

use Lire::Report;
use Lire::Report::Section;
use Lire::Report::Subreport;
use File::Temp qw/ tempfile /;
use POSIX qw/strftime/;

sub set_up {
    my $self = $_[0];
    $self->SUPER::set_up();

    $self->set_up_tz( 'UTC' );

    return;
}

sub tear_down {
    my $self = $_[0];
    $self->SUPER::tear_down();

    return;
}

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


    my $report = new Lire::Report();
    $self->assert_isa( 'Lire::Report', $report );
    $self->assert_null( $report->{'_period'} );

    my $now = time;
    $report = new Lire::Report( 'daily', $now, $now + 3600 );
    $self->assert_str_equals( 'daily', $report->{'_period'} );
    $self->assert_num_equals( $now, $report->{'_start'} );
    $self->assert_num_equals( $now + 3600, $report->{'_end'} );

}

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

    my $report = new Lire::Report();
    $report->timespan_start( 10_000 );
    $self->assert_num_equals( 10_000, $report->{'_start'} );
    $self->assert_num_equals( 10_000, $report->timespan_start() );

    $report->{'_end'} = 90_000;
    $self->assert_dies( qr/'start' parameter is greater than timespan_end\(\)/,
                        sub { $report->timespan_start( 100_000 ) } );
    $report->timespan_start( '' );
    $self->assert_null( $report->timespan_start() );
    $report->timespan_start( undef );
    $self->assert_null( $report->timespan_start() );
    $report->timespan_start( 0 );
    $self->assert_null( $report->timespan_start() );
}

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

    my $report = new Lire::Report();
    $report->timespan_end( 10_000 );
    $self->assert_num_equals( 10_000, $report->{'_end'} );
    $self->assert_num_equals( 10_000, $report->timespan_end() );

    $report->{'_start'} = 90_000;
    $self->assert_dies( qr/'end' parameter is smaller than timespan_start\(\)/,
                        sub { $report->timespan_end( 80_000 ) } );
    $report->timespan_end( '' );
    $self->assert_null( $report->timespan_end() );
    $report->timespan_end( undef );
    $self->assert_null( $report->timespan_end() );
    $report->timespan_end( 0 );
    $self->assert_null( $report->timespan_end() );
}

my $empty_report = <<EOX;
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE lire:report PUBLIC
  "-//LogReport.ORG//DTD Lire Report Markup Language V2.1//EN"
  "http://www.logreport.org/LRML/2.1/lrml.dtd">
<lire:report xmlns:lire="http://www.logreport.org/LRML/" xmlns:lrcml="http://www.logreport.org/LRCML/" version="2.1">
 <!-- generated by Lire::Report(3pm) -->
 <lire:title>Title with an eacute: \xc3\xa9</lire:title>
 <lire:date time="&NOW&">&NOW_FMT&</lire:date>
 <lire:timespan period="daily" start="" end="">Unknown Period</lire:timespan>
</lire:report>
EOX

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

    my ( $fh, $file ) = tempfile();
    my $warn = "";
    local $SIG{'__WARN__'} = sub { $warn .= join "", @_ };
    my $report = new Lire::Report( "daily" );
    $report->title( "Title with an eacute: \x{00e9}" );
    my $now = $report->date();
    my $now_string = strftime( '%Y-%m-%d %H:%M:%S %Z', localtime( $now ));
    $empty_report =~ s/&NOW&/$now/;
    $empty_report =~ s/&NOW_FMT&/$now_string/;

    $report->write_report( $fh );
    $self->annotate( $warn );
    $self->assert( !$warn, "There were warnings" );

    close $fh;
    open $fh, $file
      or $self->error( "open failed: $!" );
    local $/ = undef;
    my $buf = <$fh>;
    $self->assert_str_equals( $empty_report, $buf );
}

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

    my $report = new Lire::Report();
    $self->assert_str_equals( 'top-dirs.0',
                              $report->create_subreport_id( 'top-dirs' ) );
    $self->assert_str_equals( 'top-dirs.1',
                              $report->create_subreport_id( 'top-dirs' ) );
    $self->assert_str_equals( 'top-files.0',
                              $report->create_subreport_id( 'top-files' ) );
}

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

    my $report = new Lire::Report;
    my $section1 = new Lire::Report::Section( 'Section 1' );
    my $section2 = new Lire::Report::Section( 'Section 2' );
    my $sub1 = new Lire::Report::Subreport( 'test', 'top-dirs' );
    $sub1->id( 'top-dirs.0' );
    my $sub2 = new Lire::Report::Subreport( 'test', 'top-files' );
    $sub2->id( 'top-files.0' );
    $section1->add_subreport( $sub1 );
    $section1->add_subreport( $sub2 );
    my $sub3 = new Lire::Report::Subreport( 'test', 'top-dirs' );
    $sub3->id( 'top-dirs.1' );
    $section2->add_subreport( $sub3 );
    $report->add_section( $section1 );
    $report->add_section( $section2 );

    $self->assert_null( $report->subreport_by_id( 'unknown' ) );
    $self->assert_deep_equals( $sub1, $report->subreport_by_id( 'top-dirs.0'));
    $self->assert_deep_equals( $sub2, $report->subreport_by_id('top-files.0'));
    $self->assert_deep_equals( $sub3, $report->subreport_by_id( 'top-dirs.1'));
}

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

    my $report = new Lire::Report();
    my $sect1 = new Lire::Report::Section( 'section 1' );
    $report->add_section( $sect1 );

    my $sub = new Lire::Report::Subreport( 'test', 'top-files' );
    $sub->id( 'test.0' );
    $sub->schemas( 'test' );
    $sect1->add_subreport( $sub );

    my $sect2 = new Lire::Report::Section( 'section 2' );
    $sub = new Lire::Report::Subreport( 'test', 'top-dirs' );
    $sub->id( 'test.1' );
    $sub->schemas( 'test', 'test-extended' );
    $sect1->add_subreport( $sub );
    $report->add_section( $sect2 );

    $self->assert_deep_equals( [ 'test', 'test-extended' ],
                               $report->schemas() );
}

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

    my $section = new Lire::Report::Section( 'My title' );
    $self->assert_isa( 'Lire::Report::Section', $section );
    $self->assert_str_equals( 'My title', $section->{'_title'} );
    $self->assert_str_equals( 'My title', $section->title() );
    $self->assert_str_equals( $section->{'_title'},
                              $section->title( 'New title' ) );
    $self->assert_deep_equals( [], $section->{'_subreports'} );
}

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

    my $section = new Lire::Report::Section( 'My title' );
    my $subreport = new Lire::Report::Subreport( 'test', 'top-dirs' );
    $self->assert_dies( qr/can't add a Subreport which doesn't have an id/,
                        sub { $section->add_subreport( $subreport ) } );
    $subreport->id( 'top-dirs.0' );
    $section->add_subreport( $subreport );
    $self->assert_deep_equals( [ $subreport ], [ $section->subreports() ] );
}

1;



syntax highlighted by Code2HTML, v. 0.9.1