Mouse::Util::does_role() respects $thing->does() method
[gitmo/Mouse.git] / Moose-t-failing / 050_metaclasses / 015_metarole.t
1 #!/usr/bin/perl
2 # This is automatically generated by author/import-moose-test.pl.
3 # DO NOT EDIT THIS FILE. ANY CHANGES WILL BE LOST!!!
4 use t::lib::MooseCompat;
5
6 use strict;
7 use warnings;
8
9 use lib 't/lib', 'lib';
10
11 use Test::More;
12 $TODO = q{Mouse is not yet completed};
13 use Test::Exception;
14
15 use Mouse::Util::MetaRole;
16
17
18 {
19     package My::Meta::Class;
20     use Mouse;
21     extends 'Mouse::Meta::Class';
22 }
23
24 {
25     package Role::Foo;
26     use Mouse::Role;
27     has 'foo' => ( is => 'ro', default => 10 );
28 }
29
30 {
31     package My::Class;
32
33     use Mouse;
34 }
35
36 {
37     package My::Role;
38     use Mouse::Role;
39 }
40
41 {
42     Mouse::Util::MetaRole::apply_metaroles(
43         for             => My::Class->meta,
44         class_metaroles => { class => ['Role::Foo'] },
45     );
46
47     ok( My::Class->meta()->meta()->does_role('Role::Foo'),
48         'apply Role::Foo to My::Class->meta()' );
49     is( My::Class->meta()->foo(), 10,
50         '... and call foo() on that meta object' );
51 }
52
53 {
54     Mouse::Util::MetaRole::apply_metaroles(
55         for             => 'My::Class',
56         class_metaroles => { attribute => ['Role::Foo'] },
57     );
58
59     ok( My::Class->meta()->attribute_metaclass()->meta()->does_role('Role::Foo'),
60         q{apply Role::Foo to My::Class->meta()'s attribute metaclass} );
61     ok( My::Class->meta()->meta()->does_role('Role::Foo'),
62         '... My::Class->meta() still does Role::Foo' );
63
64     My::Class->meta()->add_attribute( 'size', is => 'ro' );
65     is( My::Class->meta()->get_attribute('size')->foo(), 10,
66         '... call foo() on an attribute metaclass object' );
67 }
68
69 {
70     Mouse::Util::MetaRole::apply_metaroles(
71         for             => 'My::Class',
72         class_metaroles => { method => ['Role::Foo'] },
73     );
74
75     ok( My::Class->meta()->method_metaclass()->meta()->does_role('Role::Foo'),
76         q{apply Role::Foo to My::Class->meta()'s method metaclass} );
77     ok( My::Class->meta()->meta()->does_role('Role::Foo'),
78         '... My::Class->meta() still does Role::Foo' );
79     ok( My::Class->meta()->attribute_metaclass()->meta()->does_role('Role::Foo'),
80         q{... My::Class->meta()'s attribute metaclass still does Role::Foo} );
81
82     My::Class->meta()->add_method( 'bar' => sub { 'bar' } );
83     is( My::Class->meta()->get_method('bar')->foo(), 10,
84         '... call foo() on a method metaclass object' );
85 }
86
87 {
88     Mouse::Util::MetaRole::apply_metaroles(
89         for             => 'My::Class',
90         class_metaroles => { wrapped_method => ['Role::Foo'] },
91     );
92
93     ok( My::Class->meta()->wrapped_method_metaclass()->meta()->does_role('Role::Foo'),
94         q{apply Role::Foo to My::Class->meta()'s wrapped method metaclass} );
95     ok( My::Class->meta()->method_metaclass()->meta()->does_role('Role::Foo'),
96         '... My::Class->meta() still does Role::Foo' );
97     ok( My::Class->meta()->meta()->does_role('Role::Foo'),
98         '... My::Class->meta() still does Role::Foo' );
99     ok( My::Class->meta()->attribute_metaclass()->meta()->does_role('Role::Foo'),
100         q{... My::Class->meta()'s attribute metaclass still does Role::Foo} );
101
102     My::Class->meta()->add_after_method_modifier( 'bar' => sub { 'bar' } );
103     is( My::Class->meta()->get_method('bar')->foo(), 10,
104         '... call foo() on a wrapped method metaclass object' );
105 }
106
107 {
108     Mouse::Util::MetaRole::apply_metaroles(
109         for             => 'My::Class',
110         class_metaroles => { instance => ['Role::Foo'] },
111     );
112
113     ok( My::Class->meta()->instance_metaclass()->meta()->does_role('Role::Foo'),
114         q{apply Role::Foo to My::Class->meta()'s instance metaclass} );
115     ok( My::Class->meta()->meta()->does_role('Role::Foo'),
116         '... My::Class->meta() still does Role::Foo' );
117     ok( My::Class->meta()->attribute_metaclass()->meta()->does_role('Role::Foo'),
118         q{... My::Class->meta()'s attribute metaclass still does Role::Foo} );
119     ok( My::Class->meta()->method_metaclass()->meta()->does_role('Role::Foo'),
120         q{... My::Class->meta()'s method metaclass still does Role::Foo} );
121
122     is( My::Class->meta()->get_meta_instance()->foo(), 10,
123         '... call foo() on an instance metaclass object' );
124 }
125
126 {
127     Mouse::Util::MetaRole::apply_metaroles(
128         for             => 'My::Class',
129         class_metaroles => { constructor => ['Role::Foo'] },
130     );
131
132     ok( My::Class->meta()->constructor_class()->meta()->does_role('Role::Foo'),
133         q{apply Role::Foo to My::Class->meta()'s constructor class} );
134     ok( My::Class->meta()->meta()->does_role('Role::Foo'),
135         '... My::Class->meta() still does Role::Foo' );
136     ok( My::Class->meta()->attribute_metaclass()->meta()->does_role('Role::Foo'),
137         q{... My::Class->meta()'s attribute metaclass still does Role::Foo} );
138     ok( My::Class->meta()->method_metaclass()->meta()->does_role('Role::Foo'),
139         q{... My::Class->meta()'s method metaclass still does Role::Foo} );
140     ok( My::Class->meta()->instance_metaclass()->meta()->does_role('Role::Foo'),
141         q{... My::Class->meta()'s instance metaclass still does Role::Foo} );
142
143     # Actually instantiating the constructor class is too freaking hard!
144     ok( My::Class->meta()->constructor_class()->can('foo'),
145         '... constructor class has a foo method' );
146 }
147
148 {
149     Mouse::Util::MetaRole::apply_metaroles(
150         for             => 'My::Class',
151         class_metaroles => { destructor => ['Role::Foo'] },
152     );
153
154     ok( My::Class->meta()->destructor_class()->meta()->does_role('Role::Foo'),
155         q{apply Role::Foo to My::Class->meta()'s destructor class} );
156     ok( My::Class->meta()->meta()->does_role('Role::Foo'),
157         '... My::Class->meta() still does Role::Foo' );
158     ok( My::Class->meta()->attribute_metaclass()->meta()->does_role('Role::Foo'),
159         q{... My::Class->meta()'s attribute metaclass still does Role::Foo} );
160     ok( My::Class->meta()->method_metaclass()->meta()->does_role('Role::Foo'),
161         q{... My::Class->meta()'s method metaclass still does Role::Foo} );
162     ok( My::Class->meta()->instance_metaclass()->meta()->does_role('Role::Foo'),
163         q{... My::Class->meta()'s instance metaclass still does Role::Foo} );
164     ok( My::Class->meta()->constructor_class()->meta()->does_role('Role::Foo'),
165         q{... My::Class->meta()'s constructor class still does Role::Foo} );
166
167     # same problem as the constructor class
168     ok( My::Class->meta()->destructor_class()->can('foo'),
169         '... destructor class has a foo method' );
170 }
171
172 {
173     Mouse::Util::MetaRole::apply_metaroles(
174         for            => 'My::Role',
175         role_metaroles => { application_to_class => ['Role::Foo'] },
176     );
177
178     ok( My::Role->meta->application_to_class_class->meta->does_role('Role::Foo'),
179         q{apply Role::Foo to My::Role->meta's application_to_class class} );
180
181     is( My::Role->meta->application_to_class_class->new->foo, 10,
182         q{... call foo() on an application_to_class instance} );
183 }
184
185 {
186     Mouse::Util::MetaRole::apply_metaroles(
187         for            => 'My::Role',
188         role_metaroles => { application_to_role => ['Role::Foo'] },
189     );
190
191     ok( My::Role->meta->application_to_role_class->meta->does_role('Role::Foo'),
192         q{apply Role::Foo to My::Role->meta's application_to_role class} );
193     ok( My::Role->meta->application_to_class_class->meta->does_role('Role::Foo'),
194         q{... My::Role->meta's application_to_class class still does Role::Foo} );
195
196     is( My::Role->meta->application_to_role_class->new->foo, 10,
197         q{... call foo() on an application_to_role instance} );
198 }
199
200 {
201     Mouse::Util::MetaRole::apply_metaroles(
202         for            => 'My::Role',
203         role_metaroles => { application_to_instance => ['Role::Foo'] },
204     );
205
206     ok( My::Role->meta->application_to_instance_class->meta->does_role('Role::Foo'),
207         q{apply Role::Foo to My::Role->meta's application_to_instance class} );
208     ok( My::Role->meta->application_to_role_class->meta->does_role('Role::Foo'),
209         q{... My::Role->meta's application_to_role class still does Role::Foo} );
210     ok( My::Role->meta->application_to_class_class->meta->does_role('Role::Foo'),
211         q{... My::Role->meta's application_to_class class still does Role::Foo} );
212
213     is( My::Role->meta->application_to_instance_class->new->foo, 10,
214         q{... call foo() on an application_to_instance instance} );
215 }
216
217 {
218     Mouse::Util::MetaRole::apply_base_class_roles(
219         for   => 'My::Class',
220         roles => ['Role::Foo'],
221     );
222
223     ok( My::Class->meta()->does_role('Role::Foo'),
224         'apply Role::Foo to My::Class base class' );
225     is( My::Class->new()->foo(), 10,
226         '... call foo() on a My::Class object' );
227 }
228
229 {
230     package My::Class2;
231
232     use Mouse;
233 }
234
235 {
236     Mouse::Util::MetaRole::apply_metaroles(
237         for             => 'My::Class2',
238         class_metaroles => {
239             class       => ['Role::Foo'],
240             attribute   => ['Role::Foo'],
241             method      => ['Role::Foo'],
242             instance    => ['Role::Foo'],
243             constructor => ['Role::Foo'],
244             destructor  => ['Role::Foo'],
245         },
246     );
247
248     ok( My::Class2->meta()->meta()->does_role('Role::Foo'),
249         'apply Role::Foo to My::Class2->meta()' );
250     is( My::Class2->meta()->foo(), 10,
251         '... and call foo() on that meta object' );
252     ok( My::Class2->meta()->attribute_metaclass()->meta()->does_role('Role::Foo'),
253         q{apply Role::Foo to My::Class2->meta()'s attribute metaclass} );
254     My::Class2->meta()->add_attribute( 'size', is => 'ro' );
255
256     is( My::Class2->meta()->get_attribute('size')->foo(), 10,
257         '... call foo() on an attribute metaclass object' );
258
259     ok( My::Class2->meta()->method_metaclass()->meta()->does_role('Role::Foo'),
260         q{apply Role::Foo to My::Class2->meta()'s method metaclass} );
261
262     My::Class2->meta()->add_method( 'bar' => sub { 'bar' } );
263     is( My::Class2->meta()->get_method('bar')->foo(), 10,
264         '... call foo() on a method metaclass object' );
265
266     ok( My::Class2->meta()->instance_metaclass()->meta()->does_role('Role::Foo'),
267         q{apply Role::Foo to My::Class2->meta()'s instance metaclass} );
268     is( My::Class2->meta()->get_meta_instance()->foo(), 10,
269         '... call foo() on an instance metaclass object' );
270
271     ok( My::Class2->meta()->constructor_class()->meta()->does_role('Role::Foo'),
272         q{apply Role::Foo to My::Class2->meta()'s constructor class} );
273     ok( My::Class2->meta()->constructor_class()->can('foo'),
274         '... constructor class has a foo method' );
275
276     ok( My::Class2->meta()->destructor_class()->meta()->does_role('Role::Foo'),
277         q{apply Role::Foo to My::Class2->meta()'s destructor class} );
278     ok( My::Class2->meta()->destructor_class()->can('foo'),
279         '... destructor class has a foo method' );
280 }
281
282
283 {
284     package My::Meta;
285
286     use Mouse::Exporter;
287     Mouse::Exporter->setup_import_methods( also => 'Mouse' );
288
289     sub init_meta {
290         shift;
291         my %p = @_;
292
293         Mouse->init_meta( %p, metaclass => 'My::Meta::Class' );
294     }
295 }
296
297 {
298     package My::Class3;
299
300     My::Meta->import();
301 }
302
303
304 {
305     Mouse::Util::MetaRole::apply_metaroles(
306         for             => 'My::Class3',
307         class_metaroles => { class => ['Role::Foo'] },
308     );
309
310     ok( My::Class3->meta()->meta()->does_role('Role::Foo'),
311         'apply Role::Foo to My::Class3->meta()' );
312     is( My::Class3->meta()->foo(), 10,
313         '... and call foo() on that meta object' );
314     ok( ( grep { $_ eq 'My::Meta::Class' } My::Class3->meta()->meta()->superclasses() ),
315         'apply_metaroles() does not interfere with metaclass set via Mouse->init_meta()' );
316 }
317
318 {
319     package Role::Bar;
320     use Mouse::Role;
321     has 'bar' => ( is => 'ro', default => 200 );
322 }
323
324 {
325     package My::Class4;
326     use Mouse;
327 }
328
329 {
330     Mouse::Util::MetaRole::apply_metaroles(
331         for             => 'My::Class4',
332         class_metaroles => { class => ['Role::Foo'] },
333     );
334
335     ok( My::Class4->meta()->meta()->does_role('Role::Foo'),
336         'apply Role::Foo to My::Class4->meta()' );
337
338     Mouse::Util::MetaRole::apply_metaroles(
339         for             => 'My::Class4',
340         class_metaroles => { class => ['Role::Bar'] },
341     );
342
343     ok( My::Class4->meta()->meta()->does_role('Role::Bar'),
344         'apply Role::Bar to My::Class4->meta()' );
345     ok( My::Class4->meta()->meta()->does_role('Role::Foo'),
346         '... and My::Class4->meta() still does Role::Foo' );
347 }
348
349 {
350     package My::Class5;
351     use Mouse;
352
353     extends 'My::Class';
354 }
355
356 {
357     ok( My::Class5->meta()->meta()->does_role('Role::Foo'),
358         q{My::Class5->meta()'s does Role::Foo because it extends My::Class} );
359     ok( My::Class5->meta()->attribute_metaclass()->meta()->does_role('Role::Foo'),
360         q{My::Class5->meta()'s attribute metaclass also does Role::Foo} );
361     ok( My::Class5->meta()->method_metaclass()->meta()->does_role('Role::Foo'),
362         q{My::Class5->meta()'s method metaclass also does Role::Foo} );
363     ok( My::Class5->meta()->instance_metaclass()->meta()->does_role('Role::Foo'),
364         q{My::Class5->meta()'s instance metaclass also does Role::Foo} );
365     ok( My::Class5->meta()->constructor_class()->meta()->does_role('Role::Foo'),
366         q{My::Class5->meta()'s constructor class also does Role::Foo} );
367     ok( My::Class5->meta()->destructor_class()->meta()->does_role('Role::Foo'),
368         q{My::Class5->meta()'s destructor class also does Role::Foo} );
369 }
370
371 {
372     Mouse::Util::MetaRole::apply_metaroles(
373         for             => 'My::Class5',
374         class_metaroles => { class => ['Role::Bar'] },
375     );
376
377     ok( My::Class5->meta()->meta()->does_role('Role::Bar'),
378         q{apply Role::Bar My::Class5->meta()} );
379     ok( My::Class5->meta()->meta()->does_role('Role::Foo'),
380         q{... and My::Class5->meta() still does Role::Foo} );
381 }
382
383 {
384     package My::Class6;
385     use Mouse;
386
387     Mouse::Util::MetaRole::apply_metaroles(
388         for             => 'My::Class6',
389         class_metaroles => { class => ['Role::Bar'] },
390     );
391
392     extends 'My::Class';
393 }
394
395 {
396     ok( My::Class6->meta()->meta()->does_role('Role::Bar'),
397         q{apply Role::Bar My::Class6->meta() before extends} );
398     ok( My::Class6->meta()->meta()->does_role('Role::Foo'),
399         q{... and My::Class6->meta() does Role::Foo because My::Class6 extends My::Class} );
400 }
401
402 # This is the hack that used to be needed to work around the
403 # _fix_metaclass_incompatibility problem. You called extends() (which
404 # in turn calls _fix_metaclass_imcompatibility) _before_ you apply
405 # more extensions in the subclass. We wabt to make sure this continues
406 # to work in the future.
407 {
408     package My::Class7;
409     use Mouse;
410
411     # In real usage this would go in a BEGIN block so it happened
412     # before apply_metaroles was called by an extension.
413     extends 'My::Class';
414
415     Mouse::Util::MetaRole::apply_metaroles(
416         for             => 'My::Class7',
417         class_metaroles => { class => ['Role::Bar'] },
418     );
419 }
420
421 {
422     ok( My::Class7->meta()->meta()->does_role('Role::Bar'),
423         q{apply Role::Bar My::Class7->meta() before extends} );
424     ok( My::Class7->meta()->meta()->does_role('Role::Foo'),
425         q{... and My::Class7->meta() does Role::Foo because My::Class7 extends My::Class} );
426 }
427
428 {
429     package My::Class8;
430     use Mouse;
431
432     Mouse::Util::MetaRole::apply_metaroles(
433         for             => 'My::Class8',
434         class_metaroles => {
435             class     => ['Role::Bar'],
436             attribute => ['Role::Bar'],
437         },
438     );
439
440     extends 'My::Class';
441 }
442
443 {
444     ok( My::Class8->meta()->meta()->does_role('Role::Bar'),
445         q{apply Role::Bar My::Class8->meta() before extends} );
446     ok( My::Class8->meta()->meta()->does_role('Role::Foo'),
447         q{... and My::Class8->meta() does Role::Foo because My::Class8 extends My::Class} );
448     ok( My::Class8->meta()->attribute_metaclass->meta()->does_role('Role::Bar'),
449         q{apply Role::Bar to My::Class8->meta()->attribute_metaclass before extends} );
450     ok( My::Class8->meta()->attribute_metaclass->meta()->does_role('Role::Foo'),
451         q{... and My::Class8->meta()->attribute_metaclass does Role::Foo because My::Class8 extends My::Class} );
452 }
453
454
455 {
456     package My::Class9;
457     use Mouse;
458
459     Mouse::Util::MetaRole::apply_metaroles(
460         for             => 'My::Class9',
461         class_metaroles => { attribute => ['Role::Bar'] },
462     );
463
464     extends 'My::Class';
465 }
466
467 {
468     ok( My::Class9->meta()->meta()->does_role('Role::Foo'),
469         q{... and My::Class9->meta() does Role::Foo because My::Class9 extends My::Class} );
470     ok( My::Class9->meta()->attribute_metaclass->meta()->does_role('Role::Bar'),
471         q{apply Role::Bar to My::Class9->meta()->attribute_metaclass before extends} );
472     ok( My::Class9->meta()->attribute_metaclass->meta()->does_role('Role::Foo'),
473         q{... and My::Class9->meta()->attribute_metaclass does Role::Foo because My::Class9 extends My::Class} );
474 }
475
476 # This tests applying meta roles to a metaclass's metaclass. This is
477 # completely insane, but is exactly what happens with
478 # Fey::Meta::Class::Table. It's a subclass of Mouse::Meta::Class
479 # itself, and then it _uses_ MouseX::ClassAttribute, so the metaclass
480 # for Fey::Meta::Class::Table does a role.
481 #
482 # At one point this caused a metaclass incompatibility error down
483 # below, when we applied roles to the metaclass of My::Class10. It's
484 # all madness but as long as the tests pass we're happy.
485 {
486     package My::Meta::Class2;
487     use Mouse;
488     extends 'Mouse::Meta::Class';
489
490     Mouse::Util::MetaRole::apply_metaroles(
491         for             => 'My::Meta::Class2',
492         class_metaroles => { class => ['Role::Foo'] },
493     );
494 }
495
496 {
497     package My::Object;
498     use Mouse;
499     extends 'Mouse::Object';
500 }
501
502 {
503     package My::Meta2;
504
505     use Mouse::Exporter;
506     Mouse::Exporter->setup_import_methods( also => 'Mouse' );
507
508     sub init_meta {
509         shift;
510         my %p = @_;
511
512         Mouse->init_meta(
513             %p,
514             metaclass  => 'My::Meta::Class2',
515             base_class => 'My::Object',
516         );
517     }
518 }
519
520 {
521     package My::Class10;
522     My::Meta2->import;
523
524     Mouse::Util::MetaRole::apply_metaroles(
525         for             => 'My::Class10',
526         class_metaroles => { class => ['Role::Bar'] },
527     );
528 }
529
530 {
531     ok( My::Class10->meta()->meta()->meta()->does_role('Role::Foo'),
532         q{My::Class10->meta()->meta() does Role::Foo } );
533     ok( My::Class10->meta()->meta()->does_role('Role::Bar'),
534         q{My::Class10->meta()->meta() does Role::Bar } );
535     ok( My::Class10->meta()->isa('My::Meta::Class2'),
536         q{... and My::Class10->meta still isa(My::Meta::Class2)} );
537     ok( My::Class10->isa('My::Object'),
538         q{... and My::Class10 still isa(My::Object)} );
539 }
540
541 {
542     package My::Constructor;
543
544     use base 'Mouse::Meta::Method';
545 }
546
547 {
548     package My::Class11;
549
550     use Mouse;
551
552     __PACKAGE__->meta->constructor_class('My::Constructor');
553
554     Mouse::Util::MetaRole::apply_metaroles(
555         for             => 'My::Class11',
556         class_metaroles => { class => ['Role::Foo'] },
557     );
558 }
559
560 {
561     ok( My::Class11->meta()->meta()->does_role('Role::Foo'),
562         q{My::Class11->meta()->meta() does Role::Foo } );
563     is( My::Class11->meta()->constructor_class, 'My::Constructor',
564         q{... and explicitly set constructor_class value is unchanged)} );
565 }
566
567 {
568     package ExportsMouse;
569
570     Mouse::Exporter->setup_import_methods(
571         also => 'Mouse',
572     );
573
574     sub init_meta {
575         shift;
576         my %p = @_;
577         Mouse->init_meta(%p);
578         return Mouse::Util::MetaRole::apply_metaroles(
579             for => $p{for_class},
580             # Causes us to recurse through init_meta, as we have to
581             # load MyMetaclassRole from disk.
582             class_metaroles => { class => [qw/MyMetaclassRole/] },
583         );
584     }
585 }
586
587 lives_ok {
588     package UsesExportedMouse;
589     ExportsMouse->import;
590 } 'import module which loads a role from disk during init_meta';
591
592 {
593     package Foo::Meta::Role;
594
595     use Mouse::Role;
596 }
597
598 {
599     package Foo::Role;
600
601     Mouse::Exporter->setup_import_methods(
602         also => 'Mouse::Role',
603     );
604
605     sub init_meta {
606         shift;
607         my %p = @_;
608
609         Mouse::Role->init_meta(%p);
610
611         return Mouse::Util::MetaRole::apply_metaroles(
612             for            => $p{for_class},
613             role_metaroles => { method => ['Foo::Meta::Role'] },
614         );
615     }
616 }
617
618 {
619     package Role::Baz;
620
621     Foo::Role->import;
622
623     sub bla {}
624 }
625
626 {
627     package My::Class12;
628
629     use Mouse;
630
631     with( 'Role::Baz' );
632 }
633
634 {
635     ok(
636         My::Class12->meta->does_role( 'Role::Baz' ),
637         'role applied'
638     );
639
640     my $method = My::Class12->meta->get_method( 'bla' );
641     ok(
642         $method->meta->does_role( 'Foo::Meta::Role' ),
643         'method_metaclass_role applied'
644     );
645 }
646
647 {
648     package Parent;
649     use Mouse;
650
651     Mouse::Util::MetaRole::apply_metaroles(
652         for             => __PACKAGE__,
653         class_metaroles => { constructor => ['Role::Foo'] },
654     );
655 }
656
657 {
658     package Child;
659
660     use Mouse;
661     extends 'Parent';
662 }
663
664 {
665     ok(
666         Parent->meta->constructor_class->meta->can('does_role')
667             && Parent->meta->constructor_class->meta->does_role('Role::Foo'),
668         'Parent constructor class has metarole from Parent'
669     );
670
671     ok(
672         Child->meta->constructor_class->meta->can('does_role')
673             && Child->meta->constructor_class->meta->does_role(
674             'Role::Foo'),
675         'Child constructor class has metarole from Parent'
676     );
677 }
678
679 done_testing;