Add a test that singletons are not destroyed (although this doesn't test the real...
[gitmo/MooseX-Singleton.git] / t / 003-immutable.t
CommitLineData
2b4ce4bd 1use strict;
2use warnings;
3
a82b9823 4use Scalar::Util qw( refaddr );
2b4ce4bd 5use Test::More;
6
7BEGIN {
8 unless ( eval 'use Test::Warn; 1' ) {
9 plan skip_all => 'These tests require Test::Warn';
10 }
11 else {
a82b9823 12 plan tests => 18;
2b4ce4bd 13 }
14}
15
42915f8a 16{
2b4ce4bd 17 package MooseX::Singleton::Test;
18 use MooseX::Singleton;
19
20 has bag => (
21 is => 'rw',
22 isa => 'HashRef[Int]',
23 default => sub { { default => 42 } },
24 );
25
26 sub distinct_keys {
27 my $self = shift;
28 scalar keys %{ $self->bag };
29 }
30
31 sub clear {
32 my $self = shift;
33 $self->bag({});
34 }
35
36 sub add {
37 my $self = shift;
38 my $key = shift;
39 my $value = @_ ? shift : 1;
40
41 $self->bag->{$key} += $value;
42 }
b6591604 43
0ab35c13 44 ::warning_is sub { __PACKAGE__->meta->make_immutable }, '',
2b4ce4bd 45 'no warnings when calling make_immutable';
46}
47
48my $mst = MooseX::Singleton::Test->instance;
49isa_ok($mst, 'MooseX::Singleton::Test', 'Singleton->instance returns a real instance');
50
51is($mst->distinct_keys, 1, "default keys");
52
53$mst->add(foo => 10);
54is($mst->distinct_keys, 2, "added key");
55
56$mst->add(bar => 5);
57is($mst->distinct_keys, 3, "added another key");
58
59my $mst2 = MooseX::Singleton::Test->instance;
60is($mst, $mst2, 'instances are the same object');
61isa_ok($mst2, 'MooseX::Singleton::Test', 'Singleton->instance returns a real instance');
62
63is($mst2->distinct_keys, 3, "keys from before");
64
65$mst->add(baz => 2);
66
67is($mst->distinct_keys, 4, "attributes are shared even after ->instance");
68is($mst2->distinct_keys, 4, "attributes are shared even after ->instance");
69
70is(MooseX::Singleton::Test->distinct_keys, 4, "Package->reader works");
71
72MooseX::Singleton::Test->add(quux => 9000);
73
74is($mst->distinct_keys, 5, "Package->add works");
75is($mst2->distinct_keys, 5, "Package->add works");
76is(MooseX::Singleton::Test->distinct_keys, 5, "Package->add works");
77
78MooseX::Singleton::Test->clear;
79
80is($mst->distinct_keys, 0, "Package->clear works");
81is($mst2->distinct_keys, 0, "Package->clear works");
82is(MooseX::Singleton::Test->distinct_keys, 0, "Package->clear works");
83
a82b9823 84{
85 my $addr;
86
87 {
88 $addr = refaddr( MooseX::Singleton::Test->instance );
89 }
90
91 is( $addr, refaddr( MooseX::Singleton::Test->instance ),
92 'singleton is not randomly destroyed' );
93}
94