X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FExporter.t;h=c90a4608d9dad11d51aed0c907c40c3cdf83bce8;hb=e68ec53fb89aea41859fe8c109fe9b03a3599284;hp=a0028feb238c93e54e87cb110ad12de9c41b0866;hpb=b695f709e8a342e35e482b0437eb6cdacdc58b6b;p=p5sagit%2Fp5-mst-13.2.git diff --git a/lib/Exporter.t b/lib/Exporter.t index a0028fe..c90a460 100644 --- a/lib/Exporter.t +++ b/lib/Exporter.t @@ -1,29 +1,29 @@ -#!./perl +#!./perl -w BEGIN { chdir 't' if -d 't'; @INC = '../lib'; } -# Utility testing functions. -my $test_num = 1; +# Can't use Test::Simple/More, they depend on Exporter. +my $test = 1; sub ok ($;$) { - my($test, $name) = @_; - print "not " unless $test; - print "ok $test_num"; - print " - $name" if (defined $name && ! $^O eq 'VMS'); - print "\n"; - $test_num++; + my($ok, $name) = @_; + + # You have to do it this way or VMS will get confused. + printf "%sok %d%s\n", ($ok ? '' : 'not '), $test, + (defined $name ? " - $name" : ''); + + printf "# Failed test at line %d\n", (caller)[2] unless $ok; + + $test++; + return $ok; } -my $loaded; -BEGIN { $| = 1; $^W = 1; } -END {print "not ok $test_num\n" unless $loaded;} -print "1..$Total_tests\n"; -use Exporter; -$loaded = 1; -ok(1, 'compile'); +print "1..28\n"; +require Exporter; +ok( 1, 'Exporter compiled' ); BEGIN { @@ -35,7 +35,6 @@ BEGIN { ); } -BEGIN { $Total_tests = 14 + @Exporter_Methods } package Testing; require Exporter; @@ -51,7 +50,7 @@ foreach my $meth (@::Exporter_Methods) { That => [qw(Above the @wailing)], tray => [qw(Fasten $seatbelt)], ); -@EXPORT = qw(lifejacket); +@EXPORT = qw(lifejacket is); @EXPORT_OK = qw(under &your $seat); $VERSION = '1.05'; @@ -73,8 +72,10 @@ $seat = 'seat'; @wailing = qw(AHHHHHH); %left = ( left => "right" ); +BEGIN {*is = \&Is}; +sub Is { 'Is' }; -Exporter::export_ok_tags; +Exporter::export_ok_tags(); my %tags = map { $_ => 1 } map { @$_ } values %EXPORT_TAGS; my %exportok = map { $_ => 1 } @EXPORT_OK; @@ -90,6 +91,24 @@ Testing->import; ::ok( defined &lifejacket, 'simple import' ); +my $got = eval {&lifejacket}; +::ok ( $@ eq "", 'check we can call the imported subroutine') + or print STDERR "# \$\@ is $@\n"; +::ok ( $got eq 'lifejacket', 'and that it gave the correct result') + or print STDERR "# expected 'lifejacket', got " . + (defined $got ? "'$got'" : "undef") . "\n"; + +# The string eval is important. It stops $Foo::{is} existing when +# Testing->import is called. +::ok( eval "defined &is", + "Import a subroutine where exporter must create the typeglob" ); +$got = eval "&is"; +::ok ( $@ eq "", 'check we can call the imported autoloaded subroutine') + or chomp ($@), print STDERR "# \$\@ is $@\n"; +::ok ( $got eq 'Is', 'and that it gave the correct result') + or print STDERR "# expected 'Is', got " . + (defined $got ? "'$got'" : "undef") . "\n"; + package Bar; my @imports = qw($seatbelt &Above stuff @wailing %left); @@ -143,3 +162,55 @@ package Yet::More::Testing; $VERSION = 0; eval { Yet::More::Testing->require_version(10); 1 }; ::ok($@ !~ /\(undef\)/, 'require_version(10) and $VERSION = 0'); + + +my $warnings; +BEGIN { + $SIG{__WARN__} = sub { $warnings = join '', @_ }; + package Testing::Unused::Vars; + @ISA = qw(Exporter); + @EXPORT = qw(this $TODO that); + + package Foo; + Testing::Unused::Vars->import; +} + +::ok( !$warnings, 'Unused variables can be exported without warning' ) || + print "# $warnings\n"; + +package Moving::Target; +@ISA = qw(Exporter); +@EXPORT_OK = qw (foo); + +sub foo {"This is foo"}; +sub bar {"This is bar"}; + +package Moving::Target::Test; + +Moving::Target->import ('foo'); + +::ok (foo() eq "This is foo", "imported foo before EXPORT_OK changed"); + +push @Moving::Target::EXPORT_OK, 'bar'; + +Moving::Target->import ('bar'); + +::ok (bar() eq "This is bar", "imported bar after EXPORT_OK changed"); + +package The::Import; + +use Exporter 'import'; + +eval { import() }; +::ok(\&import == \&Exporter::import, "imported the import routine"); + +@EXPORT = qw( wibble ); +sub wibble {return "wobble"}; + +package Use::The::Import; + +The::Import->import; + +my $val = eval { wibble() }; +::ok($val eq "wobble", "exported importer worked"); +