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