foo
[gitmo/Class-MOP.git] / t / 012_package_variables.t
1 #!/usr/bin/perl
2
3 use strict;
4 use warnings;
5
6 use Test::More tests => 33;
7 use Test::Exception;
8
9 BEGIN {
10     use_ok('Class::MOP');        
11 }
12
13 {
14     package Foo;
15     use metaclass;
16 }
17
18 ok(!defined($Foo::{foo}), '... the %foo slot has not been created yet');
19 ok(!Foo->meta->has_package_variable('%foo'), '... the meta agrees');
20
21 lives_ok {
22     Foo->meta->add_package_variable('%foo' => { one => 1 });
23 } '... created %Foo::foo successfully';
24
25 ok(defined($Foo::{foo}), '... the %foo slot was created successfully');
26 ok(Foo->meta->has_package_variable('%foo'), '... the meta agrees');
27
28 {
29     no strict 'refs';
30     ok(exists ${'Foo::foo'}{one}, '... our %foo was initialized correctly');
31     is(${'Foo::foo'}{one}, 1, '... our %foo was initialized correctly');
32 }
33
34 my $foo = Foo->meta->get_package_variable('%foo');
35 is_deeply({ one => 1 }, $foo, '... got the right package variable back');
36
37 $foo->{two} = 2;
38
39 {
40     no strict 'refs';
41     is(\%{'Foo::foo'}, Foo->meta->get_package_variable('%foo'), '... our %foo is the same as the metas');
42     
43     ok(exists ${'Foo::foo'}{two}, '... our %foo was updated correctly');
44     is(${'Foo::foo'}{two}, 2, '... our %foo was updated correctly');    
45 }
46
47 ok(!defined($Foo::{bar}), '... the @bar slot has not been created yet');
48
49 lives_ok {
50     Foo->meta->add_package_variable('@bar' => [ 1, 2, 3 ]);
51 } '... created @Foo::bar successfully';
52
53 ok(defined($Foo::{bar}), '... the @bar slot was created successfully');
54
55 {
56     no strict 'refs';
57     is(scalar @{'Foo::bar'}, 3, '... our @bar was initialized correctly');
58     is(${'Foo::bar'}[1], 2, '... our @bar was initialized correctly');
59 }
60
61 # now without initial value
62
63 ok(!defined($Foo::{baz}), '... the %baz slot has not been created yet');
64
65 lives_ok {
66     Foo->meta->add_package_variable('%baz');
67 } '... created %Foo::baz successfully';
68
69 ok(defined($Foo::{baz}), '... the %baz slot was created successfully');
70
71 {
72     no strict 'refs';
73     ${'Foo::baz'}{one} = 1;
74
75     ok(exists ${'Foo::baz'}{one}, '... our %baz was initialized correctly');
76     is(${'Foo::baz'}{one}, 1, '... our %baz was initialized correctly');
77 }
78
79 ok(!defined($Foo::{bling}), '... the @bling slot has not been created yet');
80
81 lives_ok {
82     Foo->meta->add_package_variable('@bling');
83 } '... created @Foo::bling successfully';
84
85 ok(defined($Foo::{bling}), '... the @bling slot was created successfully');
86
87 {
88     no strict 'refs';
89     is(scalar @{'Foo::bling'}, 0, '... our @bling was initialized correctly');
90     ${'Foo::bling'}[1] = 2;
91     is(${'Foo::bling'}[1], 2, '... our @bling was assigned too correctly');
92 }
93
94 lives_ok {
95     Foo->meta->remove_package_variable('%foo');
96 } '... removed %Foo::foo successfully';
97
98 ok(Foo->meta->has_package_variable('%foo'), '... the %foo slot was removed successfully');
99
100 # check some errors
101
102 dies_ok {
103     Foo->meta->add_package_variable('bar');
104 } '... no sigil for bar';
105
106 dies_ok {
107     Foo->meta->remove_package_variable('bar');
108 } '... no sigil for bar';
109
110 dies_ok {
111     Foo->meta->get_package_variable('bar');
112 } '... no sigil for bar';
113
114 dies_ok {
115     Foo->meta->has_package_variable('bar');
116 } '... no sigil for bar';
117
118
119 #dies_ok {
120 #    Foo->meta->get_package_variable('@.....bar');
121 #} '... could not fetch variable';