The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.
# -*- Mode: Perl; -*-

=head1 NAME

00_use.t - Test the use/import/can functionality of Template::Alloy

=cut

use strict;
use warnings;

use Test::More tests => 43;

###----------------------------------------------------------------###
### loading via can, use, and import

use_ok('Template::Alloy');

### autoload via can
ok(! $INC{'Template/Alloy/Parse.pm'},  "Parse role isn't loaded yet");
ok(Template::Alloy->can('parse_tree'), "But it can parse anyway");
ok($INC{'Template/Alloy/Parse.pm'},    "Parse role is now loaded");

ok(! eval "use Template::Alloy qw(garbage); 1", "Can't import invalid method");

### autoload via Role in use
ok(! $INC{'Template/Alloy/Play.pm'},       "Play role isn't loaded yet");
ok(eval "use Template::Alloy qw(Play); 1", "It can be imported ($@)");
ok($INC{'Template/Alloy/Play.pm'},         "Play role is now loaded");

### autoload via Role in use with sugar
ok(! $INC{'Template/Alloy/Compile.pm'},             "Compile role isn't loaded yet");
ok(eval "use Template::Alloy load => 'Compile'; 1", "It can be imported ($@)");
ok($INC{'Template/Alloy/Compile.pm'},               "Compile role is now loaded");
ok(eval "use Template::Alloy load => 'Compile'; 1", "It can be imported  twice ($@)");

### autoload via Role in use with sugar
ok(! $INC{'Template/Alloy/Velocity.pm'},        "Velocity role isn't loaded yet");
ok(eval "use Template::Alloy Velocity => 1; 1", "It can be imported ($@)");
ok($INC{'Template/Alloy/Velocity.pm'},          "Velocity role is now loaded");

### autoload via method in use with sugar
ok(! $INC{'Template/Alloy/Tmpl.pm'},                "Tmpl role isn't loaded yet");
ok(eval "use Template::Alloy parse_string => 1; 1", "It can be imported ($@)");
ok($INC{'Template/Alloy/Tmpl.pm'},                  "Tmpl role is now loaded");

### override module namespace that isn't yet loaded
ok(! $INC{'Text/Tmpl.pm'},                     "Text::Tmpl isn't loaded");
ok(eval "use Template::Alloy 'Text::Tmpl'; 1", "It can be imported ($@)");
ok($INC{'Text/Tmpl.pm'},                       "Text::Tmpl is now loaded");
ok(Text::Tmpl->isa('Template::Alloy'),         "Text::Tmpl is a Template::Alloy");
ok(eval "use Template::Alloy 'Text::Tmpl'; 1", "It can be imported twice");

### override module namespace that isn't yet loaded
ok(! $INC{'HTML/Template.pm'},                     "HTML::Template isn't loaded");
eval "{package HTML::Template; \$INC{'HTML/Template.pm'}=1}"; # simulate loading HTML::Template
ok(! eval "use Template::Alloy 'HTML::Template'; 1", "It can't be imported because another non-Alloy package already is using it");
ok(! HTML::Template->isa('Template::Alloy'),         "HTML::Template is not a Template::Alloy");

### override module namespace that isn't yet loaded
ok(! $INC{'HTML/Template/Expr.pm'},                       "HTML::Template::Expr isn't loaded");
ok(eval{Template::Alloy->import('HTML::Template::Expr')}, "It can be imported ($@)");
ok($INC{'HTML/Template/Expr.pm'},                         "HTML::Template::Expr is now loaded");
ok(HTML::Template::Expr->isa('Template::Alloy'),          "HTML::Template::Expr is a Template::Alloy");
ok(eval{Template::Alloy->import('HTML::Template::Expr')}, "It can be imported twice");

### autoload via "all"
ok(! $INC{'Template/Alloy/TT.pm'},              "TT role isn't loaded yet");
ok(eval "use Template::Alloy load => 'all'; 1", "It can be imported via all ($@)");
ok($INC{'Template/Alloy/TT.pm'},                "TT role is now loaded");
ok(eval "use Template::Alloy load => 'all'; 1", "It can be imported twice ($@)");

### override module namespace that isn't yet loaded
ok(! $INC{'Template.pm'},                    "Template isn't loaded");
ok(eval "use Template::Alloy 'Template'; 1", "It can be imported ($@)");
ok($INC{'Template.pm'},                       "Template is now loaded");
ok(Template->isa('Template::Alloy'),         "Template is a Template::Alloy");
ok(eval "use Template::Alloy 'Template'; 1", "It can be imported twice");

###----------------------------------------------------------------###

ok(! eval { Template::Alloy->flabbergast } && $@, "Got an error on invalid methods ($@)");
my $meth = '';
ok(! eval { Template::Alloy->$meth() } && $@, "Got an error on invalid methods ($@)");
$meth = 'foo&bar';
ok(! eval { Template::Alloy->$meth() } && $@, "Got an error on invalid methods ($@)");

###----------------------------------------------------------------###