1#!./perl
2
3use strict;
4use warnings;
5use utf8;
6use open qw( :utf8 :std );
7
8require q(./test.pl); plan(tests => 4);
9
10=pod
11
12This example is take from: http://www.python.org/2.3/mro.html
13
14"My second example"
15class O: pass
16class F(O): pass
17class E(O): pass
18class D(O): pass
19class C(D,F): pass
20class B(E,D): pass
21class A(B,C): pass
22
23                           6
24                          ---
25Level 3                  | O |
26                       /  ---  \
27                      /    |    \
28                     /     |     \
29                    /      |      \
30                  ---     ---    ---
31Level 2        2 | E | 4 | D |  | F | 5
32                  ---     ---    ---
33                   \      / \     /
34                    \    /   \   /
35                     \  /     \ /
36                      ---     ---
37Level 1            1 | B |   | C | 3
38                      ---     ---
39                       \       /
40                        \     /
41                          ---
42Level 0                0 | A |
43                          ---
44
45>>> A.mro()
46(<class '__main__.A'>, <class '__main__.B'>, <class '__main__.E'>,
47<class '__main__.C'>, <class '__main__.D'>, <class '__main__.F'>,
48<type 'object'>)
49
50=cut
51
52{
53    package 텟ţ::ᴼ;
54    use mro 'c3';
55
56    sub_or_Ḋ { '텟ţ::ᴼ' }
57    sub_or_Ḟ { '텟ţ::ᴼ' }
58
59    package 텟ţ::Ḟ;
60    use base '텟ţ::ᴼ';
61    use mro 'c3';
62
63    sub_or_Ḟ { '텟ţ::Ḟ' }
64
65    package 텟ţ::ऍ;
66    use base '텟ţ::ᴼ';
67    use mro 'c3';
68
69    package 텟ţ::Ḋ;
70    use base '텟ţ::ᴼ';
71    use mro 'c3';
72
73    sub_or_Ḋ { '텟ţ::Ḋ' }
74    sub ƈ_or_Ḋ { '텟ţ::Ḋ' }
75
76    package 텟ţ::ƈ;
77    use base ('텟ţ::Ḋ', '텟ţ::Ḟ');
78    use mro 'c3';
79
80    sub ƈ_or_Ḋ { '텟ţ::ƈ' }
81
82    package 텟ţ::ᛒ;
83    use base ('텟ţ::ऍ', '텟ţ::Ḋ');
84    use mro 'c3';
85
86    package 텟ţ::ଅ;
87    use base ('텟ţ::ᛒ', '텟ţ::ƈ');
88    use mro 'c3';
89}
90
91ok(eq_array(
92    mro::get_linear_isa('텟ţ::ଅ'),
93    [ qw(텟ţ::ଅ 텟ţ::ᛒ 텟ţ::ऍ 텟ţ::ƈ 텟ţ::Ḋ 텟ţ::Ḟ 텟ţ::ᴼ) ]
94), '... got the right MRO for 텟ţ::ଅ');
95
96is(텟ţ::ଅ->ᴼ_or_Ḋ, '텟ţ::Ḋ', '... got the right method dispatch');
97is(텟ţ::ଅ->ᴼ_or_Ḟ, '텟ţ::Ḟ', '... got the right method dispatch');
98
99# NOTE:
100# this test is particularly interesting because the p5 dispatch
101# would actually call 텟ţ::Ḋ before 텟ţ::ƈ and 텟ţ::Ḋ is a
102# subclass of 텟ţ::ƈ
103is(텟ţ::ଅ->ƈ_or_Ḋ, '텟ţ::ƈ', '... got the right method dispatch');
104