package tests::OutputFormatsLaTeXTest;

use strict;

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

use Lire::OutputFormats::LaTeX;
use Lire::PluginManager;
use Lire::Utils qw/tempdir create_file/;
use File::Basename qw/dirname/;
use File::Path qw/rmtree /;
use Lire::Test::Mock;

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

    $self->{'cfg'}{'lr_latex_include'} = 'custom.tex';
    $self->{'testdir'} = dirname( __FILE__ ) ;
    $self->{'tmpdir'} = tempdir( $self->name() . '_XXXXXX' );
    return;
}

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

    Lire::Test::Mock->reset_factories();
    rmtree( $self->{'tmpdir'} );

    return;
}

sub create_plugin {
    return new Lire::OutputFormats::LaTeX();
}

sub registration_file {
    return dirname( __FILE__ ) . "/../Lire/OutputFormats/of_latex_init";
}

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

    $self->test_registration_file();
    Lire::Test::Mock->set_mock_factory( 'Lire::ReportParser::LaTeXWriter',
                                        'write_report' => sub { create_file( $_[2] ) } );
    my $latex = Lire::PluginManager->get_plugin( 'output_format', 'latex' );
    my $report = "$self->{'tmpdir'}/report.tex";
    $latex->format_report( "$self->{'testdir'}/data/test-sqlite.xml",
                             $report );
    my ($writer) = @{Lire::Test::Mock->mock_instances( 'Lire::ReportParser::LaTeXWriter' )};
    my $call = $writer->get_invocation( 'write_report' );
    $self->assert_isa( 'Lire::Report', $call->[1] );
    $self->assert_str_equals( $report, $call->[2] );
    $self->assert_str_equals( 'latex', $call->[3] );
    $self->assert_str_equals( 'custom.tex', $call->[4] );
}

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

   $self->test_registration_file();
   my $create_chart = 0;
   Lire::Test::Mock->set_mock_factory( 'Lire::ReportParser::LaTeXWriter',
                                        'write_report' => 
                                       sub { my $dir = dirname( $_[2] );
                                             create_file( $_[2] );
                                             create_file( "$dir/chart.eps" )
                                               if $create_chart;
                                         } );
   my $latex = Lire::PluginManager->get_plugin( 'output_format', 'latex' );

   my $entity = $latex->mime_report( "$self->{'testdir'}/data/test-sqlite.xml" );
   $self->assert_isa( 'MIME::Entity', $entity );
   $self->assert_str_equals( 'text/x-tex', $entity->head()->mime_type() );
   $self->assert_str_equals( "quoted-printable\n",
                             $entity->head()->get( 'content-transfer-encoding' ) );
   $self->assert_str_equals( 'utf-8',
                             $entity->head()->mime_attr( 'content-type.charset' ) );

   $create_chart = 1;
   $entity = $latex->mime_report( "$self->{'testdir'}/data/test-sqlite.xml" );
   $self->assert_str_equals( 'multipart/mixed',
                             $entity->head()->mime_type() );
   $self->assert_num_equals( 2, scalar $entity->parts() );
   my $tex = $entity->parts(0);
   $self->assert_str_equals( 'text/x-tex', $tex->head()->mime_type() );
   my $chart = $entity->parts(1);
   $self->assert_str_equals( 'application/postscript', $chart->head()->mime_type() );
}

1;


syntax highlighted by Code2HTML, v. 0.9.1