File: class.t

package info (click to toggle)
perl 5.42.0-2
  • links: PTS, VCS
  • area: main
  • in suites: experimental
  • size: 128,392 kB
  • sloc: perl: 534,963; ansic: 240,563; sh: 72,042; pascal: 6,934; xml: 2,428; yacc: 1,360; makefile: 1,197; cpp: 208; lisp: 1
file content (90 lines) | stat: -rw-r--r-- 2,336 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#!./perl

BEGIN {
    chdir 't' if -d 't';
    require './test.pl';
    set_up_inc('../lib');
    require Config;
}

use v5.36;
use feature 'class';
no warnings 'experimental::class';

{
    class Testcase1 {
        method hello { return "hello, world"; }

        method classname { return __CLASS__; }
    }

    my $obj = Testcase1->new;
    isa_ok($obj, "Testcase1", '$obj');

    is($obj->hello, "hello, world", '$obj->hello');

    is($obj->classname, "Testcase1", '$obj->classname yields __CLASS__');
}

# Classes are still regular packages
{
    class Testcase2 {
        my $ok = "OK";
        sub NotAMethod { return $ok }
    }

    is(Testcase2::NotAMethod(), "OK", 'Class can contain regular subs');
}

# Classes accept full package names
{
    class Testcase3::Foo {
        method hello { return "This" }
    }
    is(Testcase3::Foo->new->hello, "This", 'Class supports fully-qualified package names');
}

# Unit class
{
    class Testcase4::A;
    method m { return "unit-A" }

    class Testcase4::B;
    method m { return "unit-B" }

    package main;
    ok(eq_array([Testcase4::A->new->m, Testcase4::B->new->m], ["unit-A", "unit-B"]),
        'Unit class syntax works');
}

# Class {BLOCK} syntax parses like package
{
    my $result = "";
    eval q{
        $result .= "a(" . __PACKAGE__ . "/" . eval("__PACKAGE__") . ")\n";
        class Testcase5 1.23 {
            $result .= "b(" . __PACKAGE__ . "/" . eval("__PACKAGE__") . ")\n";
        }
        $result .= "c(" . __PACKAGE__ . "/" . eval("__PACKAGE__") . ")\n";
    } or die $@;
    is($result, "a(main/main)\nb(Testcase5/Testcase5)\nc(main/main)\n",
        'class sets __PACKAGE__ correctly');
    is($Testcase5::VERSION, 1.23, 'class NAME VERSION { BLOCK } sets $VERSION');
}

# Unit class syntax parses like package
{
    my $result = "";
    eval q{
        $result .= "a(" . __PACKAGE__ . "/" . eval("__PACKAGE__") . ")\n";
        class Testcase6 4.56;
        $result .= "b(" . __PACKAGE__ . "/" . eval("__PACKAGE__") . ")\n";
        package main;
        $result .= "c(" . __PACKAGE__ . "/" . eval("__PACKAGE__") . ")\n";
    } or die $@;
    is($result, "a(main/main)\nb(Testcase6/Testcase6)\nc(main/main)\n",
        'class sets __PACKAGE__ correctly');
    is($Testcase6::VERSION, 4.56, 'class NAME VERSION; sets $VERSION');
}

done_testing;