Don't expect ASCII ordering.
[p5sagit/p5-mst-13.2.git] / lib / NEXT / test.pl
CommitLineData
e4783b1c 1#! /usr/local/bin/perl -w
2
55a1c97c 3BEGIN { print "1..25\n"; }
e4783b1c 4
5use NEXT;
6
7print "ok 1\n";
8
9package A;
10sub A::method { return ( 3, $_[0]->NEXT::method() ) }
11sub A::DESTROY { $_[0]->NEXT::DESTROY() }
12
13package B;
14use base qw( A );
55a1c97c 15sub B::AUTOLOAD { return ( 9, $_[0]->NEXT::AUTOLOAD() )
16 if $AUTOLOAD =~ /.*(missing_method|secondary)/ }
e4783b1c 17sub B::DESTROY { $_[0]->NEXT::DESTROY() }
18
19package C;
55a1c97c 20sub C::DESTROY { print "ok 23\n"; $_[0]->NEXT::DESTROY() }
e4783b1c 21
22package D;
23@D::ISA = qw( B C E );
24sub D::method { return ( 2, $_[0]->NEXT::method() ) }
25sub D::AUTOLOAD { return ( 8, $_[0]->NEXT::AUTOLOAD() ) }
55a1c97c 26sub D::DESTROY { print "ok 22\n"; $_[0]->NEXT::DESTROY() }
e4783b1c 27sub D::oops { $_[0]->NEXT::method() }
55a1c97c 28sub D::secondary { return ( 17, 18, map { $_+10 } $_[0]->NEXT::secondary() ) }
e4783b1c 29
30package E;
31@E::ISA = qw( F G );
32sub E::method { return ( 4, $_[0]->NEXT::method(), $_[0]->NEXT::method() ) }
55a1c97c 33sub E::AUTOLOAD { return ( 10, $_[0]->NEXT::AUTOLOAD() )
34 if $AUTOLOAD =~ /.*(missing_method|secondary)/ }
35sub E::DESTROY { print "ok 24\n"; $_[0]->NEXT::DESTROY() }
e4783b1c 36
37package F;
38sub F::method { return ( 5 ) }
55a1c97c 39sub F::AUTOLOAD { return ( 11 ) if $AUTOLOAD =~ /.*(missing_method|secondary)/ }
40sub F::DESTROY { print "ok 25\n" }
e4783b1c 41
42package G;
43sub G::method { return ( 6 ) }
44sub G::AUTOLOAD { print "not "; return }
45sub G::DESTROY { print "not ok 21"; return }
46
47package main;
48
49my $obj = bless {}, "D";
50
51my @vals;
52
53# TEST NORMAL REDISPATCH (ok 2..6)
54@vals = $obj->method();
55print map "ok $_\n", @vals;
56
57# RETEST NORMAL REDISPATCH SHOULD BE THE SAME (ok 7)
58@vals = $obj->method();
59print "not " unless join("", @vals) == "23456";
60print "ok 7\n";
61
62# TEST AUTOLOAD REDISPATCH (ok 8..11)
63@vals = $obj->missing_method();
64print map "ok $_\n", @vals;
65
66# NAMED METHOD CAN'T REDISPATCH TO NAMED METHOD OF DIFFERENT NAME (ok 12)
67eval { $obj->oops() } && print "not ";
68print "ok 12\n";
69
70# AUTOLOAD'ED METHOD CAN'T REDISPATCH TO NAMED METHOD (ok 13)
55a1c97c 71
72eval {
73 local *C::AUTOLOAD = sub { $_[0]->NEXT::method() };
74 *C::AUTOLOAD = *C::AUTOLOAD;
75 eval { $obj->missing_method(); } && print "not ";
e4783b1c 76};
e4783b1c 77print "ok 13\n";
78
79# NAMED METHOD CAN'T REDISPATCH TO AUTOLOAD'ED METHOD (ok 14)
55a1c97c 80eval {
81 *C::method = sub{ $_[0]->NEXT::AUTOLOAD() };
82 *C::method = *C::method;
83 eval { $obj->method(); } && print "not ";
e4783b1c 84};
e4783b1c 85print "ok 14\n";
86
87# BASE CLASS METHODS ONLY REDISPATCHED WITHIN HIERARCHY (ok 15..16)
88my $ob2 = bless {}, "B";
89@val = $ob2->method();
90print "not " unless @val==1 && $val[0]==3;
91print "ok 15\n";
92
93@val = $ob2->missing_method();
94print "not " unless @val==1 && $val[0]==9;
95print "ok 16\n";
96
55a1c97c 97# TEST SECONDARY AUTOLOAD REDISPATCH (ok 17..21)
98@vals = $obj->secondary();
99print map "ok $_\n", @vals;
100
101# CAN REDISPATCH DESTRUCTORS (ok 22..25)