test now doesn't run but is closer to the right structure
[p5sagit/Mutually-Assured-Destruction.git] / t / 01simple.t
CommitLineData
d2613725 1use strict;
2use warnings;
3use Test::More;
4use Scalar::Util qw(weaken);
5
6my %real;
7my %weak;
8
6e01520b 9my @names = qw(one two);
10
11my %next_name;
12
13foreach my $idx (-1 .. $#names-1) {
14 $next_name{$names[$idx+1]} = $names[$idx];
15}
16
17my %last_name = reverse %next_name;
18
19# construct objects
20
21foreach my $name (@names) {
22 weaken($weak{$name} = $real{$name} = bless({}, 'Foo'));
23}
24
25# setup forward and back pointers
26
27foreach my $name (@names) {
28 $real{$name}->{forward} = $real{$next_name{$name}};
29 weaken($real{$next_name{$name}->{back} = $real{$name});
30}
31
32# weaken last forward pointer
33
34weaken($real{$names[-1]}->{forward});
35
36# to test: undef each one in order
37# undef all but one
38# undef all and verify destruction
39
40
41
d2613725 42@weak{qw(one two)} = @real{qw(one two)} = ({}, {});
43
44weaken($_) for values %weak;
45
6e01520b 46$real{one}->{two} = $real{two};
47
48$real{two}->{one} = $real{one};
49
d2613725 50delete @real{keys %real};
51
52cmp_ok(
53 (scalar grep defined, values %weak), '==', 0,
54 'All objects destroyed now'
55);
56
57done_testing;