make this an author test
[gitmo/Moose.git] / xt / author / memory_leaks.t
CommitLineData
634a98c9 1use strict;
2use warnings;
3
634a98c9 4use Test::More;
1a1da8a3 5use Test::LeakTrace 0.01;
6use Test::Memory::Cycle;
634a98c9 7
8use Moose ();
9use Moose::Util qw( apply_all_roles );
10
11{
12 package MyRole;
13 use Moose::Role;
14 sub myname { "I'm a role" }
15}
16
17no_leaks_ok(
18 sub {
19 Moose::Meta::Class->create_anon_class->new_object;
20 },
21 'anonymous class with no roles is leak-free'
22);
23
24no_leaks_ok(
25 sub {
26 Moose::Meta::Role->initialize('MyRole2');
27 },
28 'Moose::Meta::Role->initialize is leak-free'
29);
30
31no_leaks_ok(
32 sub {
33 Moose::Meta::Class->create('MyClass2')->new_object;
34 },
35 'creating named class is leak-free'
36);
37
38{
39 local $TODO
40 = 'role application leaks because we end up applying the role more than once to the meta object';
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
56no_leaks_ok(
57 sub {
58 my $object = Moose::Meta::Class->create('MyClass2')->new_object;
59 apply_all_roles( $object, 'MyRole' );
60 },
61 'applying role to an instance is leak-free'
62);
63
64no_leaks_ok(
65 sub {
66 Moose::Meta::Role->create_anon_role;
67 },
68 'anonymous role is leak-free'
69);
70
71{
11ded608 72 # fixing this leak currently triggers a bug in Carp
73 # we can un-TODO once that fix goes in allowing the leak
74 # in Eval::Closure to be fixed
75 local $TODO = 'Eval::Closure leaks a bit at the moment';
634a98c9 76 no_leaks_ok(
77 sub {
78 my $meta = Moose::Meta::Class->create_anon_class;
79 $meta->make_immutable;
80 },
81 'making an anon class immutable is leak-free'
82 );
83}
84
85{
86 my $meta3 = Moose::Meta::Class->create('MyClass3');
87 memory_cycle_ok( $meta3, 'named metaclass object is cycle-free' );
88 memory_cycle_ok( $meta3->new_object, 'MyClass3 object is cycle-free' );
89
90 my $anon_class = Moose::Meta::Class->create_anon_class;
91 memory_cycle_ok($anon_class, 'anon metaclass object is cycle-free' );
92 memory_cycle_ok( $anon_class->new_object, 'object from anon metaclass is cycle-free' );
93
94 $anon_class->make_immutable;
95 memory_cycle_ok($anon_class, 'immutable anon metaclass object is cycle-free' );
96 memory_cycle_ok( $anon_class->new_object, 'object from immutable anon metaclass is cycle-free' );
97
98 my $anon_role = Moose::Meta::Role->create_anon_role;
99 memory_cycle_ok($anon_role, 'anon role meta object is cycle-free' );
100}
101
102done_testing;