]> git.vpit.fr Git - perl/modules/Variable-Magic.git/blob - t/lib/Variable/Magic/TestWatcher.pm
Make the watch { } wrapper properly apply context
[perl/modules/Variable-Magic.git] / t / lib / Variable / Magic / TestWatcher.pm
1 package Variable::Magic::TestWatcher;
2
3 use strict;
4 use warnings;
5
6 use Test::More;
7
8 use Carp qw<croak>;
9 use Variable::Magic qw<wizard>;
10
11 use base qw<Exporter>;
12
13 our @EXPORT = qw<init_watcher watch>;
14
15 sub _types {
16  my $t = shift;
17  return { } unless defined $t;
18  return {
19   ''      => sub { +{ $t => 1 } },
20   'ARRAY' => sub { my $h = { }; ++$h->{$_} for @$t; $h },
21   'HASH'  => sub { +{ map { $_ => $t->{$_} } grep $t->{$_}, keys %$t } }
22  }->{ref $t}->();
23 }
24
25 our ($wiz, $prefix, %mg);
26
27 sub init_watcher ($;$) {
28  croak 'can\'t initialize twice' if defined $wiz;
29  my $types = _types shift;
30  $prefix   = (defined) ? "$_: " : '' for shift;
31  %mg  = ();
32  $wiz = eval 'wizard ' . join(', ', map {
33   "$_ => sub { \$mg{$_}++;" . ($_ eq 'len' ? '$_[2]' : '0') . '}'
34  } keys %$types);
35  is        $@,   '',  $prefix . 'wizard() doesn\'t croak';
36  is_deeply \%mg, { }, $prefix . 'wizard() doesn\'t trigger magic';
37  return $wiz;
38 }
39
40 sub watch (&;$$) {
41  my $code = shift;
42  my $exp  = _types shift;
43  my $desc = shift;
44  my $want = wantarray;
45  my @ret;
46  local %mg = ();
47  local $Test::Builder::Level = ($Test::Builder::Level || 0) + 1;
48  local $@;
49  if (not defined $want) { # void context
50   eval { $code->() };
51  } elsif (not $want) { # scalar context
52   $ret[0] = eval { $code->() };
53  } else {
54   @ret = eval { $code->() };
55  }
56  is        $@,   '',   $prefix . $desc . ' doesn\'t croak';
57  is_deeply \%mg, $exp, $prefix . $desc . ' triggers magic correctly';
58  return $want ? @ret : $ret[0];
59 }
60
61 our $mg_end;
62
63 END {
64  if (defined $wiz) {
65   undef $wiz;
66   $mg_end = { } unless defined $mg_end;
67   is_deeply \%mg, $mg_end, $prefix . 'magic triggered at END time';
68  }
69 }
70
71 1;