Revert "convert all uses of Test::Exception to Test::Fatal."
[gitmo/Class-MOP.git] / t / 048_anon_class_create_init.t
index a1cbb23..b362eae 100644 (file)
@@ -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);
@@ -89,10 +103,23 @@ my $instance;
 {
     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");
     }
     ok(Class::MOP::class_of($meta_name), "metaclass still exists");
     {
@@ -104,4 +131,20 @@ my $instance;
     }
 }
 
+{
+    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;