* src/pmc/scalar.pmc:
[parrot.git] / t / pmc / object-mro.t
blobd09d70e42023e548d764f6e23329457ae3a0852a
1 #! perl
2 # Copyright (C) 2001-2005, The Perl Foundation.
3 # $Id$
5 use strict;
6 use warnings;
7 use lib qw( . lib ../lib ../../lib );
8 use Test::More;
9 use Parrot::Test tests => 6;
11 =head1 NAME
13 t/pmc/object-mro.t - Object Methods Resolution Order
15 =head1 SYNOPSIS
17     % prove t/pmc/object-mro.t
19 =head1 DESCRIPTION
21 These are tests for the C3 MRO order
23 =cut
25 pir_output_is( <<'CODE', <<'OUTPUT', "print mro diamond" );
27 # A   B A   E
28 #  \ /   \ /
29 #   C     D
30 #    \   /
31 #     \ /
32 #      F
33 .sub main :main
34     .local pmc A, B, C, D, E, F, m, p, it
35     newclass A, "A"
36     newclass B, "B"
37     subclass C, A, "C"
38     addparent C, B
40     subclass D, A, "D"
41     newclass E, "E"
42     addparent D, E
44     subclass F, C, "F"
45     addparent F, D
46     m = get_mro F
47     it = new .Iterator, m
48     it = 0
49 loop:
50     unless it goto ex
51     p = shift it
52     $S0 = classname p
53     print $S0
54     print ' '
55     goto loop
56 ex:
57     print 'G'
58     print_newline
59 .end
60 CODE
61 F C D A B E G
62 OUTPUT
64 pir_output_is( <<'CODE', <<'OUTPUT', "print mro 1" );
66 # example take from: http://www.python.org/2.3/mro.html
68 # class O: pass
69 # class F(O): pass
70 # class E(O): pass
71 # class D(O): pass
72 # class C(D,F): pass
73 # class B(D,E): pass
74 # class A(B,C): pass
76 #                           6
77 #                          ---
78 # Level 3                 | O |                  (more general)
79 #                       /  ---  \
80 #                      /    |    \                      |
81 #                     /     |     \                     |
82 #                    /      |      \                    |
83 #                   ---    ---    ---                   |
84 # Level 2        3 | D | 4| E |  | F | 5                |
85 #                   ---    ---    ---                   |
86 #                    \  \ _ /       |                   |
87 #                     \    / \ _    |                   |
88 #                      \  /      \  |                   |
89 #                       ---      ---                    |
90 # Level 1            1 | B |    | C | 2                 |
91 #                       ---      ---                    |
92 #                         \      /                      |
93 #                          \    /                      \ /
94 #                            ---
95 # Level 0                 0 | A |                (more specialized)
96 #                            ---
98 .sub main :main
99     .local pmc A, B, C, D, E, F, O
100     newclass O, "O"
101     subclass F, O, "F"
102     subclass E, O, "E"
103     subclass D, O, "D"
105     subclass C, D, "C"
106     addparent C, F
108     subclass B, D, "B"
109     addparent B, E
111     subclass A, B, "A"
112     addparent A, C
114     .local pmc m, it, p
116     m = get_mro A
117     it = new .Iterator, m
118     it = 0
119 loop:
120     unless it goto ex
121     p = shift it
122     $S0 = classname p
123     print $S0
124     print ' '
125     goto loop
127     print 'G'
128     print_newline
129 .end
130 CODE
131 A B C D E F O G
132 OUTPUT
134 pir_output_is( <<'CODE', <<'OUTPUT', "print mro 2" );
136 # example take from: http://www.python.org/2.3/mro.html
138 # class O: pass
139 # class F(O): pass
140 # class E(O): pass
141 # class D(O): pass
142 # class C(D,F): pass
143 # class B(E,D): pass
144 # class A(B,C): pass
146 #                            6
147 #                           ---
148 # Level 3                  | O |
149 #                        /  ---  \
150 #                       /    |    \
151 #                      /     |     \
152 #                     /      |      \
153 #                   ---     ---    ---
154 # Level 2        2 | E | 4 | D |  | F | 5
155 #                   ---     ---    ---
156 #                    \      / \     /
157 #                     \    /   \   /
158 #                      \  /     \ /
159 #                       ---     ---
160 # Level 1            1 | B |   | C | 3
161 #                       ---     ---
162 #                        \       /
163 #                         \     /
164 #                           ---
165 # Level 0                0 | A |
166 #                           ---
169 .sub main :main
170     .local pmc A, B, C, D, E, F, O
171     newclass O, "O"
172     subclass F, O, "F"
173     subclass E, O, "E"
174     subclass D, O, "D"
176     subclass C, D, "C"
177     addparent C, F
179     subclass B, E, "B"
180     addparent B, D
182     subclass A, B, "A"
183     addparent A, C
185     .local pmc m, it, p
187     m = get_mro A
188     it = new .Iterator, m
189     it = 0
190 loop:
191     unless it goto ex
192     p = shift it
193     $S0 = classname p
194     print $S0
195     print ' '
196     goto loop
198     print 'G'
199     print_newline
200 .end
201 CODE
202 A B E C D F O G
203 OUTPUT
205 pir_output_is( <<'CODE', <<'OUTPUT', "print mro 3" );
207 #    C
208 #   / \
209 #  /   \
210 # A     B
211 #  \   /
212 #   \ /
213 #    D
215 .sub main :main
216     .local pmc A, B, C, D
217     newclass C, "C"
218     subclass A, C, "A"
219     subclass B, C, "B"
220     subclass D, A, "D"
221     addparent D, B
223     .local pmc m, it, p
225     m = get_mro D
226     it = new .Iterator, m
227     it = 0
228 loop:
229     unless it goto ex
230     p = shift it
231     $S0 = classname p
232     print $S0
233     print ' '
234     goto loop
236     print 'G'
237     print_newline
238 .end
239 CODE
240 D A B C G
241 OUTPUT
243 pir_output_is( <<'CODE', <<'OUTPUT', "print mro 4" );
245 #        TestObject
246 #            ^
247 #            |
248 #         LifeForm
249 #          ^    ^
250 #         /      \
251 #    Sentient    BiPedal
252 #       ^          ^
253 #       |          |
254 #  Intelligent  Humanoid
255 #        ^        ^
256 #         \      /
257 #          Vulcan
259 # example taken from: L<http://gauss.gwydiondylan.org/books/drm/drm_50.html>
261 #  define class <sentient> (<life-form>) end class;
262 #  define class <bipedal> (<life-form>) end class;
263 #  define class <intelligent> (<sentient>) end class;
264 #  define class <humanoid> (<bipedal>) end class;
265 #  define class <vulcan> (<intelligent>, <humanoid>) end class;
267 .sub main :main
268     .local pmc TestObject, LifeForm, Sentient, BiPedal, Intelligent, Humanoid, Vulcan
270     newclass TestObject, "TestObject"
272     subclass LifeForm, TestObject, "LifeForm"
274     subclass Sentient, LifeForm, "Sentient"
275     subclass Intelligent, Sentient, "Intelligent"
277     subclass BiPedal, LifeForm, "BiPedal"
278     subclass Humanoid, BiPedal, "Humanoid"
280     subclass Vulcan, Intelligent, "Vulcan"
281     addparent Vulcan, Humanoid
283     .local pmc m, it, p
285     m = get_mro Vulcan
286     it = new .Iterator, m
287     it = 0
288 loop:
289     unless it goto ex
290     p = shift it
291     $S0 = classname p
292     print $S0
293     print ' '
294     goto loop
296     print 'R'
297     print_newline
298 .end
299 CODE
300 Vulcan Intelligent Sentient Humanoid BiPedal LifeForm TestObject R
301 OUTPUT
303 # ... now some tests which fail to compose the class
305 pir_output_like( <<'CODE', <<'OUTPUT', "mro error 1" );
307 # example take from: http://www.python.org/2.3/mro.html
309 # "Serious order disagreement" # From Guido
310 # class O: pass
311 # class X(O): pass
312 # class Y(O): pass
313 # class A(X,Y): pass
314 # class B(Y,X): pass
315 # try:
316 #     class Z(A,B): pass # creates Z(A,B) in Python 2.2
317 # except TypeError:
318 #     pass # Z(A,B) cannot be created in Python 2.3
320 .sub main :main
321     .local pmc O, X, Y, A, B, Z
323     newclass O, "O"
324     subclass X, O, "X"
325     subclass Y, O, "Y"
327     subclass A, X, "A"
328     addparent A, Y
330     subclass B, Y, "B"
331     addparent B, X
333     subclass Z, A, "Z"
334     addparent Z, B
335 .end
336 CODE
337 /inconsisten class hierarchy/
338 OUTPUT
340 # Local Variables:
341 #   mode: cperl
342 #   cperl-indent-level: 4
343 #   fill-column: 100
344 # End:
345 # vim: expandtab shiftwidth=4: