Test that triggers don't fire for attr default values (lazy or not)
[gitmo/Role-Tiny.git] / t / accessor-trigger.t
1 use strictures 1;
2 use Test::More;
3
4 our @tr;
5
6 sub run_for {
7   my $class = shift;
8
9   @tr = ();
10
11   my $obj = $class->new;
12
13   ok(!@tr, "${class}: trigger not fired with no value");
14
15   $obj = $class->new(one => 1);
16
17   is_deeply(\@tr, [ 1 ], "${class}: trigger fired on new");
18
19   my $res = $obj->one(2);
20
21   is_deeply(\@tr, [ 1, 2 ], "${class}: trigger fired on set");
22
23   is($res, 2, "${class}: return from set ok");
24
25   is($obj->one, 2, "${class}: return from accessor ok");
26
27   is_deeply(\@tr, [ 1, 2 ], "${class}: trigger not fired for accessor as get");
28 }
29
30 {
31   package Foo;
32
33   use Moo;
34
35   has one => (is => 'rw', trigger => sub { push @::tr, $_[1] });
36 }
37
38 run_for 'Foo';
39
40 {
41   package Bar;
42
43   use Sub::Quote;
44   use Moo;
45
46   has one => (is => 'rw', trigger => quote_sub q{ push @::tr, $_[1] });
47 }
48
49 run_for 'Bar';
50
51 {
52   package Baz;
53
54   use Sub::Quote;
55   use Moo;
56
57   has one => (
58     is => 'rw',
59     trigger => quote_sub(q{ push @{$tr}, $_[1] }, { '$tr' => \\@::tr })
60   );
61 }
62
63 run_for 'Baz';
64
65 {
66   package Default;
67
68   use Sub::Quote;
69   use Moo;
70
71   has one => (
72     is => 'rw',
73     trigger => quote_sub(q{ push @{$tr}, $_[1] }, { '$tr' => \\@::tr }),
74     default => sub { 0 }
75   );
76 }
77
78 run_for 'Default';
79
80 {
81   package LazyDefault;
82
83   use Sub::Quote;
84   use Moo;
85
86   has one => (
87     is => 'rw',
88     trigger => quote_sub(q{ push @{$tr}, $_[1] }, { '$tr' => \\@::tr }),
89     default => sub { 0 },
90     lazy => 1
91   );
92 }
93
94 run_for 'LazyDefault';
95
96 done_testing;