]> git.vpit.fr Git - perl/modules/Variable-Magic.git/blob - t/11-multiple.t
Importing Variable-Magic-0.09.tar.gz
[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 + 24;
7
8 use Variable::Magic qw/wizard cast dispell VMG_UVAR/;
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');
78
79 SKIP: {
80  skip 'No nice uvar magic for this perl', 24 unless VMG_UVAR;
81
82  $n = 2;
83  @c = (0) x $n;
84
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 ($@)");
89
90  multi sub {
91   my ($i) = @_;
92   $w[$i]
93  }, sub {
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");
97  };
98
99  my %h = (a => 1, b => 2);
100
101  multi sub {
102   my ($i) = @_;
103   cast %h, $w[$i];
104  }, sub {
105   my ($i, $res, $err) = @_;
106   ok(!$err, "cast uvar magic $i croaks ($err)");
107   ok($res, "cast uvar magic $i invalid");
108  };
109
110  my $s = $h{a};
111  ok($s == 1, 'fetch magic doesn\'t clobber');
112  for (0 .. $n - 1) { ok($c[$_] == 1, "fetch magic $_"); }
113
114  $h{a} = 3;
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
117
118  my $res = eval { dispell %h, $w[1] };
119  ok(!$@, "dispell uvar magic 1 croaks ($@)");
120  ok($res, 'dispell uvar magic 1 invalid');
121
122  $s = $h{b};
123  ok($s == 2, 'fetch magic after dispelled 1 doesn\'t clobber');
124  for (0) { ok($c[$_] == 2, "fetch magic $_ after dispelled 1"); }
125  
126  $h{b} = 4;
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
129
130  $res = eval { dispell %h, $w[0] };
131  ok(!$@, "dispell uvar magic 0 croaks ($@)");
132  ok($res, 'dispell uvar magic 0 invalid');
133 }