Some small test improvements.
[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 $self = shift;
39
40         $self->ObjectCount( $self->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         eval { HasClassAttribute->new( ObjectCount => 20 ) };
69         like( $@, qr/\QCannot set a class attribute via the constructor (ObjectCount)/,
70               'passing a class attribute to the constructor throws an error' );
71         is( HasClassAttribute->ObjectCount(), 2,
72             'class attributes are not affected by constructor params' );
73     }
74
75     {
76         my $object = bless {}, 'Thing';
77
78         HasClassAttribute->WeakAttribute($object);
79
80         undef $object;
81
82         ok( ! defined HasClassAttribute->WeakAttribute(),
83             'weak class attributes are weak' );
84     }
85 }
86
87
88 1;