6 use Test::More tests => 33 + 24;
8 use Variable::Magic qw/wizard cast dispell VMG_UVAR/;
15 my ($cb, $tests) = @_;
16 for (my $i = 0; $i < $n; ++$i) {
17 my $res = eval { $cb->($i) };
18 $tests->($i, $res, $@);
22 eval { $w[0] = wizard get => sub { ++$c[0] }, set => sub { --$c[0] } };
23 ok(!$@, "wizard 0 creation error ($@)");
24 eval { $w[1] = wizard get => sub { ++$c[1] }, set => sub { --$c[1] } };
25 ok(!$@, "wizard 1 creation error ($@)");
26 eval { $w[2] = wizard get => sub { ++$c[2] }, set => sub { --$c[2] } };
27 ok(!$@, "wizard 2 creation error ($@)");
33 my ($i, $res, $err) = @_;
34 ok(defined $res, "wizard $i is defined");
35 ok(ref($w[$i]) eq 'SCALAR', "wizard $i is a scalar ref");
44 my ($i, $res, $err) = @_;
45 ok(!$err, "cast magic $i croaks ($err)");
46 ok($res, "cast magic $i invalid");
50 for (0 .. $n - 1) { ok($c[$_] == 1, "get magic $_"); }
53 for (0 .. $n - 1) { ok($c[$_] == 0, "set magic $_"); }
55 my $res = eval { dispell $a, $w[1] };
56 ok(!$@, "dispell magic 1 croaks ($@)");
57 ok($res, 'dispell magic 1 invalid');
60 for (0, 2) { ok($c[$_] == 1, "get magic $_ after dispelled 1"); }
63 for (0, 2) { ok($c[$_] == 0, "set magic $_ after dispelled 1"); }
65 $res = eval { dispell $a, $w[0] };
66 ok(!$@, "dispell magic 0 croaks ($@)");
67 ok($res, 'dispell magic 0 invalid');
70 ok($c[2] == 1, 'get magic 2 after dispelled 1 & 0');
73 ok($c[2] == 0, 'set magic 2 after dispelled 1 & 0');
75 $res = eval { dispell $a, $w[2] };
76 ok(!$@, "dispell magic 2 croaks ($@)");
77 ok($res, 'dispell magic 2 invalid');
80 skip 'No nice uvar magic for this perl', 24 unless VMG_UVAR;
85 eval { $w[0] = wizard fetch => sub { ++$c[0] }, store => sub { --$c[0] } };
86 ok(!$@, "wizard with uvar 0 creation error ($@)");
87 eval { $w[1] = wizard fetch => sub { ++$c[1] }, store => sub { --$c[1] } };
88 ok(!$@, "wizard with uvar 1 creation error ($@)");
94 my ($i, $res, $err) = @_;
95 ok(defined $res, "wizard with uvar $i is defined");
96 ok(ref($w[$i]) eq 'SCALAR', "wizard with uvar $i is a scalar ref");
99 my %h = (a => 1, b => 2);
105 my ($i, $res, $err) = @_;
106 ok(!$err, "cast uvar magic $i croaks ($err)");
107 ok($res, "cast uvar magic $i invalid");
111 ok($s == 1, 'fetch magic doesn\'t clobber');
112 for (0 .. $n - 1) { ok($c[$_] == 1, "fetch magic $_"); }
115 for (0 .. $n - 1) { ok($c[$_] == 0, "store magic $_"); }
116 ok($h{a} == 3, 'store magic doesn\'t clobber'); # $c[$_] == 1 for 0 .. 1
118 my $res = eval { dispell %h, $w[1] };
119 ok(!$@, "dispell uvar magic 1 croaks ($@)");
120 ok($res, 'dispell uvar magic 1 invalid');
123 ok($s == 2, 'fetch magic after dispelled 1 doesn\'t clobber');
124 for (0) { ok($c[$_] == 2, "fetch magic $_ after dispelled 1"); }
127 for (0) { ok($c[$_] == 1, "store magic $_ after dispelled 1"); }
128 ok($h{b} == 4, 'store magic doesn\'t clobber'); # $c[$_] == 2 for 0
130 $res = eval { dispell %h, $w[0] };
131 ok(!$@, "dispell uvar magic 0 croaks ($@)");
132 ok($res, 'dispell uvar magic 0 invalid');