745d7397ac5574345c95a108a0b8f8759bbfb1f0
[gitmo/Moose.git] / t / bugs / memory_leaks.t
1 use strict;
2 use warnings;
3
4 use Test::Requires {
5     'Test::LeakTrace'     => '0.01',
6     'Test::Memory::Cycle' => '0',
7 };
8
9 use Test::More;
10
11 use Moose ();
12 use Moose::Util qw( apply_all_roles );
13
14 {
15     package MyRole;
16     use Moose::Role;
17     sub myname { "I'm a role" }
18 }
19
20 no_leaks_ok(
21     sub {
22         Moose::Meta::Class->create_anon_class->new_object;
23     },
24     'anonymous class with no roles is leak-free'
25 );
26
27 no_leaks_ok(
28     sub {
29         Moose::Meta::Role->initialize('MyRole2');
30     },
31     'Moose::Meta::Role->initialize is leak-free'
32 );
33
34 no_leaks_ok(
35     sub {
36         Moose::Meta::Class->create('MyClass2')->new_object;
37     },
38     'creating named class is leak-free'
39 );
40
41 no_leaks_ok(
42     sub {
43         Moose::Meta::Class->create( 'MyClass', roles => ['MyRole'] );
44     },
45     'named class with roles is leak-free'
46 );
47
48 no_leaks_ok(
49     sub {
50         Moose::Meta::Role->create( 'MyRole2', roles => ['MyRole'] );
51     },
52     'named role with roles is leak-free'
53 );
54
55 no_leaks_ok(
56     sub {
57         my $object = Moose::Meta::Class->create('MyClass2')->new_object;
58         apply_all_roles( $object, 'MyRole' );
59     },
60     'applying role to an instance is leak-free'
61 );
62
63 no_leaks_ok(
64     sub {
65         Moose::Meta::Role->create_anon_role;
66     },
67     'anonymous role is leak-free'
68 );
69
70 {
71     local $TODO
72         = 'Until we eliminate meta objects from being closed over by the immutabilized methods, this will leak';
73     no_leaks_ok(
74         sub {
75             my $meta = Moose::Meta::Class->create_anon_class;
76             $meta->make_immutable;
77         },
78         'making an anon class immutable is leak-free'
79     );
80 }
81
82 {
83     my $meta3 = Moose::Meta::Class->create('MyClass3');
84     memory_cycle_ok( $meta3, 'named metaclass object is cycle-free' );
85     memory_cycle_ok( $meta3->new_object, 'MyClass3 object is cycle-free' );
86
87     my $anon_class = Moose::Meta::Class->create_anon_class;
88     memory_cycle_ok($anon_class, 'anon metaclass object is cycle-free' );
89     memory_cycle_ok( $anon_class->new_object, 'object from anon metaclass is cycle-free' );
90
91     $anon_class->make_immutable;
92     memory_cycle_ok($anon_class, 'immutable anon metaclass object is cycle-free' );
93     memory_cycle_ok( $anon_class->new_object, 'object from immutable anon metaclass is cycle-free' );
94
95     my $anon_role = Moose::Meta::Role->create_anon_role;
96     memory_cycle_ok($anon_role, 'anon role meta object is cycle-free' );
97 }
98
99 done_testing;