Remove warning
[gitmo/MooseX-Antlers.git] / t / refwalk.t
CommitLineData
f211b9a5 1use Test::More;
0373380c 2use Scalar::Util qw(refaddr weaken isweak);
3use YAML::XS;
4use aliased 'MooseX::Antlers::RefTracker';
5use aliased 'MooseX::Antlers::RefFilter';
6
7my $foo = {
8 bar => { baz => [ 'quux', { fleem => 1 } ] },
9 skald => \[ { hot => 'story' } ],
10};
11
12my @expect = split "\n", <<'EOEXPECT';
13$foo
14$foo->{"bar"}
15$foo->{"skald"}
16${$foo->{"skald"}}
17${$foo->{"skald"}}->[0]
18EOEXPECT
19
20my $tracker = RefTracker->new({ root_name => '$foo' });
21
22$tracker->visit($foo);
23
24delete $foo->{bar}{baz};
25
26my $result = $tracker->traced_ref_map;
27
28is_deeply(
29 \@expect,
30 [ sort { length($a) <=> length($b) } values %$result ],
31 "Expected results present"
32);
33
34my %map = reverse %$result;
35
36foreach my $e (@expect) {
37 my $value = do {
38 local $@;
39 my $r = eval $e;
40 die "Error $@ evaluating $e" if $@;
41 $r;
42 };
43 is($map{$e},refaddr($value), "Result for ${e} ok");
44}
45
46my $flimflam = {
3946c1c0 47 one => { two => 'three' },
0373380c 48 bard => $foo->{skald},
49 bard_guts => ${$foo->{skald}},
50 empty_now => $foo->{bar},
51};
52
53weaken($flimflam->{weak_one} = $flimflam->{one});
54weaken($flimflam->{weak_member}[0] = $flimflam->{bard});
55weaken(${$flimflam->{weak_scalar}} = $flimflam->{bard_guts});
56
57#use Data::Dumper; $Data::Dumper::Indent = 1;
58
59#warn "Flimflam:\n".Dumper($flimflam);
60
61my $replacer = RefFilter->new({
62 external_mappings => $result,
63 root_name => '$final',
64});
65
66my $copyflam = $replacer->visit($flimflam);
67
68my $dump = Dump($copyflam);
69my $fixup = $replacer->fixup_code;
70
71#warn "Dump:\n".$dump;
72#warn "Fixup:\n".$fixup;
73
74my $final = Load($dump);
75
76#warn "Unfixed final:\n".Dumper($final);
77
78{
79 local $@;
80 eval $fixup;
81 die "fixup code died: $@" if $@;
82}
83
84#warn "Fixed final:\n".Dumper($final);
85
86is_deeply($flimflam, $final, 'Structures deeply the same after fixup');
87
88ok(isweak($final->{weak_one}), '$final->{weak_one} is a weak ref');
89ok(isweak($final->{weak_member}[0]), '$final->{weak_member}[0] is a weak ref');
90ok(isweak(${$final->{weak_scalar}}), '${$final->{weak_scalar}} is a weak ref');
f211b9a5 91
92done_testing;