xref: /openbsd-src/gnu/usr.bin/perl/t/class/class.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 Testcase1 {
16f2a19305Safresh1        method hello { return "hello, world"; }
17*5486feefSafresh1
18*5486feefSafresh1        method classname { return __CLASS__; }
19f2a19305Safresh1    }
20f2a19305Safresh1
21*5486feefSafresh1    my $obj = Testcase1->new;
22*5486feefSafresh1    isa_ok($obj, "Testcase1", '$obj');
23f2a19305Safresh1
24f2a19305Safresh1    is($obj->hello, "hello, world", '$obj->hello');
25*5486feefSafresh1
26*5486feefSafresh1    is($obj->classname, "Testcase1", '$obj->classname yields __CLASS__');
27f2a19305Safresh1}
28f2a19305Safresh1
29f2a19305Safresh1# Classes are still regular packages
30f2a19305Safresh1{
31*5486feefSafresh1    class Testcase2 {
32f2a19305Safresh1        my $ok = "OK";
33f2a19305Safresh1        sub NotAMethod { return $ok }
34f2a19305Safresh1    }
35f2a19305Safresh1
36*5486feefSafresh1    is(Testcase2::NotAMethod(), "OK", 'Class can contain regular subs');
37f2a19305Safresh1}
38f2a19305Safresh1
39f2a19305Safresh1# Classes accept full package names
40f2a19305Safresh1{
41*5486feefSafresh1    class Testcase3::Foo {
42f2a19305Safresh1        method hello { return "This" }
43f2a19305Safresh1    }
44*5486feefSafresh1    is(Testcase3::Foo->new->hello, "This", 'Class supports fully-qualified package names');
45f2a19305Safresh1}
46f2a19305Safresh1
47f2a19305Safresh1# Unit class
48f2a19305Safresh1{
49*5486feefSafresh1    class Testcase4::A;
50f2a19305Safresh1    method m { return "unit-A" }
51f2a19305Safresh1
52*5486feefSafresh1    class Testcase4::B;
53f2a19305Safresh1    method m { return "unit-B" }
54f2a19305Safresh1
55f2a19305Safresh1    package main;
56*5486feefSafresh1    ok(eq_array([Testcase4::A->new->m, Testcase4::B->new->m], ["unit-A", "unit-B"]),
57f2a19305Safresh1        'Unit class syntax works');
58f2a19305Safresh1}
59f2a19305Safresh1
60f2a19305Safresh1# Class {BLOCK} syntax parses like package
61f2a19305Safresh1{
62f2a19305Safresh1    my $result = "";
63f2a19305Safresh1    eval q{
64f2a19305Safresh1        $result .= "a(" . __PACKAGE__ . "/" . eval("__PACKAGE__") . ")\n";
65*5486feefSafresh1        class Testcase5 1.23 {
66f2a19305Safresh1            $result .= "b(" . __PACKAGE__ . "/" . eval("__PACKAGE__") . ")\n";
67f2a19305Safresh1        }
68f2a19305Safresh1        $result .= "c(" . __PACKAGE__ . "/" . eval("__PACKAGE__") . ")\n";
69f2a19305Safresh1    } or die $@;
70*5486feefSafresh1    is($result, "a(main/main)\nb(Testcase5/Testcase5)\nc(main/main)\n",
71f2a19305Safresh1        'class sets __PACKAGE__ correctly');
72*5486feefSafresh1    is($Testcase5::VERSION, 1.23, 'class NAME VERSION { BLOCK } sets $VERSION');
73f2a19305Safresh1}
74f2a19305Safresh1
75f2a19305Safresh1# Unit class syntax parses like package
76f2a19305Safresh1{
77f2a19305Safresh1    my $result = "";
78f2a19305Safresh1    eval q{
79f2a19305Safresh1        $result .= "a(" . __PACKAGE__ . "/" . eval("__PACKAGE__") . ")\n";
80*5486feefSafresh1        class Testcase6 4.56;
81f2a19305Safresh1        $result .= "b(" . __PACKAGE__ . "/" . eval("__PACKAGE__") . ")\n";
82f2a19305Safresh1        package main;
83f2a19305Safresh1        $result .= "c(" . __PACKAGE__ . "/" . eval("__PACKAGE__") . ")\n";
84f2a19305Safresh1    } or die $@;
85*5486feefSafresh1    is($result, "a(main/main)\nb(Testcase6/Testcase6)\nc(main/main)\n",
86f2a19305Safresh1        'class sets __PACKAGE__ correctly');
87*5486feefSafresh1    is($Testcase6::VERSION, 4.56, 'class NAME VERSION; sets $VERSION');
88f2a19305Safresh1}
89f2a19305Safresh1
90f2a19305Safresh1done_testing;
91