X-Git-Url: http://git.vpit.fr/?a=blobdiff_plain;f=t%2F11-multiple.t;h=fc68cf22b04716f1179c22423d85e700d7377d8f;hb=9450733a5414bcd69ef9d3c283c88fb440ffa036;hp=21f37d23d492bf6ca3c0fba61812c68da3e637e2;hpb=14f66d40970bef63105be046a109c1a32859a8a0;p=perl%2Fmodules%2FVariable-Magic.git diff --git a/t/11-multiple.t b/t/11-multiple.t index 21f37d2..fc68cf2 100644 --- a/t/11-multiple.t +++ b/t/11-multiple.t @@ -3,9 +3,9 @@ use strict; use warnings; -use Test::More tests => 33; +use Test::More tests => 33 + 24; -use Variable::Magic qw/wizard cast dispell/; +use Variable::Magic qw/wizard cast dispell VMG_UVAR/; my $n = 3; my @w; @@ -75,3 +75,59 @@ ok($c[2] == 0, 'set magic 2 after dispelled 1 & 0'); $res = eval { dispell $a, $w[2] }; ok(!$@, "dispell magic 2 croaks ($@)"); ok($res, 'dispell magic 2 invalid'); + +SKIP: { + skip 'No nice uvar magic for this perl', 24 unless VMG_UVAR; + + $n = 2; + @c = (0) x $n; + + eval { $w[0] = wizard fetch => sub { ++$c[0] }, store => sub { --$c[0] } }; + ok(!$@, "wizard with uvar 0 creation error ($@)"); + eval { $w[1] = wizard fetch => sub { ++$c[1] }, store => sub { --$c[1] } }; + ok(!$@, "wizard with uvar 1 creation error ($@)"); + + multi sub { + my ($i) = @_; + $w[$i] + }, sub { + my ($i, $res, $err) = @_; + ok(defined $res, "wizard with uvar $i is defined"); + ok(ref($w[$i]) eq 'SCALAR', "wizard with uvar $i is a scalar ref"); + }; + + my %h = (a => 1, b => 2); + + multi sub { + my ($i) = @_; + cast %h, $w[$i]; + }, sub { + my ($i, $res, $err) = @_; + ok(!$err, "cast uvar magic $i croaks ($err)"); + ok($res, "cast uvar magic $i invalid"); + }; + + my $s = $h{a}; + ok($s == 1, 'fetch magic doesn\'t clobber'); + for (0 .. $n - 1) { ok($c[$_] == 1, "fetch magic $_"); } + + $h{a} = 3; + for (0 .. $n - 1) { ok($c[$_] == 0, "store magic $_"); } + ok($h{a} == 3, 'store magic doesn\'t clobber'); # $c[$_] == 1 for 0 .. 1 + + my $res = eval { dispell %h, $w[1] }; + ok(!$@, "dispell uvar magic 1 croaks ($@)"); + ok($res, 'dispell uvar magic 1 invalid'); + + $s = $h{b}; + ok($s == 2, 'fetch magic after dispelled 1 doesn\'t clobber'); + for (0) { ok($c[$_] == 2, "fetch magic $_ after dispelled 1"); } + + $h{b} = 4; + for (0) { ok($c[$_] == 1, "store magic $_ after dispelled 1"); } + ok($h{b} == 4, 'store magic doesn\'t clobber'); # $c[$_] == 2 for 0 + + $res = eval { dispell %h, $w[0] }; + ok(!$@, "dispell uvar magic 0 croaks ($@)"); + ok($res, 'dispell uvar magic 0 invalid'); +}