The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!perl -w

use strict;
use FindBin qw($Bin);
use File::Spec::Functions qw(catdir catfile);
use Test::More tests => 10;
use HTML::Mason::Interp;

BEGIN { use_ok('MasonX::Interp::WithCallbacks') }

my $key = 'myCallbackTester';
my $cbs = [];

##############################################################################
# Set up callback functions.
##############################################################################
# Callback to test the value of the package key attribute.
sub test_pkg_key {
    my $cb = shift;
    my $params = $cb->params;
    $params->{result} .= $cb->pkg_key;
}

push @$cbs, { pkg_key => $key,
              cb_key  => 'test_pkg_key',
              cb      => \&test_pkg_key
            },
            { pkg_key => $key . '_more',
              cb_key  => 'test_pkg_key',
              cb      => \&test_pkg_key
            };

##############################################################################
# Callback to test the value returned by the class_key method.
sub test_class_key {
    my $cb = shift;
    my $params = $cb->params;
    $params->{result} .= $cb->class_key;
}
push @$cbs, { pkg_key => $key,
              cb_key  => 'test_class_key',
              cb      => \&test_class_key
            },
            { pkg_key => $key. '_more',
              cb_key  => 'test_class_key',
              cb      => \&test_class_key
            };

##############################################################################
# Callback to test the value of the trigger key attribute.
sub test_trigger_key {
    my $cb = shift;
    my $params = $cb->params;
    $params->{result} .= $cb->trigger_key;
}

push @$cbs, { pkg_key => $key,
              cb_key  => 'test_trigger_key',
              cb      => \&test_trigger_key
            },
            { pkg_key => $key . '_more',
              cb_key  => 'test_trigger_key',
              cb      => \&test_trigger_key
            };

##############################################################################
# Set up the Interp object.
##############################################################################
my $outbuf;
ok( my $interp = MasonX::Interp::WithCallbacks->new
    ( comp_root  => catdir($Bin, qw(htdocs)),
      callbacks  => $cbs,
      out_method => \$outbuf ),
    "Construct interp object" );
isa_ok($interp, 'MasonX::Interp::WithCallbacks');
isa_ok($interp, 'HTML::Mason::Interp');

my $comp = '/dhandler';

##############################################################################
# Test the callbacks themselves.
##############################################################################
# Test the package key.
$interp->exec($comp, "$key|test_pkg_key_cb" => 1 );
is( $outbuf, $key, "Check pkg key" );
$outbuf = '';

# And multiple package keys.
$interp->exec($comp,
              "$key|test_pkg_key_cb1" => 1,
              "$key\_more|test_pkg_key_cb2" => 1,
              "$key|test_pkg_key_cb3" => 1,
             );

is( $outbuf, "$key$key\_more$key", "Check pkg key again" );
$outbuf = '';

##############################################################################
# Test the class key.
$interp->exec($comp, "$key|test_class_key_cb" => 1 );
is( $outbuf, $key, "Check class key" );
$outbuf = '';

# And multiple class keys.
$interp->exec($comp, "$key|test_class_key_cb1" => 1,
            "$key\_more|test_class_key_cb2" => 1,
            "$key|test_class_key_cb3" => 1,
          );
is( $outbuf, "$key$key\_more$key", "Check class key again" );
$outbuf = '';

##############################################################################
# Test the trigger key.
$interp->exec($comp, "$key|test_trigger_key_cb" => 1 );
is( $outbuf, "$key|test_trigger_key_cb", "Check trigger key" );
$outbuf = '';

# And multiple trigger keys.
$interp->exec($comp, "$key|test_trigger_key_cb1" => 1,
            "$key\_more|test_trigger_key_cb2" => 1,
            "$key|test_trigger_key_cb3" => 1,);

is( $outbuf, "$key|test_trigger_key_cb1$key\_more|" .
    "test_trigger_key_cb2$key|test_trigger_key_cb3",
    "Check trigger key again" );
$outbuf = '';

1;
__END__