Commit | Line | Data |
368e3d4a |
1 | use strict; |
2 | use warnings; |
d88e198a |
3 | use Test::More tests => 25; |
368e3d4a |
4 | use Test::Exception; |
5 | |
bdef60b4 |
6 | use Mouse (); |
7 | |
368e3d4a |
8 | # error handling |
9 | throws_ok { |
10 | Mouse::Meta::Class->create( |
475666e5 |
11 | "ClassName", |
368e3d4a |
12 | superclasses => "foo" |
13 | ); |
14 | } qr/You must pass an ARRAY ref of superclasses/; |
15 | |
16 | |
17 | throws_ok { |
18 | Mouse::Meta::Class->create( |
475666e5 |
19 | "ClassName", |
368e3d4a |
20 | attributes => "foo" |
21 | ); |
22 | } qr/You must pass an ARRAY ref of attributes/; |
23 | |
24 | throws_ok { |
25 | Mouse::Meta::Class->create( |
475666e5 |
26 | "ClassName", |
368e3d4a |
27 | methods => "foo" |
28 | ); |
29 | } qr/You must pass a HASH ref of methods/; |
30 | |
368e3d4a |
31 | # normal cases |
32 | isa_ok(Mouse::Meta::Class->create("FooBar"), "Mouse::Meta::Class"); |
33 | is FooBar->meta->name, "FooBar"; |
34 | |
35 | isa_ok( |
36 | Mouse::Meta::Class->create( |
1a72f15c |
37 | "Baz", |
368e3d4a |
38 | superclasses => [ "FooBar", "Mouse::Object" ], |
39 | attributes => [ |
40 | Mouse::Meta::Attribute->new( |
2608b115 |
41 | "foo" => ( |
42 | is => "rw", |
43 | default => "yay", |
44 | ), |
368e3d4a |
45 | ) |
46 | ], |
47 | methods => { |
48 | dooo => sub { "iiiit" }, |
49 | } |
50 | ), |
51 | "Mouse::Meta::Class" |
52 | ); |
53 | isa_ok Baz->new(), "FooBar"; |
54 | is Baz->new()->foo, "yay"; |
55 | is Baz->new()->dooo, "iiiit"; |
56 | |
ad022aac |
57 | my($anon_pkg1, $anon_pkg2); |
368e3d4a |
58 | { |
59 | my $meta = Mouse::Meta::Class->create_anon_class( |
60 | superclasses => [ "Mouse::Object" ], |
61 | methods => { |
62 | dooo => sub { "iiiit" }, |
63 | } |
64 | ); |
ad022aac |
65 | $anon_pkg1 = $meta->name; |
66 | |
67 | isa_ok($meta, "Mouse::Meta::Class", 'create_anon_class'); |
68 | ok($meta->is_anon_class, 'is_anon_class'); |
368e3d4a |
69 | is $meta->name->new->dooo(), "iiiit"; |
70 | |
ad022aac |
71 | my $anon2 = Mouse::Meta::Class->create_anon_class(cache => 1); |
72 | $anon_pkg2 = $anon2->name; |
73 | |
74 | ok($anon2->is_anon_class); |
75 | |
76 | isnt $meta, $anon2; |
77 | isnt $meta->name, $anon2->name; |
368e3d4a |
78 | } |
ad022aac |
79 | |
80 | # all the stuff are removed? |
81 | ok !$anon_pkg1->isa('Mouse::Object'); |
82 | ok !$anon_pkg1->can('dooo'); |
83 | ok !$anon_pkg1->can('meta'); |
84 | |
85 | ok $anon_pkg2->can('meta'), 'cache => 1 makes it immortal'; |
86 | |
d88e198a |
87 | my $anon = Mouse::Meta::Class->create_anon_class( |
88 | constructor_class => 'ConstructorX', |
89 | destructor_class => 'DestructorX', |
90 | ); |
91 | |
92 | is $anon->constructor_class, 'ConstructorX'; |
93 | is $anon->destructor_class, 'DestructorX'; |
94 | |
6cc6c673 |
95 | my $obj; |
96 | { |
97 | my $anon = Mouse::Meta::Class->create_anon_class(superclasses => ['Mouse::Object']); |
98 | lives_ok{ $anon->make_immutable() } 'make anon class immutable'; |
99 | $obj = $anon->name->new(); |
100 | } |
101 | |
85dcdab5 |
102 | SKIP:{ |
103 | skip 'Moose has a bug', 3 if 'Mouse' eq 'Moose'; |
104 | |
105 | isa_ok $obj, 'Mouse::Object'; |
106 | can_ok $obj, 'meta'; |
107 | lives_and{ |
108 | isa_ok $obj->meta, 'Mouse::Meta::Class'; |
109 | }; |
110 | } |