fix FOREIGNBUILDARGS not being called when no attributes created
[gitmo/Moo.git] / t / accessor-default.t
1 use strictures 1;
2 use Test::More;
3
4 my $c_ran;
5 {
6   package Foo;
7
8   use Sub::Quote;
9   use Moo;
10
11   has one => (is => 'ro', lazy => 1, default => quote_sub q{ {} });
12   has two => (is => 'ro', lazy => 1, builder => '_build_two');
13   sub _build_two { {} }
14   has three => (is => 'ro', default => quote_sub q{ {} });
15   has four => (is => 'ro', builder => '_build_four');
16   sub _build_four { {} }
17   has five => (is => 'ro', init_arg => undef, default => sub { {} });
18   has six => (is => 'ro', builder => 1);
19   sub _build_six { {} }
20   has seven => (is => 'ro', required => 1, default => quote_sub q{ {} });
21   has eight => (is => 'ro', builder => '_build_eight', coerce => sub { $c_ran = 1; $_[0] });
22   sub _build_eight { {} }
23   has nine => (is => 'lazy', coerce => sub { $c_ran = 1; $_[0] });
24   sub _build_nine { {} }
25   has ten => (is => 'lazy', default => 5 );
26   has eleven => (is => 'ro', default => 5 );
27   has twelve => (is => 'lazy', default => 0 );
28   has thirteen => (is => 'ro', default => 0 );
29 }
30
31 sub check {
32   my ($attr, @h) = @_;
33
34   is_deeply($h[$_], {}, "${attr}: empty hashref \$h[$_]") for 0..1;
35
36   isnt($h[0],$h[1], "${attr}: not the same hashref");
37 }
38
39 check one => map Foo->new->one, 1..2;
40
41 check two => map Foo->new->two, 1..2;
42
43 check three => map Foo->new->{three}, 1..2;
44
45 check four => map Foo->new->{four}, 1..2;
46
47 check five => map Foo->new->{five}, 1..2;
48
49 check six => map Foo->new->{six}, 1..2;
50
51 check seven => map Foo->new->{seven}, 1..2;
52
53 check eight => map Foo->new->{eight}, 1..2;
54 ok($c_ran, 'coerce defaults');
55
56 $c_ran = 0;
57
58 check nine => map Foo->new->nine, 1..2;
59 ok($c_ran, 'coerce lazy default');
60
61 is(Foo->new->ten, 5, 'non-ref default');
62 is(Foo->new->eleven, 5, 'eager non-ref default');
63 is(Foo->new->twelve, 0, 'false non-ref default');
64 is(Foo->new->thirteen, 0, 'eager false non-ref default');
65
66 done_testing;