finish get_attribute_values etc
[gitmo/Class-MOP.git] / t / 023_attribute_get_read_write.t
1 #!/usr/bin/perl
2
3 use strict;
4 use warnings;
5
6 use Scalar::Util 'blessed', 'reftype';
7
8 use Test::More tests => 38;
9
10 BEGIN {
11     use_ok('Class::MOP');
12 }
13
14 =pod
15
16 This checks the get_read/write_method
17 and get_read/write_method_ref methods
18
19 =cut
20
21 {
22     package Foo;
23     use metaclass;
24     
25     Foo->meta->add_attribute('bar' => 
26         reader => 'get_bar',
27         writer => 'set_bar',
28     );  
29     
30     Foo->meta->add_attribute('baz' => 
31         accessor => 'baz',
32     );  
33     
34     Foo->meta->add_attribute('gorch' => 
35         reader => { 'get_gorch', => sub { (shift)->{gorch} } }
36     );       
37
38     package Bar;
39     use metaclass;
40     Bar->meta->superclasses('Foo');
41
42     Bar->meta->add_attribute('quux' =>
43         accessor => 'quux',
44     );
45 }
46
47 can_ok('Foo', 'get_bar');
48 can_ok('Foo', 'set_bar');    
49 can_ok('Foo', 'baz');    
50 can_ok('Foo', 'get_gorch');    
51
52 ok(Foo->meta->has_attribute('bar'), '... Foo has the attribute bar');
53 ok(Foo->meta->has_attribute('baz'), '... Foo has the attribute baz');
54 ok(Foo->meta->has_attribute('gorch'), '... Foo has the attribute gorch');
55
56 my $bar_attr = Foo->meta->get_attribute('bar');
57 my $baz_attr = Foo->meta->get_attribute('baz');
58 my $gorch_attr = Foo->meta->get_attribute('gorch');
59
60 is($bar_attr->reader, 'get_bar', '... the bar attribute has the reader get_bar');
61 is($bar_attr->writer, 'set_bar', '... the bar attribute has the writer set_bar');    
62 is($bar_attr->associated_class, Foo->meta, '... and the bar attribute is associated with Foo->meta');
63
64 is($bar_attr->get_read_method,  'get_bar', '... $attr does have an read method');
65 is($bar_attr->get_write_method, 'set_bar', '... $attr does have an write method');    
66
67 {
68     my $reader = $bar_attr->get_read_method_ref;
69     my $writer = $bar_attr->get_write_method_ref;        
70     
71     isa_ok($reader, 'Class::MOP::Method');
72     isa_ok($writer, 'Class::MOP::Method');        
73     
74     is($reader->fully_qualified_name, 'Foo::get_bar', '... it is the sub we are looking for');
75     is($writer->fully_qualified_name, 'Foo::set_bar', '... it is the sub we are looking for');
76     
77     is(reftype($reader->body), 'CODE', '... it is a plain old sub');
78     is(reftype($writer->body), 'CODE', '... it is a plain old sub');                
79 }
80
81 is($baz_attr->accessor, 'baz', '... the bar attribute has the accessor baz');
82 is($baz_attr->associated_class, Foo->meta, '... and the bar attribute is associated with Foo->meta');
83
84 is($baz_attr->get_read_method,  'baz', '... $attr does have an read method');
85 is($baz_attr->get_write_method, 'baz', '... $attr does have an write method');    
86
87 {
88     my $reader = $baz_attr->get_read_method_ref;
89     my $writer = $baz_attr->get_write_method_ref;        
90     
91     isa_ok($reader, 'Class::MOP::Method');
92     isa_ok($writer, 'Class::MOP::Method');  
93     
94     is($reader, $writer, '... they are the same method');      
95     
96     is($reader->fully_qualified_name, 'Foo::baz', '... it is the sub we are looking for');
97     is($writer->fully_qualified_name, 'Foo::baz', '... it is the sub we are looking for');              
98 }
99
100 is(ref($gorch_attr->reader), 'HASH', '... the gorch attribute has the reader get_gorch (HASH ref)');
101 is($gorch_attr->associated_class, Foo->meta, '... and the gorch attribute is associated with Foo->meta');
102
103 is($gorch_attr->get_read_method,  'get_gorch', '... $attr does have an read method');
104 ok(!$gorch_attr->get_write_method, '... $attr does not have an write method');    
105
106 {
107     my $reader = $gorch_attr->get_read_method_ref;
108     my $writer = $gorch_attr->get_write_method_ref;        
109     
110     isa_ok($reader, 'Class::MOP::Method');
111     ok(!blessed($writer), '... it is not a plain old sub'); 
112     
113     is($reader->fully_qualified_name, 'Foo::get_gorch', '... it is the sub we are looking for');
114 }
115
116 my $foo = bless {}, 'Foo';
117 $foo->set_bar(1);
118 $foo->baz(10);
119
120 is_deeply($foo->meta->get_attribute_values($foo), {
121     bar => 1,
122     baz => 10,
123 });
124
125 my $bar = bless {}, 'Bar';
126 $bar->set_bar(99);
127
128 is_deeply($bar->meta->get_attribute_values($bar), {
129     bar => 99,
130 });
131
132 $bar->quux(1337);
133
134 is_deeply($bar->meta->get_attribute_values($bar), {
135     bar  => 99,
136     quux => 1337,
137 });
138