Use Moose::Meta::Class to create metaclass objects, not CMOP
[gitmo/Moose.git] / t / bugs / memory_leaks.t
index ed3334a..d9ddc84 100644 (file)
@@ -2,19 +2,22 @@ use strict;
 use warnings;
 
 use Test::Requires {
-    'Test::LeakTrace' => '0.01',
+    'Test::LeakTrace'     => '0.01',
+    'Test::Memory::Cycle' => '0',
 };
 
 use Test::More;
 
-use Moose;
+use Moose ();
+use Moose::Util qw( apply_all_roles );
 
 {
     package MyRole;
     use Moose::Role;
     sub myname { "I'm a role" }
 }
-
+use Data::Dumper ();
+my $o = Data::Dumper->can('_dump'); *Data::Dumper::_dump = sub { Scalar::Util::isweak($_[1]) ? 'WEAK<'.&$o.'>' : &$o };
 no_leaks_ok(
     sub {
         Moose::Meta::Class->create_anon_class->new_object;
@@ -38,14 +41,28 @@ no_leaks_ok(
 
 no_leaks_ok(
     sub {
-        Moose::Meta::Class->create( 'MyClass', roles => ['MyRole'] )
-            ->new_object;
+        Moose::Meta::Class->create( 'MyClass', roles => ['MyRole'] );
     },
     'named class with roles is leak-free'
 );
 
 no_leaks_ok(
     sub {
+        Moose::Meta::Role->create( 'MyRole2', roles => ['MyRole'] );
+    },
+    'named role with roles is leak-free'
+);
+
+no_leaks_ok(
+    sub {
+        my $object = Moose::Meta::Class->create('MyClass2')->new_object;
+        apply_all_roles( $object, 'MyRole' );
+    },
+    'applying role to an instance is leak-free'
+);
+
+no_leaks_ok(
+    sub {
         Moose::Meta::Role->create_anon_role;
     },
     'anonymous role is leak-free'
@@ -55,9 +72,25 @@ no_leaks_ok(
     sub {
         my $meta = Moose::Meta::Class->create_anon_class;
         $meta->make_immutable;
-        $meta->new_object;
     },
     'making an anon class immutable is leak-free'
 );
 
+{
+    my $meta3 = Moose::Meta::Class->create('MyClass3');
+    memory_cycle_ok( $meta3, 'named metaclass object is cycle-free' );
+    memory_cycle_ok( $meta3->new_object, 'MyClass3 object is cycle-free' );
+
+    my $anon_class = Moose::Meta::Class->create_anon_class;
+    memory_cycle_ok($anon_class, 'anon metaclass object is cycle-free' );
+    memory_cycle_ok( $anon_class->new_object, 'object from anon metaclass is cycle-free' );
+
+    $anon_class->make_immutable;
+    memory_cycle_ok($anon_class, 'immutable anon metaclass object is cycle-free' );
+    memory_cycle_ok( $anon_class->new_object, 'object from immutable anon metaclass is cycle-free' );
+
+    my $anon_role = Moose::Meta::Role->create_anon_role;
+    memory_cycle_ok($anon_role, 'anon role meta object is cycle-free' );
+}
+
 done_testing;