]> git.vpit.fr Git - perl/modules/Variable-Magic.git/blob - t/11-multiple.t
This is 0.64
[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 + 41;
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 is($@, '', 'wizard 0 creation doesn\'t croak');
24 eval { $w[1] = wizard get => sub { ++$c[1] }, set => sub { --$c[1] } };
25 is($@, '', 'wizard 1 creation doesn\'t croak');
26 eval { $w[2] = wizard get => sub { ++$c[2] }, set => sub { --$c[2] } };
27 is($@, '', 'wizard 2 creation doesn\'t croak');
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  is(ref $w[$i], '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  is($err, '', "cast magic $i doesn't croak");
46  ok($res,     "cast magic $i is valid");
47 };
48
49 my $b = $a;
50 for (0 .. $n - 1) { is($c[$_], 1, "get magic $_"); }
51
52 $a = 1;
53 for (0 .. $n - 1) { is($c[$_], 0, "set magic $_"); }
54
55 my $res = eval { dispell $a, $w[1] };
56 is($@, '', 'dispell magic 1 doesn\'t croak');
57 ok($res,   'dispell magic 1 is valid');
58
59 $b = $a;
60 for (0, 2) { is($c[$_], 1, "get magic $_ after dispelled 1"); }
61
62 $a = 2;
63 for (0, 2) { is($c[$_], 0, "set magic $_ after dispelled 1"); }
64
65 $res = eval { dispell $a, $w[0] };
66 is($@, '', 'dispell magic 0 doesn\'t croak');
67 ok($res,   'dispell magic 0 is valid');
68
69 $b = $a;
70 is($c[2], 1, 'get magic 2 after dispelled 1 & 0');
71
72 $a = 3;
73 is($c[2], 0, 'set magic 2 after dispelled 1 & 0');
74
75 $res = eval { dispell $a, $w[2] };
76 is($@, '', 'dispell magic 2 doesn\'t croak');
77 ok($res,   'dispell magic 2 is valid');
78
79 SKIP: {
80  skip 'No nice uvar magic for this perl' => 41 unless VMG_UVAR;
81
82  $n = 3;
83  @c = (0) x $n;
84
85  eval { $w[0] = wizard fetch => sub { ++$c[0] }, store => sub { --$c[0] } };
86  is($@, '', 'wizard with uvar 0 doesn\'t croak');
87  eval { $w[1] = wizard fetch => sub { ++$c[1] }, store => sub { --$c[1] } };
88  is($@, '', 'wizard with uvar 1 doesn\'t croak');
89  eval { $w[2] = wizard fetch => sub { ++$c[2] }, store => sub { --$c[2] } };
90  is($@, '', 'wizard with uvar 2 doesn\'t croak');
91
92  multi sub {
93   my ($i) = @_;
94   $w[$i]
95  }, sub {
96   my ($i, $res, $err) = @_;
97   ok(defined $res,         "wizard with uvar $i is defined");
98   is(ref $w[$i], 'SCALAR', "wizard with uvar $i is a scalar ref");
99  };
100
101  my %h = (a => 1, b => 2);
102
103  multi sub {
104   my ($i) = @_;
105   cast %h, $w[$i];
106  }, sub {
107   my ($i, $res, $err) = @_;
108   is($err, '', "cast uvar magic $i doesn't croak");
109   ok($res,     "cast uvar magic $i is valid");
110  };
111
112  my $s = $h{a};
113  is($s, 1, 'fetch magic doesn\'t clobber');
114  for (0 .. $n - 1) { is($c[$_], 1, "fetch magic $_"); }
115
116  $h{a} = 3;
117  for (0 .. $n - 1) { is($c[$_], 0, "store magic $_"); }
118  is($h{a}, 3, 'store magic doesn\'t clobber');
119  # $c[$_] == 1 for 0 .. 2
120
121  my $res = eval { dispell %h, $w[1] };
122  is($@, '', 'dispell uvar magic 1 doesn\'t croak');
123  ok($res,   'dispell uvar magic 1 is valid');
124
125  $s = $h{b};
126  is($s, 2, 'fetch magic after dispelled 1 doesn\'t clobber');
127  for (0, 2) { is($c[$_], 2, "fetch magic $_ after dispelled 1"); }
128
129  $h{b} = 4;
130  for (0, 2) { is($c[$_], 1, "store magic $_ after dispelled 1"); }
131  is($h{b}, 4, 'store magic after dispelled 1 doesn\'t clobber');
132  # $c[$_] == 2 for 0, 2
133
134  $res = eval { dispell %h, $w[2] };
135  is($@, '', 'dispell uvar magic 2 doesn\'t croak');
136  ok($res,   'dispell uvar magic 2 is valid');
137
138  $s = $h{b};
139  is($s, 4, 'fetch magic after dispelled 1,2 doesn\'t clobber');
140  for (0) { is($c[$_], 3, "fetch magic $_ after dispelled 1,2"); }
141
142  $h{b} = 6;
143  for (0) { is($c[$_], 2, "store magic $_ after dispelled 1,2"); }
144  is($h{b}, 6, 'store magic after dispelled 1,2 doesn\'t clobber');
145  # $c[$_] == 3 for 0
146
147  $res = eval { dispell %h, $w[0] };
148  is($@, '', 'dispell uvar magic 0 doesn\'t croak');
149  ok($res,   'dispell uvar magic 0 is valid');
150
151  $s = $h{b};
152  is($s, 6, 'fetch magic after dispelled 1,2,0 doesn\'t clobber');
153  $h{b} = 8;
154  is($h{b}, 8, 'store magic after dispelled 1,2,0 doesn\'t clobber');
155 }