3d9c242bfa83c7a9d3c05aa0612da114c2dc2fd8
[gitmo/MooseX-ClassAttribute.git] / t / lib / SharedTests.pm
1 package SharedTests;
2
3 use strict;
4 use warnings;
5
6 use Scalar::Util qw( isweak );
7 use Test::More tests => 9;
8
9
10 {
11     package HasClassAttribute;
12
13     use Moose;
14     use MooseX::ClassAttribute;
15
16     has 'ObjectCount' =>
17         ( metaclass => 'ClassAttribute',
18           is        => 'rw',
19           isa       => 'Int',
20           default   => 0,
21         );
22
23     has 'WeakAttribute' =>
24         ( metaclass => 'ClassAttribute',
25           is        => 'rw',
26           isa       => 'Object',
27           weak_ref  => 1,
28         );
29
30     has 'size' =>
31         ( is      => 'rw',
32           isa     => 'Int',
33           default => 5,
34         );
35
36     sub BUILD
37     {
38         my $class = shift;
39
40         $class->ObjectCount( $class->ObjectCount() + 1 );
41     }
42 }
43
44 sub run_tests
45 {
46     local $Test::Builder::Level = $Test::Builder::Level + 1;
47
48     {
49         is( HasClassAttribute->ObjectCount(), 0,
50             'ObjectCount() is 0' );
51
52         my $hca1 = HasClassAttribute->new();
53         is( $hca1->size(), 5,
54             'size is 5 - object attribute works as expected' );
55         is( HasClassAttribute->ObjectCount(), 1,
56             'ObjectCount() is 1' );
57
58         my $hca2 = HasClassAttribute->new( size => 10 );
59         is( $hca2->size(), 10,
60             'size is 10 - object attribute can be set via constructor' );
61         is( HasClassAttribute->ObjectCount(), 2,
62             'ObjectCount() is 2' );
63         is( $hca2->ObjectCount(), 2,
64             'ObjectCount() is 2 - can call class attribute accessor on object' );
65     }
66
67     {
68         my $hca3 = HasClassAttribute->new( ObjectCount => 20 );
69         is( $hca3->ObjectCount(), 3,
70             'class attributes are not affected by constructor params' );
71         is( HasClassAttribute->ObjectCount(), 3,
72             'class attributes are not affected by constructor params' );
73     }
74
75     {
76         my $object = bless {}, 'Thing';
77
78         HasClassAttribute->WeakAttribute($object);
79
80         ok( isweak( $HasClassAttribute::__ClassAttribute{WeakAttribute} ),
81             'weak class attributes are weak' );
82     }
83 }
84
85
86 1;