Style changes :)
[gitmo/Mouse.git] / t / 023-builder.t
CommitLineData
b6e1128f 1#!/usr/bin/env perl
2use strict;
3use warnings;
010a2b16 4use Test::More tests => 34;
b6e1128f 5
6my $builder_called = 0;
9367e029 7my $lazy_builder_called = 0;
b6e1128f 8
9do {
10 package Class;
11 use Mouse;
12
13 has name => (
5d5a3b5d 14 is => 'rw',
15 isa => 'Str',
16 builder => '_build_name',
17 predicate => 'has_name',
010a2b16 18 clearer => 'clear_name',
b6e1128f 19 );
20
b6e1128f 21 sub _build_name {
22 my $self = shift;
23 ++$builder_called;
9367e029 24 return "FRANK";
b6e1128f 25 };
9367e029 26
27 has age => (
45959ffa 28 is => 'ro',
29 isa => 'Int',
30 lazy_build => 1,
31 clearer => 'clear_age',
32 predicate => 'has_age',
9367e029 33 );
34
35 sub default_age { 20 }
36 sub _build_age {
37 my $self = shift;
38 ++$lazy_builder_called;
39 return $self->default_age;
40 };
41
b6e1128f 42};
43
9367e029 44# eager builder
b6e1128f 45my $object = Class->new(name => "Bob");
5d5a3b5d 46ok($object->has_name, "predicate: value from constructor");
b6e1128f 47is($builder_called, 0, "builder not called in the constructor when we pass a value");
48is($object->name, "Bob", "builder doesn't matter when we just set the value in constructor");
49$object->name("Bill");
50is($object->name, "Bill", "builder doesn't matter when we just set the value in writer");
51is($builder_called, 0, "builder not called in the setter");
52$builder_called = 0;
53
010a2b16 54$object->clear_name;
55ok(!$object->has_name, "predicate: no value after clear");
56is($object->name, undef, "eager builder does NOT swoop in after clear");
57ok(!$object->has_name, "predicate: no value after clear and get");
58is($builder_called, 0, "builder not called in the getter, even after clear");
59$builder_called = 0;
60
b6e1128f 61my $object2 = Class->new;
5d5a3b5d 62ok($object2->has_name, "predicate: value from eager builder");
b6e1128f 63is($object2->name, "FRANK", "builder called to provide the default value");
64is($builder_called, 1, "builder called ONCE to provide the default value");
65
9367e029 66# lazy builder
67my $object3 = Class->new;
68is($lazy_builder_called, 0, "lazy builder not called yet");
5d5a3b5d 69ok(!$object3->has_age, "predicate: no age yet");
9367e029 70is($object3->age, 20, "lazy builder value");
5d5a3b5d 71ok($object3->has_age, "predicate: have value after get");
9367e029 72is($lazy_builder_called, 1, "lazy builder called on get");
73is($object3->age, 20, "lazy builder value");
74is($lazy_builder_called, 1, "lazy builder not called on subsequent gets");
5d5a3b5d 75ok($object3->has_age, "predicate: have value after subsequent gets");
9367e029 76
5d5a3b5d 77$lazy_builder_called = 0;
9367e029 78$object3->clear_age;
5d5a3b5d 79ok(!$object3->has_age, "predicate: no value after clear");
80is($lazy_builder_called, 0, "lazy builder not called on clear");
9367e029 81is($object3->age, 20, "lazy builder value");
5d5a3b5d 82ok($object3->has_age, "predicate: have value after clear and get");
83is($lazy_builder_called, 1, "lazy builder called on get after clear");
9367e029 84
5d5a3b5d 85$lazy_builder_called = 0;
9367e029 86my $object4 = Class->new(age => 50);
5d5a3b5d 87ok($object4->has_age, "predicate: have value from constructor");
9367e029 88is($lazy_builder_called, 0, "lazy builder not called yet");
89is($object4->age, 50, "value from constructor");
90is($lazy_builder_called, 0, "lazy builder not called if value is from constructor");
91
92$object4->clear_age;
5d5a3b5d 93ok(!$object4->has_age, "predicate: no value after clear");
9367e029 94is($lazy_builder_called, 0, "lazy builder not called on clear");
95is($object4->age, 20, "lazy builder value");
5d5a3b5d 96ok($object4->has_age, "predicate: have value after clear and get");
9367e029 97is($lazy_builder_called, 1, "lazy builder called on get after clear");