This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Get the "cv" from the "gv" once, and be more careful so that we can
[perl5.git] / lib / NEXT / t / next.t
CommitLineData
13021a80
JH
1BEGIN {
2 if ($ENV{PERL_CORE}) {
3 chdir('t') if -d 't';
4 @INC = qw(../lib);
5 }
6}
e4783b1c 7
874ad44d 8BEGIN { print "1..26\n"; }
e4783b1c
JH
9
10use NEXT;
11
12print "ok 1\n";
13
14package A;
15sub A::method { return ( 3, $_[0]->NEXT::method() ) }
16sub A::DESTROY { $_[0]->NEXT::DESTROY() }
874ad44d 17sub A::evaled { eval { $_[0]->NEXT::evaled(); return 'evaled' } }
e4783b1c
JH
18
19package B;
20use base qw( A );
55a1c97c
JH
21sub B::AUTOLOAD { return ( 9, $_[0]->NEXT::AUTOLOAD() )
22 if $AUTOLOAD =~ /.*(missing_method|secondary)/ }
e4783b1c
JH
23sub B::DESTROY { $_[0]->NEXT::DESTROY() }
24
25package C;
874ad44d 26sub C::DESTROY { print "ok 24\n"; $_[0]->NEXT::DESTROY() }
e4783b1c
JH
27
28package D;
29@D::ISA = qw( B C E );
30sub D::method { return ( 2, $_[0]->NEXT::method() ) }
31sub D::AUTOLOAD { return ( 8, $_[0]->NEXT::AUTOLOAD() ) }
874ad44d 32sub D::DESTROY { print "ok 23\n"; $_[0]->NEXT::DESTROY() }
e4783b1c 33sub D::oops { $_[0]->NEXT::method() }
55a1c97c 34sub D::secondary { return ( 17, 18, map { $_+10 } $_[0]->NEXT::secondary() ) }
e4783b1c
JH
35
36package E;
37@E::ISA = qw( F G );
38sub E::method { return ( 4, $_[0]->NEXT::method(), $_[0]->NEXT::method() ) }
55a1c97c
JH
39sub E::AUTOLOAD { return ( 10, $_[0]->NEXT::AUTOLOAD() )
40 if $AUTOLOAD =~ /.*(missing_method|secondary)/ }
874ad44d 41sub E::DESTROY { print "ok 25\n"; $_[0]->NEXT::DESTROY() }
e4783b1c
JH
42
43package F;
44sub F::method { return ( 5 ) }
55a1c97c 45sub F::AUTOLOAD { return ( 11 ) if $AUTOLOAD =~ /.*(missing_method|secondary)/ }
874ad44d 46sub F::DESTROY { print "ok 26\n" }
e4783b1c
JH
47
48package G;
49sub G::method { return ( 6 ) }
50sub G::AUTOLOAD { print "not "; return }
874ad44d 51sub G::DESTROY { print "not ok 22"; return }
e4783b1c
JH
52
53package main;
54
55my $obj = bless {}, "D";
56
57my @vals;
58
59# TEST NORMAL REDISPATCH (ok 2..6)
60@vals = $obj->method();
61print map "ok $_\n", @vals;
62
63# RETEST NORMAL REDISPATCH SHOULD BE THE SAME (ok 7)
64@vals = $obj->method();
65print "not " unless join("", @vals) == "23456";
66print "ok 7\n";
67
68# TEST AUTOLOAD REDISPATCH (ok 8..11)
69@vals = $obj->missing_method();
70print map "ok $_\n", @vals;
71
72# NAMED METHOD CAN'T REDISPATCH TO NAMED METHOD OF DIFFERENT NAME (ok 12)
73eval { $obj->oops() } && print "not ";
74print "ok 12\n";
75
76# AUTOLOAD'ED METHOD CAN'T REDISPATCH TO NAMED METHOD (ok 13)
55a1c97c
JH
77
78eval {
79 local *C::AUTOLOAD = sub { $_[0]->NEXT::method() };
80 *C::AUTOLOAD = *C::AUTOLOAD;
81 eval { $obj->missing_method(); } && print "not ";
e4783b1c 82};
e4783b1c
JH
83print "ok 13\n";
84
85# NAMED METHOD CAN'T REDISPATCH TO AUTOLOAD'ED METHOD (ok 14)
55a1c97c
JH
86eval {
87 *C::method = sub{ $_[0]->NEXT::AUTOLOAD() };
88 *C::method = *C::method;
89 eval { $obj->method(); } && print "not ";
e4783b1c 90};
e4783b1c
JH
91print "ok 14\n";
92
93# BASE CLASS METHODS ONLY REDISPATCHED WITHIN HIERARCHY (ok 15..16)
94my $ob2 = bless {}, "B";
95@val = $ob2->method();
96print "not " unless @val==1 && $val[0]==3;
97print "ok 15\n";
98
99@val = $ob2->missing_method();
100print "not " unless @val==1 && $val[0]==9;
101print "ok 16\n";
102
55a1c97c
JH
103# TEST SECONDARY AUTOLOAD REDISPATCH (ok 17..21)
104@vals = $obj->secondary();
105print map "ok $_\n", @vals;
106
874ad44d
DR
107# TEST HANDLING OF NEXT:: INSIDE EVAL (22)
108eval {
109 $obj->evaled;
110 $@ && print "not ";
111};
112print "ok 22\n";
113
114# CAN REDISPATCH DESTRUCTORS (ok 23..26)