X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=t%2F021-weak-ref.t;h=3f054c9610c17456e30ec0b1fc335741ba2df0d3;hb=c9313657717f78bd96f0325c6aa1c93d0b0d41a5;hp=1121f49eeded4630034f12dec8904f5348f5056f;hpb=c3398f5bd45f2851b7cd40ca9823bcf7d2378469;p=gitmo%2FMouse.git diff --git a/t/021-weak-ref.t b/t/021-weak-ref.t index 1121f49..3f054c9 100644 --- a/t/021-weak-ref.t +++ b/t/021-weak-ref.t @@ -1,9 +1,9 @@ #!/usr/bin/env perl use strict; use warnings; -use Test::More tests => 18; + +use Test::More tests => 31; use Test::Exception; -use Scalar::Util 'isweak'; my %destroyed; @@ -26,7 +26,9 @@ do { $destroyed{ $self->type }++; } }; +}; +sub do_test{ my $self = Class->new(type => 'accessor'); $self->self($self); @@ -35,38 +37,60 @@ do { $self2->self($self3); for my $object ($self, $self2, $self3) { - ok(isweak($object->{self}), "weak reference"); + ok(Scalar::Util::isweak($object->{self}), "weak reference"); ok($object->self->self->self->self, "we've got circularity"); } -}; +} + +do_test(); is($destroyed{accessor}, 1, "destroyed from the accessor"); is($destroyed{constructor}, 1, "destroyed from the constructor"); is($destroyed{middle}, 1, "casuality of war"); -ok(!Class->meta->get_attribute('type')->weak_ref, "type is not a weakref"); -ok(Class->meta->get_attribute('self')->weak_ref, "self IS a weakref"); +Class->meta->make_immutable(); +ok(Class->meta->is_immutable, 'make_immutable made it immutable'); +do_test(); + +is($destroyed{accessor}, 2, "destroyed from the accessor (after make_immutable)"); +is($destroyed{constructor}, 2, "destroyed from the constructor (after make_immutable)"); +is($destroyed{middle}, 2, "casuality of war (after make_immutable)"); + + +ok(!Class->meta->get_attribute('type')->is_weak_ref, "type is not a weakref"); +ok(Class->meta->get_attribute('self')->is_weak_ref, "self IS a weakref"); do { package Class2; use Mouse; has value => ( - is => 'ro', + is => 'rw', default => 10, weak_ref => 1, ); }; -throws_ok { Class2->new } qr/Can't weaken a nonreference/; -ok(Class2->meta->get_attribute('value')->weak_ref, "value IS a weakref"); +ok(Class2->meta->get_attribute('value')->is_weak_ref, "value IS a weakref"); + +lives_ok { + my $obj = Class2->new; + is($obj->value, 10, "weak_ref doesn't apply to non-refs"); +}; + +my $obj2 = Class2->new; +lives_ok { + $obj2->value({}); +}; + +is_deeply($obj2->value, undef, "weakened the reference even with a nonref default"); do { package Class3; use Mouse; has hashref => ( - is => 'ro', + is => 'rw', default => sub { {} }, weak_ref => 1, predicate => 'has_hashref', @@ -81,4 +105,4 @@ $obj->hashref({1 => 1}); is($obj->hashref, undef, "hashref collected between set and get because refcount=0"); ok($obj->has_hashref, 'attribute is turned into undef, not deleted from instance'); -ok(Class3->meta->get_attribute('hashref')->weak_ref, "hashref IS a weakref"); +ok(Class3->meta->get_attribute('hashref')->is_weak_ref, "hashref IS a weakref");