Added unit tests for the new COmposite functionality.
[gitmo/MooseX-AttributeHelpers.git] / t / 030_composite.t
CommitLineData
ec155203 1#!/usr/bin/perl
2
3use strict;
4use warnings;
5
6use Test::More tests => 11;
7use Test::Exception;
8use Moose::Meta::Class;
9
10BEGIN {
11 use_ok('MooseX::AttributeHelpers');
12}
13
14my $test_index = 0;
15my %defaults = (
16 is => 'ro',
17 isa => 'Int',
18 default => 0,
19 provides => {
20 Counter => {
21 inc => 'inc_foo',
22 reset => 'reset_foo',
23 },
24 Number => {
25 mul => 'mul_foo',
26 },
27 },
28);
29sub make_test_class {
30 ++$test_index;
31 my %overrides = @_;
32 my $options = {%defaults};
33 while (my ($k,$v) = each(%overrides)) {
34 $options->{$k} = $v;
35 }
36 my $classname = "MooseX::AttributeHelpers::Test::$test_index";
37
38 my $meta = Moose::Meta::Class->create($classname,
39 superclasses => ['Moose::Object'],
40 );
41 $meta->add_attribute(foo => $options);
42 return $classname;
43}
44sub trait { traits => ['MooseX::AttributeHelpers::Composite::Trait'] }
45sub metaclass { metaclass => 'Composite' }
46
47sub simple_test {
48 my $class = make_test_class(@_);
49 my $foo = $class->new;
50 $foo->inc_foo;
51 $foo->inc_foo;
52 $foo->mul_foo(3);
53 is($foo->foo, 6, "math is correct");
54 return $foo->foo;
55}
56
57lives_ok {
58 simple_test(metaclass());
59} '... works with metaclass';
60
61lives_ok {
62 simple_test(trait());
63} '... works with trait';
64
65dies_ok {
66 simple_test(metaclass(), isa => 'Num');
67} 'dies without proper subtype';
68
69my $class = make_test_class(trait());
70
71#check meta
72
73is_deeply($class->meta->get_attribute('foo')->{provides}, {
74 Counter => {
75 inc => 'inc_foo',
76 reset => 'reset_foo',
77 },
78 Number => {
79 mul => 'mul_foo',
80 },
81}, 'provides is correct');
82
83ok($class->can('inc_foo'), 'can increment');
84ok($class->can('reset_foo'), 'can reset');
85ok($class->can('mul_foo'), 'can multiply');
86ok(!$class->can('div_foo'), 'cannot do anything else');