fix weak lazy attributes (tome)
[gitmo/Moose.git] / t / attributes / attribute_reader_generation.t
1 #!/usr/bin/perl
2
3 use strict;
4 use warnings;
5
6 use Test::More;
7 use Test::Fatal;
8
9
10 {
11     package Foo;
12     use Moose;
13
14     eval {
15         has 'foo' => (
16             reader => 'get_foo'
17         );
18     };
19     ::ok(!$@, '... created the reader method okay');
20
21     eval {
22         has 'lazy_foo' => (
23             reader => 'get_lazy_foo',
24             lazy => 1,
25             default => sub { 10 }
26         );
27     };
28     ::ok(!$@, '... created the lazy reader method okay') or warn $@;
29
30     eval {
31         has 'lazy_weak_foo' => (
32             reader => 'get_lazy_weak_foo',
33             lazy => 1,
34             default => sub { our $AREF = [] },
35             weak_ref => 1,
36         );
37     };
38     ::ok(!$@, '... created the lazy weak reader method okay') or warn $@;
39
40     my $warn;
41
42     eval {
43         local $SIG{__WARN__} = sub { $warn = $_[0] };
44         has 'mtfnpy' => (
45             reder => 'get_mftnpy'
46         );
47     };
48     ::ok($warn, '... got a warning for mispelled attribute argument');
49 }
50
51 {
52     my $foo = Foo->new;
53     isa_ok($foo, 'Foo');
54
55     can_ok($foo, 'get_foo');
56     is($foo->get_foo(), undef, '... got an undefined value');
57     isnt( exception {
58         $foo->get_foo(100);
59     }, undef, '... get_foo is a read-only' );
60
61     ok(!exists($foo->{lazy_foo}), '... no value in get_lazy_foo slot');
62
63     can_ok($foo, 'get_lazy_foo');
64     is($foo->get_lazy_foo(), 10, '... got an deferred value');
65     isnt( exception {
66         $foo->get_lazy_foo(100);
67     }, undef, '... get_lazy_foo is a read-only' );
68
69     is($foo->get_lazy_weak_foo(), $Foo::AREF, 'got the right value');
70     ok($foo->meta->get_meta_instance->slot_value_is_weak($foo, 'lazy_weak_foo'),
71        '... and it is weak');
72 }
73
74 {
75     my $foo = Foo->new;
76     isa_ok($foo, 'Foo');
77
78     my $attr = $foo->meta->find_attribute_by_name("lazy_foo");
79
80     isa_ok( $attr, "Moose::Meta::Attribute" );
81
82     ok( $attr->is_lazy, "it's lazy" );
83
84     is( $attr->get_raw_value($foo), undef, "raw value" );
85
86     is( $attr->get_value($foo), 10, "lazy value" );
87
88     is( $attr->get_raw_value($foo), 10, "raw value" );
89
90     my $lazy_weak_attr = $foo->meta->find_attribute_by_name("lazy_weak_foo");
91
92     is( $lazy_weak_attr->get_value($foo), $Foo::AREF, "it's the right value" );
93
94     ok( $foo->meta->get_meta_instance->slot_value_is_weak($foo, 'lazy_weak_foo'), "and it is weak");
95 }
96
97 {
98     my $foo = Foo->new(foo => 10, lazy_foo => 100);
99     isa_ok($foo, 'Foo');
100
101     is($foo->get_foo(), 10, '... got the correct value');
102     is($foo->get_lazy_foo(), 100, '... got the correct value');
103 }
104
105 done_testing;