Improve Number trait tests
[gitmo/Moose.git] / t / 070_native_traits / 004_trait_number.t
1 #!/usr/bin/perl
2
3 use strict;
4 use warnings;
5
6 use Moose ();
7 use Test::Exception;
8 use Test::More;
9 use Test::Moose;
10
11 {
12     my %handles = (
13         abs         => 'abs',
14         add         => 'add',
15         inc         => [ add => 1 ],
16         div         => 'div',
17         cut_in_half => [ div => 2 ],
18         mod         => 'mod',
19         odd         => [ mod => 2 ],
20         mul         => 'mul',
21         set         => 'set',
22         sub         => 'sub',
23         dec         => [ sub => 1 ],
24     );
25
26     my $name = 'Foo1';
27
28     sub build_class {
29         my %attr = @_;
30
31         my $class = Moose::Meta::Class->create(
32             $name++,
33             superclasses => ['Moose::Object'],
34         );
35
36         $class->add_attribute(
37             integer => (
38                 traits  => ['Number'],
39                 is      => 'ro',
40                 isa     => 'Int',
41                 default => 5,
42                 handles => \%handles,
43                 clearer => '_clear_integer',
44                 %attr,
45             ),
46         );
47
48         return ( $class->name, \%handles );
49     }
50 }
51
52 {
53     run_tests(build_class);
54     run_tests( build_class( lazy => 1 ) );
55 }
56
57 sub run_tests {
58     my ( $class, $handles ) = @_;
59
60     can_ok( $class, $_ ) for sort keys %{$handles};
61
62     with_immutable {
63         my $obj = $class->new;
64
65         is( $obj->integer, 5, 'Default to five' );
66
67         $obj->add(10);
68
69         is( $obj->integer, 15, 'Add ten for fithteen' );
70
71         $obj->sub(3);
72
73         is( $obj->integer, 12, 'Subtract three for 12' );
74
75         $obj->set(10);
76
77         is( $obj->integer, 10, 'Set to ten' );
78
79         $obj->div(2);
80
81         is( $obj->integer, 5, 'divide by 2' );
82
83         $obj->mul(2);
84
85         is( $obj->integer, 10, 'multiplied by 2' );
86
87         $obj->mod(2);
88
89         is( $obj->integer, 0, 'Mod by 2' );
90
91         $obj->set(7);
92
93         $obj->mod(5);
94
95         is( $obj->integer, 2, 'Mod by 5' );
96
97         $obj->set(-1);
98
99         $obj->abs;
100
101         is( $obj->integer, 1, 'abs 1' );
102
103         $obj->set(12);
104
105         $obj->inc;
106
107         is( $obj->integer, 13, 'inc 12' );
108
109         $obj->dec;
110
111         is( $obj->integer, 12, 'dec 13' );
112
113         if ( $class->meta->get_attribute('integer')->is_lazy ) {
114             my $obj = $class->new;
115
116             $obj->add(2);
117
118             is( $obj->integer, 7, 'add with lazy default' );
119
120             $obj->_clear_integer;
121
122             $obj->mod(2);
123
124             is( $obj->integer, 1, 'mod with lazy default' );
125         }
126     }
127     $class;
128 }
129
130 done_testing;