xref: /openbsd-src/gnu/usr.bin/perl/t/class/inherit.t (revision 5486feefcc8cb79b19e014ab332cc5dfd05b3b33)
1f2a19305Safresh1#!./perl
2f2a19305Safresh1
3f2a19305Safresh1BEGIN {
4f2a19305Safresh1    chdir 't' if -d 't';
5f2a19305Safresh1    require './test.pl';
6f2a19305Safresh1    set_up_inc('../lib');
7f2a19305Safresh1    require Config;
8f2a19305Safresh1}
9f2a19305Safresh1
10f2a19305Safresh1use v5.36;
11f2a19305Safresh1use feature 'class';
12f2a19305Safresh1no warnings 'experimental::class';
13f2a19305Safresh1
14f2a19305Safresh1{
15*5486feefSafresh1    class Testcase1A {
16f2a19305Safresh1        field $inita = "base";
17f2a19305Safresh1        method inita { return $inita; }
18f2a19305Safresh1        field $adja;
19f2a19305Safresh1        ADJUST { $adja = "base class" }
20f2a19305Safresh1        method adja { return $adja; }
21*5486feefSafresh1
22*5486feefSafresh1        method classname { return __CLASS__; }
23f2a19305Safresh1    }
24f2a19305Safresh1
25*5486feefSafresh1    class Testcase1B :isa(Testcase1A) {
26f2a19305Safresh1        field $initb = "derived";
27f2a19305Safresh1        method initb { return $initb; }
28f2a19305Safresh1        field $adjb;
29f2a19305Safresh1        ADJUST { $adjb = "derived class" }
30f2a19305Safresh1        method adjb { return $adjb; }
31f2a19305Safresh1    }
32f2a19305Safresh1
33*5486feefSafresh1    my $obj = Testcase1B->new;
34*5486feefSafresh1    ok($obj isa Testcase1B, 'Object is its own class');
35*5486feefSafresh1    ok($obj isa Testcase1A, 'Object is also its base class');
36f2a19305Safresh1
37*5486feefSafresh1    ok(eq_array(\@Testcase1B::ISA, ["Testcase1A"]), '@Testcase1B::ISA is set correctly');
38f2a19305Safresh1
39f2a19305Safresh1    is($obj->initb, "derived",       'Object has derived class initialised field');
40f2a19305Safresh1    is($obj->adjb,  "derived class", 'Object has derived class ADJUSTed field');
41f2a19305Safresh1
42f2a19305Safresh1    can_ok($obj, "inita");
43f2a19305Safresh1    is($obj->inita, "base",      'Object has base class initialised field');
44f2a19305Safresh1    can_ok($obj, "adja");
45f2a19305Safresh1    is($obj->adja, "base class", 'Object has base class ADJUSTed field');
46f2a19305Safresh1
47*5486feefSafresh1    is($obj->classname, "Testcase1B", '__CLASS__ yields runtime instance class name');
48f2a19305Safresh1
49*5486feefSafresh1    class Testcase1C :isa(    Testcase1A    ) { }
50*5486feefSafresh1
51*5486feefSafresh1    my $objc = Testcase1C->new;
52*5486feefSafresh1    ok($objc isa Testcase1A, ':isa attribute trims whitespace');
53f2a19305Safresh1}
54f2a19305Safresh1
55f2a19305Safresh1{
56*5486feefSafresh1    class Testcase2A 1.23 { }
57f2a19305Safresh1
58*5486feefSafresh1    class Testcase2B :isa(Testcase2A 1.0) { } # OK
59f2a19305Safresh1
60*5486feefSafresh1    ok(!defined eval "class Testcase2C :isa(Testcase2A 2.0) {}; 1",
61f2a19305Safresh1        ':isa() version test can throw');
62*5486feefSafresh1    like($@, qr/^Testcase2A version 2\.0 required--this is only version 1\.23 at /,
63f2a19305Safresh1        'Exception thrown from :isa version test');
64f2a19305Safresh1}
65f2a19305Safresh1
66f2a19305Safresh1{
67*5486feefSafresh1    class Testcase3A {
68f2a19305Safresh1        field $x :param;
69f2a19305Safresh1        method x { return $x; }
70f2a19305Safresh1    }
71f2a19305Safresh1
72*5486feefSafresh1    class Testcase3B :isa(Testcase3A) {}
73f2a19305Safresh1
74*5486feefSafresh1    my $obj = Testcase3B->new(x => "X");
75f2a19305Safresh1    is($obj->x, "X", 'Constructor params passed through to superclass');
76f2a19305Safresh1}
77f2a19305Safresh1
78f2a19305Safresh1{
79*5486feefSafresh1    class Testcase4A { }
80f2a19305Safresh1
81*5486feefSafresh1    class Testcase4B :isa(Testcase4A);
82f2a19305Safresh1
83f2a19305Safresh1    package main;
84*5486feefSafresh1    my $obj = Testcase4B->new;
85*5486feefSafresh1    ok($obj isa Testcase4A, 'Unit class syntax allows :isa');
86*5486feefSafresh1}
87*5486feefSafresh1
88*5486feefSafresh1{
89*5486feefSafresh1    class Testcase5A {
90*5486feefSafresh1        field $classname = __CLASS__;
91*5486feefSafresh1        method classname { return $classname }
92*5486feefSafresh1    }
93*5486feefSafresh1
94*5486feefSafresh1    class Testcase5B :isa(Testcase5A) { }
95*5486feefSafresh1
96*5486feefSafresh1    is(Testcase5B->new->classname, "Testcase5B", '__CLASS__ yields correct class name for subclass');
97*5486feefSafresh1}
98*5486feefSafresh1
99*5486feefSafresh1{
100*5486feefSafresh1    # https://github.com/Perl/perl5/issues/21332
101*5486feefSafresh1    use lib 'lib/class';
102*5486feefSafresh1    ok(eval <<'EOS', "hierarchical base class loaded");
103*5486feefSafresh1use A::B;
104*5486feefSafresh11;
105*5486feefSafresh1EOS
106*5486feefSafresh1}
107*5486feefSafresh1
108*5486feefSafresh1{
109*5486feefSafresh1    # https://github.com/Perl/perl5/issues/20891
110*5486feefSafresh1    class Testcase6A 1.23 {}
111*5486feefSafresh1    class Testcase6B 1.23 :isa(Testcase6A) {}
112*5486feefSafresh1
113*5486feefSafresh1    ok(Testcase6B->new isa Testcase6A, 'Testcase6B inherits Testcase6B');
114*5486feefSafresh1    is(Testcase6B->VERSION, 1.23, 'Testcase6B sets VERSION');
115f2a19305Safresh1}
116f2a19305Safresh1
117f2a19305Safresh1done_testing;
118