]> git.vpit.fr Git - perl/modules/Variable-Magic.git/blob - t/11-multiple.t
21f37d23d492bf6ca3c0fba61812c68da3e637e2
[perl/modules/Variable-Magic.git] / t / 11-multiple.t
1 #!perl -T
2
3 use strict;
4 use warnings;
5
6 use Test::More tests => 33;
7
8 use Variable::Magic qw/wizard cast dispell/;
9
10 my $n = 3;
11 my @w;
12 my @c = (0) x $n;
13
14 sub multi {
15  my ($cb, $tests) = @_;
16  for (my $i = 0; $i < $n; ++$i) {
17   my $res = eval { $cb->($i) };
18   $tests->($i, $res, $@);
19  }
20 }
21
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 ($@)");
28
29 multi sub {
30  my ($i) = @_;
31  $w[$i]
32 }, sub {
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");
36 };
37
38 my $a = 0;
39
40 multi sub {
41  my ($i) = @_;
42  cast $a, $w[$i];
43 }, sub {
44  my ($i, $res, $err) = @_;
45  ok(!$err, "cast magic $i croaks ($err)");
46  ok($res, "cast magic $i invalid");
47 };
48
49 my $b = $a;
50 for (0 .. $n - 1) { ok($c[$_] == 1, "get magic $_"); }
51
52 $a = 1;
53 for (0 .. $n - 1) { ok($c[$_] == 0, "set magic $_"); }
54
55 my $res = eval { dispell $a, $w[1] };
56 ok(!$@, "dispell magic 1 croaks ($@)");
57 ok($res, 'dispell magic 1 invalid');
58
59 $b = $a;
60 for (0, 2) { ok($c[$_] == 1, "get magic $_ after dispelled 1"); }
61
62 $a = 2;
63 for (0, 2) { ok($c[$_] == 0, "set magic $_ after dispelled 1"); }
64
65 $res = eval { dispell $a, $w[0] };
66 ok(!$@, "dispell magic 0 croaks ($@)");
67 ok($res, 'dispell magic 0 invalid');
68
69 $b = $a;
70 ok($c[2] == 1, 'get magic 2 after dispelled 1 & 0');
71
72 $a = 3;
73 ok($c[2] == 0, 'set magic 2 after dispelled 1 & 0');
74
75 $res = eval { dispell $a, $w[2] };
76 ok(!$@, "dispell magic 2 croaks ($@)");
77 ok($res, 'dispell magic 2 invalid');