ChangeLog and adding yuval to authors everywhere
[gitmo/Class-MOP.git] / t / 060_instance.t
CommitLineData
2bab2be6 1#!/usr/bin/perl
2
3use strict;
4use warnings;
5
ee7c0467 6use Test::More tests => 39;
2bab2be6 7use Test::Exception;
8
5582521c 9use Scalar::Util qw/isweak reftype/;
10
2bab2be6 11BEGIN {
12 use_ok('Class::MOP::Instance');
13}
14
de943e6a 15can_ok( "Class::MOP::Instance", $_ ) for qw/
49c93440 16 new
17
de943e6a 18 create_instance
19 bless_instance_structure
20
49c93440 21 get_all_slots
ee7c0467 22
23 initialize_all_slots
de943e6a 24
25 get_slot_value
26 set_slot_value
c174112e 27 initialize_slot
c174112e 28 is_slot_initialized
ee7c0467 29 weaken_slot_value
30 strengthen_slot_value
31
32 inline_get_slot_value
33 inline_set_slot_value
34 inline_initialize_slot
35 inline_is_slot_initialized
36 inline_weaken_slot_value
37 inline_strengthen_slot_value
de943e6a 38/;
39
40{
41 package Foo;
42 use metaclass;
49c93440 43
44 Foo->meta->add_attribute('moosen');
de943e6a 45
46 package Bar;
47 use metaclass;
48 use base qw/Foo/;
de943e6a 49
49c93440 50 Bar->meta->add_attribute('elken');
51}
de943e6a 52
49c93440 53my $mi_foo = Foo->meta->get_meta_instance;
54isa_ok($mi_foo, "Class::MOP::Instance");
de943e6a 55
49c93440 56is_deeply(
57 [ $mi_foo->get_all_slots ],
58 [ "moosen" ],
59 '... get all slots for Foo');
de943e6a 60
61my $mi_bar = Bar->meta->get_meta_instance;
49c93440 62isa_ok($mi_bar, "Class::MOP::Instance");
de943e6a 63
49c93440 64isnt($mi_foo, $mi_bar, '... they are not the same instance');
de943e6a 65
49c93440 66is_deeply(
67 [ sort $mi_bar->get_all_slots ],
68 [ "elken", "moosen" ],
69 '... get all slots for Bar');
de943e6a 70
49c93440 71my $i_foo = $mi_foo->create_instance;
72isa_ok($i_foo, "Foo");
de943e6a 73
49c93440 74{
75 my $i_foo_2 = $mi_foo->create_instance;
76 isa_ok($i_foo_2, "Foo");
77 isnt($i_foo_2, $i_foo, '... not the same instance');
78 is_deeply($i_foo, $i_foo_2, '... but the same structure');
79}
de943e6a 80
49c93440 81ok(!defined($mi_foo->get_slot_value( $i_foo, "moosen" )), "... no value for slot");
de943e6a 82
de943e6a 83$mi_foo->set_slot_value( $i_foo, "moosen", "the value" );
84
49c93440 85is($mi_foo->get_slot_value( $i_foo, "moosen" ), "the value", "... get slot value");
49c93440 86ok(!$i_foo->can('moosen'), '... Foo cant moosen');
5582521c 87
5582521c 88my $ref = [];
5582521c 89
ee7c0467 90$mi_foo->set_slot_value( $i_foo, "moosen", $ref );
91$mi_foo->weaken_slot_value( $i_foo, "moosen" );
5582521c 92
ee7c0467 93ok( isweak($i_foo->{moosen}), '... white box test of weaken' );
94is( $mi_foo->get_slot_value( $i_foo, "moosen" ), $ref, "weak value is fetchable" );
5582521c 95ok( !isweak($mi_foo->get_slot_value( $i_foo, "moosen" )), "return value not weak" );
96
97undef $ref;
98
99is( $mi_foo->get_slot_value( $i_foo, "moosen" ), undef, "weak value destroyed" );
100
101$ref = [];
102
103$mi_foo->set_slot_value( $i_foo, "moosen", $ref );
104
105undef $ref;
106
107is( reftype( $mi_foo->get_slot_value( $i_foo, "moosen" ) ), "ARRAY", "value not weak yet" );
108
109$mi_foo->weaken_slot_value( $i_foo, "moosen" );
110
111is( $mi_foo->get_slot_value( $i_foo, "moosen" ), undef, "weak value destroyed" );
112
5582521c 113$ref = [];
114
115$mi_foo->set_slot_value( $i_foo, "moosen", $ref );
5582521c 116$mi_foo->weaken_slot_value( $i_foo, "moosen" );
ee7c0467 117ok( isweak($i_foo->{moosen}), '... white box test of weaken' );
5582521c 118$mi_foo->strengthen_slot_value( $i_foo, "moosen" );
ee7c0467 119ok( !isweak($i_foo->{moosen}), '... white box test of weaken' );
5582521c 120
121undef $ref;
122
123is( reftype( $mi_foo->get_slot_value( $i_foo, "moosen" ) ), "ARRAY", "weak value can be strengthened" );
124