Redo conversion to Test::Fatal
[gitmo/Class-MOP.git] / t / 048_anon_class_create_init.t
index 6051f15..b42149a 100644 (file)
@@ -2,7 +2,7 @@ use strict;
 use warnings;
 
 use Test::More;
-use Test::Exception;
+use Test::Fatal;
 
 use Class::MOP;
 
@@ -40,6 +40,20 @@ my $instance;
 }
 
 {
+    my $meta = Class::MOP::Class->create_anon_class;
+    $meta->make_immutable;
+    $instance = $meta->name->new;
+}
+{
+    my $meta = Class::MOP::class_of($instance);
+    Scalar::Util::weaken($meta);
+    ok($meta, "anon class is kept alive by existing instances (immutable)");
+
+    undef $instance;
+    ok(!$meta, "anon class is collected once instances go away (immutable)");
+}
+
+{
     $instance = Class::MOP::Class->create('Foo')->new_object;
     my $meta = Class::MOP::Class->create_anon_class(superclasses => ['Foo']);
     $meta->rebless_instance($instance);
@@ -82,29 +96,55 @@ my $instance;
         superclasses => [Class::MOP::Class->create_anon_class->name],
     );
     my @superclasses = $submeta->superclasses;
-    { local $TODO = "anon class ancestry isn't preserved yet";
     ok(Class::MOP::class_of($superclasses[0]),
        "superclasses are kept alive by their subclasses");
-    }
 }
 
 {
     my $meta_name;
     {
-        $meta_name = Class::MOP::Class->create_anon_class(
+        my $meta = Class::MOP::Class->create_anon_class(
+            superclasses => ['Class::MOP::Class'],
+        );
+        $meta_name = $meta->name;
+        ok(Class::MOP::metaclass_is_weak($meta_name),
+           "default is for anon metaclasses to be weakened");
+    }
+    ok(!Class::MOP::class_of($meta_name),
+       "and weak metaclasses go away when all refs do");
+    {
+        my $meta = Class::MOP::Class->create_anon_class(
             superclasses => ['Class::MOP::Class'],
             weaken => 0,
-        )->name;
+        );
+        $meta_name = $meta->name;
+        ok(!Class::MOP::metaclass_is_weak($meta_name),
+           "anon classes can be told not to weaken");
     }
-    local $TODO = "non-weak anon classes not implemented yet";
     ok(Class::MOP::class_of($meta_name), "metaclass still exists");
     {
         my $bar_meta;
-        lives_ok {
+        is( exception {
             $bar_meta = $meta_name->initialize('Bar');
-        } "we can use the name on its own";
+        }, undef, "we can use the name on its own" );
         isa_ok($bar_meta, $meta_name);
     }
 }
 
+{
+    my $meta = Class::MOP::Class->create(
+        'Baz',
+        weaken => 1,
+    );
+    $instance = $meta->new_object;
+}
+{
+    my $meta = Class::MOP::class_of($instance);
+    Scalar::Util::weaken($meta);
+    ok($meta, "weak class is kept alive by existing instances");
+
+    undef $instance;
+    ok(!$meta, "weak class is collected once instances go away");
+}
+
 done_testing;