From Code to Community: Sponsoring The Perl and Raku Conference 2025 Learn more

#!perl -T
use strict;
=head1 TEST PURPOSE
These tests exercise the "into" and "into_level" special arguments to the built
exporter.
=cut
use Test::More tests => 14;
BEGIN {
use_ok('Sub::Exporter');
}
BEGIN {
use strict;
use warnings;
use Sub::Exporter -setup => {
exports => [ qw(A B) ],
groups => {
default => [ ':all' ],
a => [ 'A' ],
b => [ 'B' ]
}
};
sub A { 'A' }
sub B { 'B' }
1;
}
BEGIN {
use strict;
use warnings;
use Sub::Exporter -setup => {
exports => [ qw(C) ],
into_level => 1,
};
sub C { 'C' }
1;
}
BEGIN {
use strict;
use warnings;
use Sub::Exporter -setup => {
exports => [ qw(foo) ],
into => 'Test::SubExport::DEFAULT_INTO',
};
sub foo { 'foo' }
1;
}
BEGIN {
use strict;
use warnings;
sub import {
my $package = shift;
my $caller = caller(0);
Test::SubExport::FROM->import( { into => $caller }, @_ );
}
1;
}
BEGIN {
use strict;
use warnings;
sub import {
my $package = shift;
Test::SubExport::FROM->import( { into_level => 1 }, @_ );
}
1;
}
BEGIN {
use strict;
use warnings;
sub import {
my $package = shift;
Test::SubExport::HAS_DEFAULT_INTO_LEVEL->import(@_);
}
1;
}
Test::SubExport::INTO->import('A');
main::can_ok(__PACKAGE__, 'A' );
main::cmp_ok(
__PACKAGE__->can('A'), '==', Test::SubExport::FROM->can('A'),
'sub A was exported'
);
Test::SubExport::INTO->import(':all');
main::can_ok(__PACKAGE__, 'A', 'B' );
main::cmp_ok(
__PACKAGE__->can('A'), '==', Test::SubExport::FROM->can('A'),
'sub A was exported'
);
main::cmp_ok(
__PACKAGE__->can('B'), '==', Test::SubExport::FROM->can('B'),
'sub B was exported'
);
Test::SubExport::LEVEL->import(':all');
main::can_ok(__PACKAGE__, 'A', 'B' );
main::cmp_ok(
__PACKAGE__->can('A'), '==', Test::SubExport::FROM->can('A'),
'sub A was exported'
);
main::cmp_ok(
__PACKAGE__->can('B'), '==', Test::SubExport::FROM->can('B'),
'sub B was exported'
);
Test::SubExport::DEFAULT_LEVEL->import(':all');
main::can_ok(__PACKAGE__, 'C');
main::cmp_ok(
__PACKAGE__->can('C'),
'==',
Test::SubExport::HAS_DEFAULT_INTO_LEVEL->can('C'),
'sub C was exported'
);
main::is(
Test::SubExport::DEFAULT_INTO->can('foo'),
undef,
"before import, 'default into' target can't foo",
);
Test::SubExport::HAS_DEFAULT_INTO->import('-all');
main::is(
__PACKAGE__->can('foo'),
undef,
"after import, calling package can't foo",
);
main::is(
Test::SubExport::DEFAULT_INTO->can('foo'),
\&Test::SubExport::HAS_DEFAULT_INTO::foo,
"after import, calling package can't foo",
);