File: 808-create_class.t

package info (click to toggle)
libmouse-perl 2.6.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 2,156 kB
  • sloc: perl: 14,569; ansic: 218; makefile: 8
file content (110 lines) | stat: -rw-r--r-- 2,566 bytes parent folder | download | duplicates (7)
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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
use strict;
use warnings;
use Test::More tests => 25;
use Test::Exception;

use Mouse ();

# error handling
throws_ok {
    Mouse::Meta::Class->create(
        "ClassName",
        superclasses => "foo"
    );
} qr/You must pass an ARRAY ref of superclasses/;


throws_ok {
    Mouse::Meta::Class->create(
        "ClassName",
        attributes => "foo"
    );
} qr/You must pass an ARRAY ref of attributes/;

throws_ok {
    Mouse::Meta::Class->create(
        "ClassName",
        methods => "foo"
    );
} qr/You must pass a HASH ref of methods/;

# normal cases
isa_ok(Mouse::Meta::Class->create("FooBar"), "Mouse::Meta::Class");
is FooBar->meta->name, "FooBar";

isa_ok(
    Mouse::Meta::Class->create(
        "Baz",
        superclasses => [ "FooBar", "Mouse::Object" ],
        attributes   => [
            Mouse::Meta::Attribute->new(
                "foo" => (
                    is => "rw",
                    default => "yay",
                ),
            )
        ],
        methods => {
            dooo => sub { "iiiit" },
        }
    ),
    "Mouse::Meta::Class"
);
isa_ok Baz->new(), "FooBar";
is Baz->new()->foo, "yay";
is Baz->new()->dooo, "iiiit";

my($anon_pkg1, $anon_pkg2);
{
    my $meta = Mouse::Meta::Class->create_anon_class(
        superclasses => [ "Mouse::Object" ],
        methods => {
            dooo => sub { "iiiit" },
        }
    );
    $anon_pkg1 = $meta->name;

    isa_ok($meta, "Mouse::Meta::Class", 'create_anon_class');
    ok($meta->is_anon_class, 'is_anon_class');
    is $meta->name->new->dooo(), "iiiit";

    my $anon2 = Mouse::Meta::Class->create_anon_class(cache => 1);
    $anon_pkg2 = $anon2->name;

    ok($anon2->is_anon_class);

    isnt $meta, $anon2;
    isnt $meta->name, $anon2->name;
}

# all the stuff are removed?
ok !$anon_pkg1->isa('Mouse::Object');
ok !$anon_pkg1->can('dooo');
ok !$anon_pkg1->can('meta');

ok $anon_pkg2->can('meta'), 'cache => 1 makes it immortal';

my $anon = Mouse::Meta::Class->create_anon_class(
    constructor_class => 'ConstructorX',
    destructor_class  => 'DestructorX',
);

is $anon->constructor_class, 'ConstructorX';
is $anon->destructor_class,  'DestructorX';

my $obj;
{
    my $anon = Mouse::Meta::Class->create_anon_class(superclasses => ['Mouse::Object']);
    lives_ok{ $anon->make_immutable() } 'make anon class immutable';
    $obj = $anon->name->new();
}

SKIP:{
    skip 'Moose has a bug', 3 if 'Mouse' eq 'Moose';

    isa_ok $obj, 'Mouse::Object';
    can_ok $obj, 'meta';
    lives_and{
        isa_ok $obj->meta, 'Mouse::Meta::Class';
    };
}