Make sure that predicate plays well with builder
[gitmo/Mouse.git] / t / 023-builder.t
CommitLineData
b6e1128f 1#!/usr/bin/env perl
2use strict;
3use warnings;
5d5a3b5d 4use Test::More tests => 30;
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',
b6e1128f 18 );
19
b6e1128f 20 sub _build_name {
21 my $self = shift;
22 ++$builder_called;
9367e029 23 return "FRANK";
b6e1128f 24 };
9367e029 25
26 has age => (
5d5a3b5d 27 is => 'ro',
28 isa => 'Int',
29 builder => '_build_age',
30 lazy => 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
54my $object2 = Class->new;
5d5a3b5d 55ok($object2->has_name, "predicate: value from eager builder");
b6e1128f 56is($object2->name, "FRANK", "builder called to provide the default value");
57is($builder_called, 1, "builder called ONCE to provide the default value");
58
9367e029 59# lazy builder
60my $object3 = Class->new;
61is($lazy_builder_called, 0, "lazy builder not called yet");
5d5a3b5d 62ok(!$object3->has_age, "predicate: no age yet");
9367e029 63is($object3->age, 20, "lazy builder value");
5d5a3b5d 64ok($object3->has_age, "predicate: have value after get");
9367e029 65is($lazy_builder_called, 1, "lazy builder called on get");
66is($object3->age, 20, "lazy builder value");
67is($lazy_builder_called, 1, "lazy builder not called on subsequent gets");
5d5a3b5d 68ok($object3->has_age, "predicate: have value after subsequent gets");
9367e029 69
5d5a3b5d 70$lazy_builder_called = 0;
9367e029 71$object3->clear_age;
5d5a3b5d 72ok(!$object3->has_age, "predicate: no value after clear");
73is($lazy_builder_called, 0, "lazy builder not called on clear");
9367e029 74is($object3->age, 20, "lazy builder value");
5d5a3b5d 75ok($object3->has_age, "predicate: have value after clear and get");
76is($lazy_builder_called, 1, "lazy builder called on get after clear");
9367e029 77
5d5a3b5d 78$lazy_builder_called = 0;
9367e029 79my $object4 = Class->new(age => 50);
5d5a3b5d 80ok($object4->has_age, "predicate: have value from constructor");
9367e029 81is($lazy_builder_called, 0, "lazy builder not called yet");
82is($object4->age, 50, "value from constructor");
83is($lazy_builder_called, 0, "lazy builder not called if value is from constructor");
84
85$object4->clear_age;
5d5a3b5d 86ok(!$object4->has_age, "predicate: no value after clear");
9367e029 87is($lazy_builder_called, 0, "lazy builder not called on clear");
88is($object4->age, 20, "lazy builder value");
5d5a3b5d 89ok($object4->has_age, "predicate: have value after clear and get");
9367e029 90is($lazy_builder_called, 1, "lazy builder called on get after clear");