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