Add length to String.
[gitmo/MooseX-AttributeHelpers.git] / t / 100_collection_with_roles.t
CommitLineData
85ec0d1f 1#!/usr/bin/perl
2
3use strict;
4use warnings;
5
9a976497 6use Test::More tests => 29;
88aaf2bd 7
85ec0d1f 8BEGIN {
9 use_ok('MooseX::AttributeHelpers');
10}
11
85ec0d1f 12package Subject;
13
14use Moose::Role;
15use MooseX::AttributeHelpers;
16
17has observers => (
18 metaclass => 'Collection::Array',
19 is => 'ro',
c25a396f 20 isa => 'ArrayRef[Observer]',
85ec0d1f 21 auto_deref => 1,
22 default => sub { [] },
92d18d6e 23 provides => { 'push' => 'add_observer', count => 'count_observers' }
85ec0d1f 24);
25
26sub notify {
27 my ($self) = @_;
28 foreach my $observer ( $self->observers() ) {
29 $observer->update($self);
30 }
31}
32
33###############################################################################
34
35package Observer;
36
37use Moose::Role;
38
c25a396f 39requires 'update';
85ec0d1f 40
41###############################################################################
42
43package Counter;
44
45use Moose;
46use MooseX::AttributeHelpers;
47
48with 'Subject';
49
50has count => (
51 metaclass => 'Counter',
52 is => 'ro',
53 isa => 'Int',
54 default => 0,
55 provides => {
56 inc => 'inc_counter',
57 dec => 'dec_counter',
58 }
59);
60
61after 'inc_counter','dec_counter' => sub {
62 my ($self) = @_;
63 $self->notify();
64};
65
66###############################################################################
67
68package Display;
69
92d18d6e 70use Test::More;
71
85ec0d1f 72use Moose;
73
74with 'Observer';
75
76sub update {
77 my ( $self, $subject ) = @_;
92d18d6e 78 like $subject->count, qr{^-?\d+$}, 'Observed number ' . $subject->count;
85ec0d1f 79}
80
81###############################################################################
82
83package main;
84
85my $count = Counter->new();
92d18d6e 86
87ok($count->can('add_observer'), 'add_observer method added');
88
89ok($count->can('count_observers'), 'count_observers method added');
90
91ok($count->can('inc_counter'), 'inc_counter method added');
92
93ok($count->can('dec_counter'), 'dec_counter method added');
94
85ec0d1f 95$count->add_observer( Display->new() );
96
92d18d6e 97is($count->count_observers, 1, 'Only one observer');
98
99is($count->count, 0, 'Default to zero');
100
101$count->inc_counter;
102
103is($count->count, 1, 'Increment to one ');
104
105$count->inc_counter for (1 .. 6);
106
107is($count->count, 7, 'Increment up to seven');
108
109$count->dec_counter;
110
111is($count->count, 6, 'Decrement to 6');
112
113$count->dec_counter for (1 .. 5);
114
115is($count->count, 1, 'Decrement to 1');
116
117$count->dec_counter for (1 .. 2);
118
119is($count->count, -1, 'Negative numbers');
120
121$count->inc_counter;
85ec0d1f 122
92d18d6e 123is($count->count, 0, 'Back to zero');