# New Ticket Created by Bruce Stockwell
# Please include the string: [perl #60682]
# in the subject line of all future correspondence about this issue.
# <URL: http://rt.perl.org/rt3/Ticket/Display.html?id=60682 >
rewrite of t/oo/subclass.t to PIR.
subclass.t | 886
+++++++++++++++++++++++++++++--------------------------------
1 file changed, 426 insertions(+), 460 deletions(-)
The where many class creations in this test file. In order to keep things as
simple; avoiding class registry clashes and keeping each sub as self
contained as possible, I abandoned the "Foo" and "Bar" only class names. I
dove deep into the metasyntactic variable names in the jargon file. I hope
the simpler route was the most appropriate.
--
V/r
Bruce
Index: t/oo/subclass.t
===================================================================
--- t/oo/subclass.t (revision 32667)
+++ t/oo/subclass.t (working copy)
@@ -1,13 +1,7 @@
-#!perl
+#! parrot
# Copyright (C) 2007-2008, The Perl Foundation.
# $Id$
-use strict;
-use warnings;
-use lib qw( . lib ../lib ../../lib );
-use Test::More;
-use Parrot::Test tests => 23;
-
=head1 NAME
t/oo/new.t - Test OO subclassing (instantiation)
@@ -22,517 +16,456 @@
=cut
-pir_output_is( <<'CODE', <<'OUT', 'instantiate subclass from class object' );
+.include 'except_types.pasm'
.sub main :main
- $P0 = newclass "Pre"
- $P1 = subclass $P0, "Foo"
- $S1 = typeof $P1
- say $S1
+ .include 'test_more.pir'
- $I3 = isa $P1, "Class"
- print $I3
- print "\n"
+ plan(70)
- $P2 = new $P1
+ instance_sub_class_from_class_object()
+ manually_create_anon_class_object()
+ manually_create_named_class_object()
+ instance_from_class_object_method()
+ instance_from_string_name()
+ instance_from_string_register()
+ instance_from_string_pmc_name()
+ instance_from_key_name()
+ instance_from_key_pmc_name()
+ instance_from_class_object_init()
+ instance_from_string_name_init()
+ instance_from_string_register_name_init()
+ instance_from_string_pmc_name_init()
+ instance_from_key_name_init()
+ subclasses_within_other_namespaces()
+ call_inherited_method()
+ call_inherited_init_vtable_overrides()
+ set_inherited_attribute_by_parent_key()
+ can_not_add_same_parent_twice()
+ can_not_be_own_parent()
+ can_not_be_own_ancestor()
+ no_loop_in_hierarchy()
+ subclass_does_what_parent_does()
+.end
- $S1 = typeof $P2
- say $S1
+.sub instance_sub_class_from_class_object
+ #instance_subclass_from_class_object
+ .local pmc parent_class, foo_class, foo_object
- $I3 = isa $P2, "Foo"
- print $I3
- print "\n"
+ parent_class = newclass "PreFoo"
+ foo_class = subclass parent_class, "Foo"
- $I3 = isa $P2, "Object"
- print $I3
- print "\n"
+ $S1 = typeof foo_class
+ is ($S1, 'Class', 'created Foo as subclass of Pre')
+
+ $I3 = isa foo_class, "Class"
+ ok ($I3, 'Foo isa Class')
+
+ foo_object = new foo_class
+ $S1 = typeof foo_object
+ is ($S1, 'Foo', 'instance is typeof Foo')
+
+ $I3 = isa foo_object, "Foo"
+ ok ($I3, 'instance Foo isa Foo')
+
+ $I3 = isa foo_object, "Object"
+ ok ($I3, 'instance Foo isa Object')
+
.end
-CODE
-Class
-1
-Foo
-1
-1
-OUT
-pir_output_is( <<'CODE', <<'OUT', 'manually create anonymous class object' );
-.sub main :main
- .local pmc parent, class_init_args, parent_list
- parent = new "Class"
+.sub manually_create_anon_class_object
+ # manually create anonymous class object' );
+ .local pmc parent_class, class_init_args, parent_list
+ .local pmc anon_class, anon_object
+
+ parent_class = new "Class"
class_init_args = new 'Hash'
parent_list = new 'ResizablePMCArray'
- push parent_list, parent
+
+ push parent_list, parent_class
class_init_args['parents'] = parent_list
- $P1 = new "Class", class_init_args
- $S1 = typeof $P1
- say $S1
- $I3 = isa $P1, "Class"
- print $I3
- print "\n"
+ anon_class = new "Class", class_init_args
+ $S1 = typeof anon_class
+ is ($S1, 'Class', 'create new instance of Class')
- $P2 = new $P1
+ $I3 = isa anon_class, "Class"
+ ok ($I3, 'new instance isa Class')
- $S1 = typeof $P2
- print "'"
- print $S1
- print "'\n"
+ anon_object = new anon_class
- $I3 = isa $P2, "Foo"
- print $I3
- print "\n"
+ $S1 = typeof anon_object
+ is ($S1, '', 'instance has typeof empty string')
- $I3 = isa $P2, parent
- print $I3
- print "\n"
+ $I3 = isa anon_object, "Foo"
+ nok ($I3, 'instance not isa Foo')
- $I3 = isa $P2, "Object"
- print $I3
- print "\n"
+ $I3 = isa anon_object, parent_class
+ ok ($I3, 'instance isa parent')
+
+ $I3 = isa anon_object, "Object"
+ ok ($I3, 'instance isa Object')
+
.end
-CODE
-Class
-1
-''
-0
-1
-1
-OUT
-pir_output_is( <<'CODE', <<'OUT', 'manually create named class object' );
-.sub main :main
- .local pmc parent, class_init_args, parent_list
- parent = new "Class"
+.sub manually_create_named_class_object
+ # manually create named class object
+ .local pmc parent_class, class_init_args, parent_list
+ .local pmc bar_class, bar_object
+ parent_class = new "Class"
+
class_init_args = new 'Hash'
parent_list = new 'ResizablePMCArray'
- push parent_list, parent
+ push parent_list, parent_class
class_init_args['parents'] = parent_list
- $P1 = new "Class", class_init_args
- $P1.'name'("Foo")
- $S1 = typeof $P1
- say $S1
- $I3 = isa $P1, "Class"
- print $I3
- print "\n"
+ bar_class = new "Class", class_init_args
+ bar_class.'name'("Bar")
- $P2 = new $P1
+ $S1 = typeof bar_class
+ is ($S1, 'Class', 'create new instance of Class')
- $S1 = typeof $P2
- say $S1
+ $I3 = isa bar_class, "Class"
+ ok ($I3, 'instance isa Class')
- $I3 = isa $P2, "Foo"
- print $I3
- print "\n"
+ bar_object = new bar_class
+ $S1 = typeof bar_object
+ is ($S1, 'Bar', 'instance is typeof Bar')
- $I3 = isa $P2, "Object"
- print $I3
- print "\n"
+ $I3 = isa bar_object, "Bar"
+ ok ($I3, 'instance isa Bar')
+
+ $I3 = isa bar_object, "Object"
+ ok ($I3, 'instance isa Object')
+
.end
-CODE
-Class
-1
-Foo
-1
-1
-OUT
-pir_output_is( <<'CODE', <<'OUT', 'instantiate from class object method' );
-.sub main :main
- $P0 = newclass "Pre"
- $P1 = subclass "Pre", "Foo"
- $P2 = $P1.'new'()
+.sub instance_from_class_object_method
+ # instantiate from class object method
+ .local pmc parent_class, baz_class, baz_object
+ parent_class = newclass "PreBaz"
+ baz_class = subclass "PreBaz", "Baz"
+ baz_object = baz_class.'new'()
- $S1 = typeof $P2
- say $S1
+ $S1 = typeof baz_object
+ is ($S1, "Baz", "instance is typeof Baz")
- $I3 = isa $P2, "Foo"
- print $I3
- print "\n"
+ $I3 = isa baz_object, "Baz"
+ ok ($I3, "instance isa Baz")
- $I3 = isa $P2, "Object"
- print $I3
- print "\n"
+ $I3 = isa baz_object, "Object"
+ ok ($I3, "instance isa Object")
+
.end
-CODE
-Foo
-1
-1
-OUT
-pir_output_is( <<'CODE', <<'OUT', 'instantiate from string name' );
-.sub main :main
- $P0 = newclass "Pre"
- $P1 = subclass "Pre", "Foo"
- $P2 = new 'Foo'
+.sub instance_from_string_name
+ # instantiate from string name
+ .local pmc parent_class, qux_class, qux_object
+ parent_class = newclass "PreQux"
+ qux_class = subclass "PreQux", "Qux"
+ qux_object = new 'Qux'
- $S1 = typeof $P2
- say $S1
+ $S1 = typeof qux_object
+ is ($S1, 'Qux', 'instance is typeof Qux')
- $I3 = isa $P2, "Foo"
- print $I3
- print "\n"
+ $I3 = isa qux_object, "Qux"
+ ok ($I3, 'instance isa Qux')
- $I3 = isa $P2, "Object"
- print $I3
- print "\n"
+ $I3 = isa qux_object, "Object"
+ ok ($I3, 'instance isa Object')
+
.end
-CODE
-Foo
-1
-1
-OUT
-pir_output_is( <<'CODE', <<'OUT', 'instantiate from string register name' );
-.sub main :main
- $P0 = newclass "Pre"
- $P1 = subclass "Pre", "Foo"
- $S1 = 'Foo'
- $P2 = new $S1
+.sub instance_from_string_register
+ # instantiate from string register name
+ .local pmc parent_class, quux_class, quux_object
+ parent_class = newclass "PreQuux"
+ quux_class = subclass "PreQuux", "Quux"
+ $S1 = 'Quux'
+ quux_object = new $S1
- $S1 = typeof $P2
- say $S1
+ $S1 = typeof quux_object
+ is ($S1, 'Quux', 'instance is typeof Quux')
- $I3 = isa $P2, "Foo"
- print $I3
- print "\n"
+ $I3 = isa quux_object, "Quux"
+ ok ($I3, 'instance isa Quux')
- $I3 = isa $P2, "Object"
- print $I3
- print "\n"
+ $I3 = isa quux_object, "Object"
+ ok ($I3, 'instance isa Object')
+
.end
-CODE
-Foo
-1
-1
-OUT
-pir_output_is( <<'CODE', <<'OUT', 'instantiate from string PMC name' );
-.sub main :main
- $P0 = newclass "Pre"
- $P1 = subclass "Pre", "Foo"
+.sub instance_from_string_pmc_name
+ # instantiate from string PMC name
+ .local pmc parent_class, bongo_class, bongo_object
+ parent_class = newclass "PreBongo"
+ bongo_class = subclass "PreBongo", "Bongo"
$P3 = new 'String'
- $P3 = 'Foo'
- $P2 = new $P3
+ $P3 = 'Bongo'
+ bongo_object = new $P3
- $S1 = typeof $P2
- say $S1
+ $S1 = typeof bongo_object
+ is ($S1, 'Bongo', 'instance is typof Bongo')
- $I3 = isa $P2, "Foo"
- print $I3
- print "\n"
+ $I3 = isa bongo_object, "Bongo"
+ ok ($I3, 'instance isa Bongo')
- $I3 = isa $P2, "Object"
- print $I3
- print "\n"
+ $I3 = isa bongo_object, "Object"
+ ok ($I3, 'instance isa Object')
+
.end
-CODE
-Foo
-1
-1
-OUT
-pir_output_is( <<'CODE', <<'OUT', 'instantiate from key name' );
-.sub main :main
- $P0 = newclass "Pre"
- $P1 = subclass "Pre", ['Foo';'Bar']
- $S1 = typeof $P1
- say $S1
+.sub instance_from_key_name
+ # instantiate from key name'
+ .local pmc parent_class, foobar_class, foobar_object
+ parent_class = newclass "Zot"
+ foobar_class = subclass "Zot", ['Foo';'Bar']
+ $S1 = typeof foobar_class
+ is ($S1, 'Class', 'new class is typeof Class')
- $I3 = isa $P1, "Class"
- print $I3
- print "\n"
+ $I3 = isa foobar_class, "Class"
+ ok ($I3, 'new class isa Class')
- $P2 = new ['Foo';'Bar']
+ foobar_object = new ['Foo';'Bar']
- $S1 = typeof $P2
- say $S1
+ $S1 = typeof foobar_object
+ is ($S1, 'Foo;Bar', 'instance is typeof Foo;Bar')
- $I3 = isa $P2, ['Foo';'Bar']
- print $I3
- print "\n"
+ $I3 = isa foobar_object, ['Foo';'Bar']
+ ok ($I3, 'instance isa Foo;Bar')
- $I3 = isa $P2, "Object"
- print $I3
- print "\n"
+ $I3 = isa foobar_object, "Object"
+ ok ($I3, 'instance isa Object')
+
.end
-CODE
-Class
-1
-Foo;Bar
-1
-1
-OUT
-pir_output_is( <<'CODE', <<'OUT', 'instantiate from key PMC name', todo => 'create non-constant key' );
-.sub main :main
- $P0 = newclass "Pre"
- $P1 = subclass "Pre", ['Foo';'Bar']
- $S1 = typeof $P1
- say $S1
+.sub instance_from_key_pmc_name
+ # instantiate from key PMC name
+ .local pmc parent_class, barbaz_class, barbaz_object
+ parent_class = newclass "Snork"
+ barbaz_class = subclass "Snork", ['Bar';'Baz']
+ $S1 = typeof barbaz_class
+ is ($S1, 'Class', 'new class is typeof Class')
- $I3 = isa $P1, "Class"
- print $I3
- print "\n"
+ $I3 = isa barbaz_class, "Class"
+ ok ($I3, 'new class isa Class')
# How do you set the value of a non-constant key PMC?
- $P3 = new 'Key'
+ # $P3 = new 'Key'
+ # $P2 = new $P3
+ todo (0, 'set the value of a non-constant key PMC')
- $P2 = new $P3
+ barbaz_object = new barbaz_class #remove this when todo is accomplished
- $S1 = typeof $P2
- say $S1
+ $S1 = typeof barbaz_object
+ is ($S1, 'Bar;Baz', 'instance is typeof Bar;Baz')
- $I3 = isa $P2, 'Bar'
- print $I3
- print "\n"
+ $I3 = isa barbaz_object, 'Snork'
+ ok ($I3, 'instance isa Snork')
- $I3 = isa $P2, "Object"
- print $I3
- print "\n"
+ $I3 = isa barbaz_object, "Object"
+ ok ($I3, 'instance isa Object')
+
.end
-CODE
-Class
-1
-Foo;Bar
-1
-1
-OUT
-pir_output_is( <<'CODE', <<'OUT', 'instantiate from class object with init' );
-.sub main :main
- $P0 = newclass "Pre"
- $P1 = subclass "Pre", "Foo"
- addattribute $P1, 'data'
+.sub instance_from_class_object_init
+ # instantiate from class object with init
+ .local pmc parent_class, bork_class, bork_object
+ parent_class = newclass "Gork"
+ bork_class = subclass "Gork", "Bork"
+ addattribute bork_class, 'data'
$P3 = new 'Hash'
$P4 = new 'String'
- $P4 = "data for Foo\n"
+ $P4 = "data for Gork\n"
$P3['data'] = $P4
- $P2 = new $P1, $P3
+ bork_object = new bork_class, $P3
- $S1 = typeof $P2
- say $S1
+ $S1 = typeof bork_object
+ is ($S1, 'Bork', 'instance is typeof Bork')
- $I3 = isa $P2, "Foo"
- print $I3
- print "\n"
+ $I3 = isa bork_object, "Gork"
+ ok ($I3, 'instance isa Gork')
- $I3 = isa $P2, "Object"
- print $I3
- print "\n"
+ $I3 = isa bork_object, "Object"
+ ok ($I3, 'instance isa Object')
- $P5 = getattribute $P2, 'data'
- print $P5
+ $P5 = getattribute bork_object, 'data'
+ is ($P5, "data for Gork\n", 'read attribute data from instance of Bork')
+
.end
-CODE
-Foo
-1
-1
-data for Foo
-OUT
-pir_output_is( <<'CODE', <<'OUT', 'instantiate from string name with init' );
-.sub main :main
- $P0 = newclass "Pre"
- $P1 = subclass "Pre", "Foo"
- addattribute $P1, 'data'
+.sub instance_from_string_name_init
+ # instantiate from string name with init
+ .local pmc parent_class, boogle_class, boogle_object
+ parent_class = newclass "Froogle"
+ boogle_class = subclass "Froogle", "Boogle"
+ addattribute boogle_class, 'data'
$P3 = new 'Hash'
$P4 = new 'String'
- $P4 = "data for Foo\n"
+ $P4 = "data for Boogle\n"
$P3['data'] = $P4
- $P2 = new 'Foo', $P3
+ boogle_object = new 'Boogle', $P3
- $S1 = typeof $P2
- say $S1
+ $S1 = typeof boogle_object
+ is ($S1, 'Boogle', 'instance is typeof Boogle')
- $I3 = isa $P2, "Foo"
- print $I3
- print "\n"
+ $I3 = isa boogle_object, "Boogle"
+ ok ($I3, 'instance isa Boogle')
- $I3 = isa $P2, "Object"
- print $I3
- print "\n"
+ $I3 = isa boogle_object, "Object"
+ ok ($I3, 'instance isa Object')
- $P5 = getattribute $P2, 'data'
- print $P5
+ $P5 = getattribute boogle_object, 'data'
+ is ($P5, "data for Boogle\n", 'read attribute data from instance of Boogle')
+
.end
-CODE
-Foo
-1
-1
-data for Foo
-OUT
-pir_output_is( <<'CODE', <<'OUT', 'instantiate from string register name with init' );
-.sub main :main
- $P0 = newclass "Pre"
- $P1 = subclass "Pre", "Foo"
- addattribute $P1, 'data'
+.sub instance_from_string_register_name_init
+ # instantiate from string register name with init
+ .local pmc parent_class, eek_class, eek_object
+ parent_class = newclass "Ook"
+ eek_class = subclass "Ook", "Eek"
+ addattribute eek_class, 'data'
$P3 = new 'Hash'
$P4 = new 'String'
- $P4 = "data for Foo\n"
+ $P4 = "data for Eek\n"
$P3['data'] = $P4
- $S1 = 'Foo'
- $P2 = new $S1, $P3
+ $S1 = 'Eek'
+ eek_object = new $S1, $P3
- $S1 = typeof $P2
- say $S1
+ $S1 = typeof eek_object
+ is ($S1, 'Eek', 'instance is typeof Eek')
- $I3 = isa $P2, "Foo"
- print $I3
- print "\n"
+ $I3 = isa eek_object, "Eek"
+ ok ($I3, 'instance isa Eek')
- $I3 = isa $P2, "Object"
- print $I3
- print "\n"
+ $I3 = isa eek_object, "Object"
+ ok ($I3, 'instance isa Object')
- $P5 = getattribute $P2, 'data'
- print $P5
-.end
-CODE
-Foo
-1
-1
-data for Foo
-OUT
+ $P5 = getattribute eek_object, 'data'
+ is ($P5, "data for Eek\n", 'read attribute data from instance of Eek')
-pir_output_is( <<'CODE', <<'OUT', 'instantiate from string PMC name with init' );
-.sub main :main
- $P0 = newclass "Pre"
- $P1 = subclass "Pre", "Foo"
- addattribute $P1, 'data'
+.end
+#
+#pir_output_is( <<'CODE', <<'OUT', 'instantiate from string PMC name with init' );
+.sub instance_from_string_pmc_name_init
+ # instantiate from string PMC name with init
+ .local pmc parent_class, wobble_class, wobble_object
+ parent_class = newclass "Weeble"
+ wobble_class = subclass "Weeble", "Wobble"
+ addattribute wobble_class, 'data'
$P3 = new 'Hash'
$P4 = new 'String'
- $P4 = "data for Foo\n"
+ $P4 = "data for Wobble\n"
$P3['data'] = $P4
$P6 = new 'String'
- $P6 = 'Foo'
- $P2 = new $P6, $P3
+ $P6 = 'Wobble'
+ wobble_object = new $P6, $P3
- $S1 = typeof $P2
- say $S1
+ $S1 = typeof wobble_object
+ is ($S1, 'Wobble', 'instance is typeof Wobble')
- $I3 = isa $P2, "Foo"
- print $I3
- print "\n"
+ $I3 = isa wobble_object, "Wobble"
+ ok ($I3, 'instance isa Wobble')
- $I3 = isa $P2, "Object"
- print $I3
- print "\n"
+ $I3 = isa wobble_object, "Object"
+ ok ($I3, 'instance isa Object')
- $P5 = getattribute $P2, 'data'
- print $P5
+ $P5 = getattribute wobble_object, 'data'
+ is ($P5, "data for Wobble\n", 'read attribute data from instance of Wobble')
.end
-CODE
-Foo
-1
-1
-data for Foo
-OUT
-pir_output_is( <<'CODE', <<'OUT', 'instantiate from key name with init', todo => 'init keyed' );
-.sub main :main
- $P0 = newclass "Pre"
- $P1 = subclass "Pre", ['Foo';'Bar']
- addattribute $P1, 'data'
+.sub instance_from_key_name_init
+ # instantiate from key name with init
+ .local pmc parent_class, barfoo_class, barfoo_object
+ parent_class = newclass "Zork"
+ barfoo_class = subclass "Zork", ['Bar';'Foo']
+ addattribute barfoo_class, 'data'
$P3 = new 'Hash'
$P4 = new 'String'
- $P4 = "data for Foo;Bar\n"
+ $P4 = "data for Bar;Foo\n"
$P3['data'] = $P4
- $P2 = new ['Foo';'Bar'], $P3
+ barfoo_object = new ['Bar';'Foo'], $P3
- $S1 = typeof $P2
- say $S1
+ $S1 = typeof barfoo_object
+ is ($S1, 'Bar;Foo', 'instance is typeof Bar;Foo')
- $I3 = isa $P2, 'Bar'
- print $I3
- print "\n"
+ $I3 = isa barfoo_object, 'Zork'
+ ok ($I3, 'instance isa Zork')
- $I3 = isa $P2, "Object"
- print $I3
- print "\n"
+ $I3 = isa barfoo_object, "Object"
+ ok ($I3, 'instance isa Object')
- $P5 = getattribute $P2, 'data'
- print $P5
+ $P5 = getattribute barfoo_object, 'data'
+ is ($P5, "data for Bar;Foo\n", 'read attribute data from instance of Bar;Foo')
.end
-CODE
-Foo;Bar
-1
-1
-data for Foo;Bar
-OUT
-pir_output_is( <<'CODE', <<'OUT', 'declare subclasses within other namespaces' );
-.namespace [ 'other' ]
-.sub main :main
- $P0 = newclass 'Pre'
- $P99 = subclass 'Pre', 'Foo'
- $P99 = subclass 'Pre', 'Bar'
+.sub subclasses_within_other_namespaces
+ # declare subclasses within other namespaces
+ $P0 = newclass 'Tom'
+ $P99 = subclass 'Tom', 'Dick'
+ $P99 = subclass 'Tom', 'Harry'
- $P1 = new 'Foo'
- $P1.'blue'()
+ $P1 = new 'Dick'
+ $S1 = $P1.'name'()
+ is ($S1, "Richard", 'calling method on Dick' )
.end
-.namespace [ 'Foo' ]
-.sub 'blue' :method
- say 'foo blue'
- $P1 = new 'Bar'
- $P1.'blue'()
+.namespace [ 'Dick' ]
+.sub 'name' :method
+ $P1 = new 'Harry'
+ $S1 = $P1.'name'()
+ is ($S1, "Harold", 'calling method on Harry from Namespace Dick')
+ .return ("Richard")
.end
-.namespace [ 'Bar' ]
-.sub 'blue' :method
- say 'bar blue'
+.namespace [ 'Harry' ]
+.sub 'name' :method
+ .return ("Harold")
.end
-CODE
-foo blue
-bar blue
-OUT
+.namespace []
-pir_output_is( <<'CODE', <<'OUT', 'call inherited methods' );
-.namespace [ 'other' ]
-.sub main :main
- $P0 = newclass 'Parent'
- $P0 = subclass 'Parent', 'Foo'
+.sub call_inherited_method
+ # call inherited methods
+ $P0 = newclass 'Bilbo'
+ $P0 = subclass 'Bilbo', 'Frodo'
- $P1 = new 'Foo'
- $P1.'green'()
+ $P1 = new 'Frodo'
+ $I1 = $P1.'is_hobbit'()
+ ok ($I1, 'calling inherited method')
.end
-.namespace [ 'Parent' ]
-.sub 'green' :method
- say 'parent green'
+.namespace [ 'Bilbo' ]
+.sub 'is_hobbit' :method
+ .return (1)
.end
-CODE
-parent green
-OUT
+.namespace []
-pir_output_is( <<'CODE', <<'OUT', 'call inherited init vtable overrides' );
-.sub main :main
- $P99 = newclass 'Foo'
- $P99 = subclass 'Foo', 'Bar'
- addattribute $P99, 'storage'
- $P1 = new 'Bar'
- $P1.'say_strings'()
+.sub call_inherited_init_vtable_overrides
+ # call inherited init vtable overrides
+ $P0 = newclass 'Wombat'
+ $P1 = subclass 'Wombat', 'Frog'
+ addattribute $P0, 'storage'
+ $P1 = new 'Frog'
+ $I1 = $P1.'count_strings'()
+ is ($I1, 3, 'correct array length in vtable overriden init method')
.end
-.namespace [ 'Bar' ]
+.namespace [ 'Frog' ]
.sub 'init' :method :vtable
- say 'Bar init'
self.'add_string'('first string')
self.'add_string'('second string')
self.'add_string'('third string')
.end
-.namespace [ 'Foo' ]
+.namespace [ 'Wombat' ]
.sub 'init' :method :vtable
- say 'Foo init'
$P1 = new 'ResizablePMCArray'
setattribute self, 'storage', $P1
.end
@@ -543,86 +476,136 @@
push $P1, newstring
.end
-.sub 'say_strings' :method
+.sub 'count_strings' :method
$P1 = getattribute self, 'storage'
- $S3 = join "\n", $P1
- say $S3
+ $S3 = $P1
+ .return ($P1)
.end
-CODE
-Foo init
-Bar init
-first string
-second string
-third string
-OUT
+.namespace []
-pir_output_is( <<'CODE', <<'OUT', 'set inherited attributes by parent key' );
-.sub main :main
- $P0 = newclass 'Foo'
- addattribute $P0, 'storage'
- $P99 = subclass $P0, 'Bar'
- $P1 = $P99.'new'()
- $P2 = getattribute $P1, 'storage'
- say $P2
+.sub set_inherited_attribute_by_parent_key
+ # set inherited attributes by parent key
+ .local pmc parent_class, child_class, child_object
+ parent_class = newclass 'Zolar'
+ addattribute parent_class, 'storage'
+ child_class = subclass parent_class, 'SonOfZolar'
+ child_object = child_class.'new'()
+ $P2 = getattribute child_object, 'storage'
+ is ($P2,'storage attribute value', 'retrieve attribute vale')
.end
-.namespace [ 'Bar' ]
+.namespace [ 'SonOfZolar' ]
.sub 'init' :method :vtable
- say 'Bar init'
.local pmc newstring
newstring = new 'String'
newstring = 'storage attribute value'
- setattribute self, ['Foo'], 'storage', newstring
+ setattribute self, ['Zolar'], 'storage', newstring
.end
+.namespace []
-CODE
-Bar init
-storage attribute value
-OUT
+.sub can_not_add_same_parent_twice
+ # the same parent can't be added twice
+ .local pmc eh, parent_class, child_class
+ parent_class = newclass 'Supervisor'
+ child_class = newclass 'Employee'
-pir_error_output_like( <<'CODE', <<'OUT', "the same parent can't be added twice" );
-.sub main :main
- $P0 = newclass 'Foo'
- $P1 = newclass 'Bar'
- addparent $P1, $P0
- addparent $P1, $P0
+try:
+ eh = new 'ExceptionHandler'
+ eh.'handle_types'(.EXCEPTION_INVALID_OPERATION)
+ set_addr eh, catch
+
+ push_eh eh
+ # attempt to add duplicate parent
+ addparent child_class, parent_class
+ addparent child_class, parent_class
+ $I0 = 1 # addparent success flag
+ goto finally
+
+catch:
+ $I0 = 0 # addparent failure flag
+
+finally:
+ pop_eh
+ nok ($I0, 'attempt to duplicate parent throws exception')
.end
-CODE
-/The class 'Bar' already has a parent class 'Foo'./
-OUT
-pir_error_output_like( <<'CODE', <<'OUT', "can't be own parent");
-.sub main :main
- $P0 = newclass 'Foo'
- addparent $P0, $P0
+.sub can_not_be_own_parent
+ # can't be own parent
+ .local pmc eh, parent_class
+ parent_class = newclass 'Frob'
+
+try:
+ eh = new 'ExceptionHandler'
+ eh.'handle_types'(.EXCEPTION_INVALID_OPERATION)
+ set_addr eh, catch
+
+ push_eh eh
+ # attempt to create inheritance loop
+ addparent parent_class, parent_class
+ $I0 = 1 # addparent success flag
+ goto finally
+
+catch:
+ $I0 = 0 # addparent failure flag
+
+finally:
+ pop_eh
+ nok ($I0, 'attempt to create inheritance loop throws exception')
.end
-CODE
-/Can't be own parent/
-OUT
-pir_error_output_like( <<'CODE', <<'OUT', "can't be own grandparent");
-.sub main :main
- $P0 = newclass 'Foo'
- $P1 = subclass 'Foo', 'Bar'
- addparent $P0, $P1
+.sub can_not_be_own_ancestor
+ # can't be own grandparent
+ .local pmc eh, parent_class, child_class
+ parent_class = newclass 'Parent'
+ child_class = subclass 'Parent', 'Child'
+
+try:
+ eh = new 'ExceptionHandler'
+ eh.'handle_types'(.EXCEPTION_INVALID_OPERATION)
+ set_addr eh, catch
+
+ push_eh eh
+ # attempt to create inheritance loop
+ addparent parent_class, child_class
+ $I0 = 1 # addparent success flag
+ goto finally
+
+catch:
+ $I0 = 0 # addparent failure flag
+
+finally:
+ pop_eh
+ nok ($I0, 'attempt to create inheritance loop throws exception')
.end
-CODE
-/Loop in class hierarchy: 'Foo' is an ancestor of 'Bar'./
-OUT
-pir_error_output_like( <<'CODE', <<'OUT', "can't create loop in hierarchy");
-.sub main :main
- $P0 = newclass 'Foo'
- $P1 = newclass 'Bar'
- addparent $P1, $P0
- addparent $P0, $P1
+.sub no_loop_in_hierarchy
+ # can't create loop in hierarchy
+ .local pmc eh, mutt_class, jeff_class
+ mutt_class = newclass 'Mutt'
+ jeff_class = newclass 'Jeff'
+
+try:
+ eh = new 'ExceptionHandler'
+ eh.'handle_types'(.EXCEPTION_INVALID_OPERATION)
+ set_addr eh, catch
+
+ push_eh eh
+ # attempt to create inheritance loop
+ addparent jeff_class, mutt_class
+ addparent mutt_class, jeff_class
+ $I0 = 1 # addparent success flag
+ goto finally
+
+catch:
+ $I0 = 0 # addparent failure flag
+
+finally:
+ pop_eh
+ nok ($I0, 'attempt to create inheritance loop throws exception')
.end
-CODE
-/Loop in class hierarchy: 'Foo' is an ancestor of 'Bar'./
-OUT
-pir_output_is( <<'CODE', <<'OUT', 'subclass should do what the parent does' );
-.sub 'main' :main
+.sub subclass_does_what_parent_does
+ # subclass should do what the parent does
does_pmc()
does_subclass()
.end
@@ -630,34 +613,17 @@
.sub 'does_pmc'
$P0 = get_class 'ResizablePMCArray'
$I0 = does $P0, 'array'
-
- if $I0 goto okay
- say 'not ok 1 - PMC that provides array should do array'
- end
-
- okay:
- say 'ok 1 - PMC that provides array should do array'
+ ok ($I0, 'PMC that provides array does array')
.end
.sub 'does_subclass'
$P0 = subclass 'ResizablePMCArray', 'List'
$I0 = does $P0, 'array'
-
- if $I0 goto okay
- say 'not ok 2 - subclass of PMC that provides array should do array'
- end
-
- okay:
- say 'ok 2 - subclass of PMC that provides array should do array'
+ ok ($I0, 'subclass of PMC that provides array does array')
.end
-CODE
-ok 1 - PMC that provides array should do array
-ok 2 - subclass of PMC that provides array should do array
-OUT
# Local Variables:
-# mode: cperl
-# cperl-indent-level: 4
+# mode: pir
# fill-column: 100
# End:
-# vim: expandtab shiftwidth=4:
+# vim: expandtab shiftwidth=4 ft=pir: