Add tests for cycles in various objects
[gitmo/Moose.git] / t / bugs / memory_leaks.t
CommitLineData
98f27a2f 1use strict;
2use warnings;
3
4use Test::Requires {
8fada38c 5 'Test::LeakTrace' => '0.01',
6 'Test::Memory::Cycle' => '0',
98f27a2f 7};
8
9use Test::More;
10
1b0b5ee1 11use Moose ();
12use Moose::Util qw( apply_all_roles );
98f27a2f 13
14{
15 package MyRole;
16 use Moose::Role;
17 sub myname { "I'm a role" }
18}
8fada38c 19use Data::Dumper ();
20my $o = Data::Dumper->can('_dump'); *Data::Dumper::_dump = sub { Scalar::Util::isweak($_[1]) ? 'WEAK<'.&$o.'>' : &$o };
98f27a2f 21no_leaks_ok(
22 sub {
23 Moose::Meta::Class->create_anon_class->new_object;
24 },
25 'anonymous class with no roles is leak-free'
26);
27
28no_leaks_ok(
29 sub {
30 Moose::Meta::Role->initialize('MyRole2');
31 },
32 'Moose::Meta::Role->initialize is leak-free'
33);
34
35no_leaks_ok(
36 sub {
37 Moose::Meta::Class->create('MyClass2')->new_object;
38 },
39 'creating named class is leak-free'
40);
41
42no_leaks_ok(
43 sub {
dc77c65e 44 Moose::Meta::Class->create( 'MyClass', roles => ['MyRole'] );
98f27a2f 45 },
46 'named class with roles is leak-free'
47);
48
49no_leaks_ok(
50 sub {
1b0b5ee1 51 Moose::Meta::Role->create( 'MyRole2', roles => ['MyRole'] );
52 },
53 'named role with roles is leak-free'
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 {
98f27a2f 66 Moose::Meta::Role->create_anon_role;
67 },
68 'anonymous role is leak-free'
69);
70
71no_leaks_ok(
72 sub {
73 my $meta = Moose::Meta::Class->create_anon_class;
74 $meta->make_immutable;
98f27a2f 75 },
76 'making an anon class immutable is leak-free'
77);
78
8fada38c 79{
80 my $meta3 = Class::MOP::Class->create('MyClass3');
81 memory_cycle_ok( $meta3, 'named metaclass object is cycle-free' );
82 memory_cycle_ok( $meta3->new_object, 'MyClass3 object is cycle-free' );
83
84 my $anon = Class::MOP::Class->create_anon_class;
85 memory_cycle_ok($anon, 'anon metaclass object is cycle-free' );
86 memory_cycle_ok( $anon->new_object, 'object from anon metaclass is cycle-free' );
87
88 $anon->make_immutable;
89 memory_cycle_ok($anon, 'immutable anon metaclass object is cycle-free' );
90 memory_cycle_ok( $anon->new_object, 'object from immutable anon metaclass is cycle-free' );
91}
92
98f27a2f 93done_testing;