]> git.vpit.fr Git - perl/modules/Variable-Magic.git/blob - t/lib/Variable/Magic/TestWatcher.pm
f9ba0ea1a91df2e4ddfad993b731ee04ec0330d8
[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  if (defined $want and not $want) { # scalar context
49   $ret[0] = eval { $code->() };
50  } else {
51   @ret = eval { $code->() };
52  }
53  is        $@,   '',   $prefix . $desc . ' doesn\'t croak';
54  is_deeply \%mg, $exp, $prefix . $desc . ' triggers magic correctly';
55  return $want ? @ret : $ret[0];
56 }
57
58 our $mg_end;
59
60 END {
61  if (defined $wiz) {
62   undef $wiz;
63   $mg_end = { } unless defined $mg_end;
64   is_deeply \%mg, $mg_end, $prefix . 'magic triggered at END time';
65  }
66 }
67
68 1;