Mouse::Util::does_role() respects $thing->does() method
[gitmo/Mouse.git] / t / 001_mouse / 808-create_class.t
CommitLineData
368e3d4a 1use strict;
2use warnings;
d88e198a 3use Test::More tests => 25;
368e3d4a 4use Test::Exception;
5
bdef60b4 6use Mouse ();
7
368e3d4a 8# error handling
9throws_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
17throws_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
24throws_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
32isa_ok(Mouse::Meta::Class->create("FooBar"), "Mouse::Meta::Class");
33is FooBar->meta->name, "FooBar";
34
35isa_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);
53isa_ok Baz->new(), "FooBar";
54is Baz->new()->foo, "yay";
55is Baz->new()->dooo, "iiiit";
56
ad022aac 57my($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?
81ok !$anon_pkg1->isa('Mouse::Object');
82ok !$anon_pkg1->can('dooo');
83ok !$anon_pkg1->can('meta');
84
85ok $anon_pkg2->can('meta'), 'cache => 1 makes it immortal';
86
d88e198a 87my $anon = Mouse::Meta::Class->create_anon_class(
88 constructor_class => 'ConstructorX',
89 destructor_class => 'DestructorX',
90);
91
92is $anon->constructor_class, 'ConstructorX';
93is $anon->destructor_class, 'DestructorX';
94
6cc6c673 95my $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 102SKIP:{
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}