Tests and implementation for builder with lazy and clearer
[gitmo/Mouse.git] / t / 023-builder.t
1 #!/usr/bin/env perl
2 use strict;
3 use warnings;
4 use Test::More tests => 20;
5
6 my $builder_called = 0;
7 my $lazy_builder_called = 0;
8
9 do {
10     package Class;
11     use Mouse;
12
13     has name => (
14         is       => 'rw',
15         isa      => 'Str',
16         builder  => '_build_name',
17     );
18
19     sub _build_name {
20         my $self = shift;
21         ++$builder_called;
22         return "FRANK";
23     };
24
25     has age => (
26         is      => 'ro',
27         isa     => 'Int',
28         builder => '_build_age',
29         lazy    => 1,
30         clearer => 'clear_age',
31     );
32
33     sub default_age { 20 }
34     sub _build_age {
35         my $self = shift;
36         ++$lazy_builder_called;
37         return $self->default_age;
38     };
39
40 };
41
42 # eager builder
43 my $object = Class->new(name => "Bob");
44 is($builder_called, 0, "builder not called in the constructor when we pass a value");
45 is($object->name, "Bob", "builder doesn't matter when we just set the value in constructor");
46 $object->name("Bill");
47 is($object->name, "Bill", "builder doesn't matter when we just set the value in writer");
48 is($builder_called, 0, "builder not called in the setter");
49 $builder_called = 0;
50
51 my $object2 = Class->new;
52 is($object2->name, "FRANK", "builder called to provide the default value");
53 is($builder_called, 1, "builder called ONCE to provide the default value");
54
55 # lazy builder
56 my $object3 = Class->new;
57 is($lazy_builder_called, 0, "lazy builder not called yet");
58 is($object3->age, 20, "lazy builder value");
59 is($lazy_builder_called, 1, "lazy builder called on get");
60 is($object3->age, 20, "lazy builder value");
61 is($lazy_builder_called, 1, "lazy builder not called on subsequent gets");
62
63 $object3->clear_age;
64 is($lazy_builder_called, 1, "lazy builder not called on clear");
65 is($object3->age, 20, "lazy builder value");
66 is($lazy_builder_called, 2, "lazy builder called on get after clear");
67
68 $lazy_builder_called = 0 ;
69 my $object4 = Class->new(age => 50);
70 is($lazy_builder_called, 0, "lazy builder not called yet");
71 is($object4->age, 50, "value from constructor");
72 is($lazy_builder_called, 0, "lazy builder not called if value is from constructor");
73
74 $object4->clear_age;
75 is($lazy_builder_called, 0, "lazy builder not called on clear");
76 is($object4->age, 20, "lazy builder value");
77 is($lazy_builder_called, 1, "lazy builder called on get after clear");