diff options
author | Rafael Garcia-Suarez <rgarciasuarez@gmail.com> | 2008-01-04 15:47:48 +0000 |
---|---|---|
committer | Rafael Garcia-Suarez <rgarciasuarez@gmail.com> | 2008-01-04 15:47:48 +0000 |
commit | e4594d660ccfacc30d873d9cfc645abb4f26b9df (patch) | |
tree | 77014b747c6fd3782e08528da6119db768451fc6 /lib/SelfLoader/t | |
parent | d75c0fe73b99eda1eea10ae83f66640c4a47d64c (diff) | |
download | perl-e4594d660ccfacc30d873d9cfc645abb4f26b9df.tar.gz |
Move the SelfLoader test files in their own subdirectory
p4raw-id: //depot/perl@32829
Diffstat (limited to 'lib/SelfLoader/t')
-rwxr-xr-x | lib/SelfLoader/t/01SelfLoader.t | 216 | ||||
-rw-r--r-- | lib/SelfLoader/t/02SelfLoader-buggy.t | 48 |
2 files changed, 264 insertions, 0 deletions
diff --git a/lib/SelfLoader/t/01SelfLoader.t b/lib/SelfLoader/t/01SelfLoader.t new file mode 100755 index 0000000000..feadd3d1dc --- /dev/null +++ b/lib/SelfLoader/t/01SelfLoader.t @@ -0,0 +1,216 @@ +#!./perl + +BEGIN { + chdir 't' if -d 't'; + $dir = "self-$$"; + $sep = "/"; + + if ($^O eq 'MacOS') { + $dir = ":" . $dir; + $sep = ":"; + } + + @INC = $dir; + push @INC, '../lib'; + + print "1..20\n"; + + # First we must set up some selfloader files + mkdir $dir, 0755 or die "Can't mkdir $dir: $!"; + + open(FOO, ">$dir${sep}Foo.pm") or die; + print FOO <<'EOT'; +package Foo; +use SelfLoader; + +sub new { bless {}, shift } +sub foo; +sub bar; +sub bazmarkhianish; +sub a; +sub never; # declared but definition should never be read +1; +__DATA__ + +sub foo { shift; shift || "foo" }; + +sub bar { shift; shift || "bar" } + +sub bazmarkhianish { shift; shift || "baz" } + +package sheep; +sub bleat { shift; shift || "baa" } +__END__ +sub never { die "D'oh" } +EOT + + close(FOO); + + open(BAR, ">$dir${sep}Bar.pm") or die; + print BAR <<'EOT'; +package Bar; +use SelfLoader; + +@ISA = 'Baz'; + +sub new { bless {}, shift } +sub a; +sub with_whitespace_in_front; + +1; +__DATA__ + +sub a { 'a Bar'; } +sub b { 'b Bar' } + + sub with_whitespace_in_front { + "with_whitespace_in_front Bar" +} + +__END__ DATA +sub never { die "D'oh" } +EOT + + close(BAR); +}; + + +package Baz; + +sub a { 'a Baz' } +sub b { 'b Baz' } +sub c { 'c Baz' } + + +package main; +use Foo; +use Bar; + +$foo = new Foo; + +print "not " unless $foo->foo eq 'foo'; # selfloaded first time +print "ok 1\n"; + +print "not " unless $foo->foo eq 'foo'; # regular call +print "ok 2\n"; + +# Try an undefined method +eval { + $foo->will_fail; +}; +if ($@ =~ /^Undefined subroutine/) { + print "ok 3\n"; +} else { + print "not ok 3 $@\n"; +} + +# Used to be trouble with this +eval { + my $foo = new Foo; + die "oops"; +}; +if ($@ =~ /oops/) { + print "ok 4\n"; +} else { + print "not ok 4 $@\n"; +} + +# Pass regular expression variable to autoloaded function. This used +# to go wrong in AutoLoader because it used regular expressions to generate +# autoloaded filename. +"foo" =~ /(\w+)/; +print "not " unless $1 eq 'foo'; +print "ok 5\n"; + +print "not " unless $foo->bar($1) eq 'foo'; +print "ok 6\n"; + +print "not " unless $foo->bar($1) eq 'foo'; +print "ok 7\n"; + +print "not " unless $foo->bazmarkhianish($1) eq 'foo'; +print "ok 8\n"; + +print "not " unless $foo->bazmarkhianish($1) eq 'foo'; +print "ok 9\n"; + +# Check nested packages inside __DATA__ +print "not " unless sheep::bleat() eq 'baa'; +print "ok 10\n"; + +# Now check inheritance: + +$bar = new Bar; + +# Before anything is SelfLoaded there is no declaration of Foo::b so we should +# get Baz::b +print "not " unless $bar->b() eq 'b Baz'; +print "ok 11\n"; + +# There is no Bar::c so we should get Baz::c +print "not " unless $bar->c() eq 'c Baz'; +print "ok 12\n"; + +# check that subs with whitespace in front work +print "not " unless $bar->with_whitespace_in_front() eq 'with_whitespace_in_front Bar'; +print "ok 13\n"; + +# This selfloads Bar::a because it is stubbed. It also stubs Bar::b as a side +# effect +print "not " unless $bar->a() eq 'a Bar'; +print "ok 14\n"; + +print "not " unless $bar->b() eq 'b Bar'; +print "ok 15\n"; + +print "not " unless $bar->c() eq 'c Baz'; +print "ok 16\n"; + + + +# Check that __END__ is honoured +# Try an subroutine that should never be noticed by selfloader +eval { + $foo->never; +}; +if ($@ =~ /^Undefined subroutine/) { + print "ok 17\n"; +} else { + print "not ok 17 $@\n"; +} + +# Try to read from the data file handle +my $foodata = <Foo::DATA>; +close Foo::DATA; +if (defined $foodata) { + print "not ok 18 # $foodata\n"; +} else { + print "ok 18\n"; +} + +# Check that __END__ DATA is honoured +# Try an subroutine that should never be noticed by selfloader +eval { + $bar->never; +}; +if ($@ =~ /^Undefined subroutine/) { + print "ok 19\n"; +} else { + print "not ok 19 $@\n"; +} + +# Try to read from the data file handle +my $bardata = <Bar::DATA>; +close Bar::DATA; +if ($bardata ne "sub never { die \"D'oh\" }\n") { + print "not ok 20 # $bardata\n"; +} else { + print "ok 20\n"; +} + +# cleanup +END { +return unless $dir && -d $dir; +unlink "$dir${sep}Foo.pm", "$dir${sep}Bar.pm"; +rmdir "$dir"; +} diff --git a/lib/SelfLoader/t/02SelfLoader-buggy.t b/lib/SelfLoader/t/02SelfLoader-buggy.t new file mode 100644 index 0000000000..02da93cee4 --- /dev/null +++ b/lib/SelfLoader/t/02SelfLoader-buggy.t @@ -0,0 +1,48 @@ +#!./perl + +BEGIN { + if( $ENV{PERL_CORE} ) { + chdir 't' if -d 't'; + @INC = '../lib'; + } +} + +use SelfLoader; +print "1..1\n"; + +# this script checks that errors on self-loaded +# subroutines that affect $@ are reported + +eval { buggy(); }; +unless ($@ =~ /^syntax error/) { + print "not "; +} +print "ok 1 - syntax errors are reported\n"; + +__END__ + +sub buggy +{ + +>*; +} + + +# RT 40216 +# +# by Bo Lindbergh <blgl@hagernas.com>, at Aug 22, 2006 5:42 PM +# +# In the example below, there's a syntax error in the selfloaded +# code for main::buggy. When the eval fails, SelfLoader::AUTOLOAD +# tries to report this with "croak $@;". Unfortunately, +# SelfLoader::croak does "require Carp;" without protecting $@, +# which gets clobbered. The program then dies with the +# uninformative message " at ./example line 3". +# +# #! /usr/local/bin/perl +# use SelfLoader; +# buggy(); +# __END__ +# sub buggy +# { +# +>*; +# } |