Re: new C3 MRO patch
[p5sagit/p5-mst-13.2.git] / t / mro / basic_03_c3.t
1 #!./perl
2
3 use strict;
4 use warnings;
5 BEGIN {
6     unless (-d 'blib') {
7         chdir 't' if -d 't';
8         @INC = '../lib';
9     }
10 }
11
12 use Test::More tests => 4;
13
14 =pod
15
16 This example is take from: http://www.python.org/2.3/mro.html
17
18 "My second example"
19 class O: pass
20 class F(O): pass
21 class E(O): pass
22 class D(O): pass
23 class C(D,F): pass
24 class B(E,D): pass
25 class A(B,C): pass
26
27                            6
28                           ---
29 Level 3                  | O |
30                        /  ---  \
31                       /    |    \
32                      /     |     \
33                     /      |      \
34                   ---     ---    ---
35 Level 2        2 | E | 4 | D |  | F | 5
36                   ---     ---    ---
37                    \      / \     /
38                     \    /   \   /
39                      \  /     \ /
40                       ---     ---
41 Level 1            1 | B |   | C | 3
42                       ---     ---
43                        \       /
44                         \     /
45                           ---
46 Level 0                0 | A |
47                           ---
48
49 >>> A.mro()
50 (<class '__main__.A'>, <class '__main__.B'>, <class '__main__.E'>,
51 <class '__main__.C'>, <class '__main__.D'>, <class '__main__.F'>,
52 <type 'object'>)
53
54 =cut
55
56 {
57     package Test::O;
58     use mro 'c3';
59     
60     sub O_or_D { 'Test::O' }
61     sub O_or_F { 'Test::O' }    
62     
63     package Test::F;
64     use base 'Test::O';
65     use mro 'c3';
66     
67     sub O_or_F { 'Test::F' }    
68     
69     package Test::E;
70     use base 'Test::O';
71     use mro 'c3';
72         
73     package Test::D;
74     use base 'Test::O';    
75     use mro 'c3';
76     
77     sub O_or_D { 'Test::D' }
78     sub C_or_D { 'Test::D' }
79         
80     package Test::C;
81     use base ('Test::D', 'Test::F');
82     use mro 'c3';    
83
84     sub C_or_D { 'Test::C' }
85     
86     package Test::B;
87     use base ('Test::E', 'Test::D');
88     use mro 'c3';
89         
90     package Test::A;
91     use base ('Test::B', 'Test::C');
92     use mro 'c3';
93 }
94
95 is_deeply(
96     mro::get_linear_isa('Test::A'),
97     [ qw(Test::A Test::B Test::E Test::C Test::D Test::F Test::O) ],
98     '... got the right MRO for Test::A');      
99     
100 is(Test::A->O_or_D, 'Test::D', '... got the right method dispatch');    
101 is(Test::A->O_or_F, 'Test::F', '... got the right method dispatch');   
102
103 # NOTE: 
104 # this test is particularly interesting because the p5 dispatch
105 # would actually call Test::D before Test::C and Test::D is a
106 # subclass of Test::C 
107 is(Test::A->C_or_D, 'Test::C', '... got the right method dispatch');