The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl --  ========================================== -*-perl-*-
#
# t/11-plugin.t
#
# THIS TEST SCRIPT DOES NOT YET PASS - THE ERRORS ARE IN THE SCRIPT ITSELF
#
# Test the Template::Plugin::Latex module.
#
# Written by Andy Wardley <abw@wardley.org>
#
# This is free software; you can redistribute it and/or modify it
# under the same terms as Perl itself.
#
#========================================================================

use strict;
use warnings;
use FindBin qw($Bin);
use Cwd qw(abs_path);
use lib ( abs_path("$Bin/../lib"), "$Bin/lib" );

use Test::More skip_all => "need to realign the tests here with the errors thrown by LaTeX::Driver";


use Template;
use Template::Test;
use Template::Test::Latex;

my $ttcfg = {
    OUTPUT_PATH => 'output',
    FILTERS => {
        head => [ \&head_factory, 1],
    },
};

# Read in the tests from the DATA section and add a test to check that
# the latex filter isn't installed if we the plugin is not loaded.
# The test is not added if the TT2 version is less than 2.16 as up to
# that point the latex filter was included in Template::Filters.

my $tests = join '', <DATA>;

if ($Template::VERSION > 2.15) {
    $tests = join "\n", ("-- test --",
			 "[% # 1: Latex plugin not loaded", 
                         "   TRY; ",
			 "     hello | latex;",
			 "   CATCH undef;",
			 "     error;",
			 "   END",
			 "-%]",
			 "-- expect --",
			 "undef error - latex: filter not found",
			 $tests);
}

test_expect($tests, $ttcfg);


# Grab just the first $len bytes of the input, and optionally convert
# to a hex string if $hex is set

sub head_factory {
    my($context, $len, $hex) = @_;
    $len ||= 72;
    return sub {
        my $text = shift;
        return $text if length $text < $len;
        $text = substr($text, 0, $len);
        $text =~ s/(.)/sprintf("%02x", ord($1))/eg if $hex;
        return $text;
    }
}

__END__

-- test -- 
[[% # 2. USE, but then no FILTER - should work
    USE Latex %]]
-- expect --
[]


#------------------------------------------------------------------------
# test error handling
#------------------------------------------------------------------------

-- test --
[% # 3. invalid LaTeX source text
   USE Latex;
   TRY;
     "hello world" FILTER latex;
   CATCH latex;
     error;
   END
%]
-- expect --
latex error - pdflatex exited with errors:
! LaTeX Error: Missing \begin{document}.
l.1 h
! Emergency stop.
!  ==> Fatal error occurred, no output PDF file produced!

-- test --
[% # 4. invalid format on USE
   USE Latex format="nonsense";
   TRY;
     "hello world" FILTER latex;
   CATCH latex;
     error;
   END
%]
-- expect --
latex error - invalid output format: 'nonsense'


-- test --
[% # 5. invalid format on FILTER
   USE Latex;
   TRY;
     "hello world" FILTER latex(format="rubbish");
   CATCH latex;
     error;
   END
%]
-- expect --
latex error - invalid output format: 'rubbish'

-- test --
[% # 6. non-existent file
   USE Latex;
   TRY;
     "hello world" FILTER latex("nonsense");
   CATCH latex;
     error;
   END
%]
-- expect --
latex error - cannot determine output format from file name: nonsense


#------------------------------------------------------------------------
# test the ability to grok the format from output argument
#------------------------------------------------------------------------

-- test --
[% USE Latex -%]
[% TRY;
     "hello world" FILTER latex("example.pdf");
   CATCH latex;
     error | head(42);
   END
%]
-- expect --
latex error - pdflatex exited with errors:

-- test --
[% USE Latex -%]
[% TRY;
     "hello world" FILTER latex("EXAMPLE.PDF");
   CATCH latex;
     error | head(42);
   END
%]
-- expect --
latex error - pdflatex exited with errors:

-- test --
[% USE Latex -%]
[% TRY;
     "hello world" FILTER latex("example.ps");
   CATCH latex;
     error | head(39);
   END
%]
-- expect --
latex error - latex exited with errors:

-- test --
[% USE Latex -%]
[% TRY;
     "hello world" FILTER latex("example.dvi");
   CATCH latex;
     error | head(39);
   END
%]
-- expect --
latex error - latex exited with errors:


#------------------------------------------------------------------------
# same again with named output/format parameters
#------------------------------------------------------------------------

-- test --
[% USE Latex -%]
[% TRY;
     "hello world" FILTER latex(output="example.pdf");
   CATCH latex;
     error | head(42);
   END
%]
-- expect --
latex error - pdflatex exited with errors:

-- test --
[% USE Latex -%]
[% TRY;
     "hello world" FILTER latex(format="pdf");
   CATCH latex;
     error | head(42);
   END
%]
-- expect --
latex error - pdflatex exited with errors:

-- test --
[% USE Latex -%]
[% TRY;
     "hello world" FILTER latex(output="example.ps");
   CATCH latex;
     error | head(39);
   END
%]
-- expect --
latex error - latex exited with errors:

-- test --
[% USE Latex -%]
[% TRY;
     "hello world" FILTER latex(output="example.ps", format="pdf");
   CATCH latex;
     error | head(42);
   END
%]
-- expect --
latex error - pdflatex exited with errors:

-- test --
[% USE Latex -%]
[% TRY;
     "hello world" FILTER latex("example.dvi");
   CATCH latex;
     error | head(39);
   END
%]
-- expect --
latex error - latex exited with errors:


#------------------------------------------------------------------------
# test the old-skool usage where the single argument is the format
#------------------------------------------------------------------------

-- test --
[% # 16. latex("pdf") on invalid input
   USE Latex;
   TRY;
     "hello world" FILTER latex("pdf");
   CATCH latex;
     error | head(42);
   END
%]
-- expect --
latex error - pdflatex exited with errors:

-- test --
[% # 17. latex("ps") on invalid input
   USE Latex;
   TRY;
     "hello world" FILTER latex("ps");
   CATCH latex;
     error | head(39);
   END
%]
-- expect --
latex error - latex exited with errors:

-- test --
[% # 18. latex("dvi") on invalid input
   USE Latex;
   TRY;
     "hello world" FILTER latex("dvi");
   CATCH latex;
     error | head(39);
   END
%]
-- expect --
latex error - latex exited with errors:


#------------------------------------------------------------------------
# try a different filter name
#------------------------------------------------------------------------

-- test --
[% # 19. invoke filter with a different name
   USE Latex filter='pdf' format='pdf';
   TRY;
     "hello world" FILTER pdf("example.pdf");
   CATCH latex;
     error | head(42);
   END
%]
-- expect --
latex error - pdflatex exited with errors: