File: Magic.pm

package info (click to toggle)
libclass-contract-perl 1.14-9
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, forky, sid, trixie
  • size: 220 kB
  • sloc: perl: 1,434; makefile: 10
file content (81 lines) | stat: -rw-r--r-- 2,087 bytes parent folder | download | duplicates (6)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
package Magic;
#use strict;
use Exporter;
use vars qw( @ISA @EXPORT );
@ISA    = qw( Exporter );
@EXPORT = qw( ok );

sub debug { $::D || 0 }

sub import {
  printf("1..%d\n", count($_[0]));
  Magic->export_to_level(1,@_);
}

sub count {
  my $package = shift;
  local $/ = undef;
  open(SCRIPT, $0);
  my $code = <SCRIPT>;
  $code =~ s/\n__(DATA|END)__\n.*//s;
  $code =~ s/\n\n=pod\n\n.*?(\n\n=cut\n\n|$)//gs;
  my (@count) = $code =~ /::ok/gs;
  return (1 + scalar @count);
}

my $count = 2;
my %history;

sub ok(%) {
  my %p = (@_); # code, expect, desc, version, need
  my $ok = 0;
  exists $p{'code'} or die "->ok(code => \\&) required!";
  $p{'desc'} ||= '';

  return printf("# skip %-2s %s (\$VERSION < %s)\n",
		$count++, $p{'desc'}, $p{'version'})
    if (exists $p{'version'} and $Class::Contract::VERSION < $p{'version'});

  return printf("# skip %-2s %s\n          (duplicate test description)\n",
		$count++, $p{'desc'})
    if exists $history{$p{'desc'}};

  if (exists $p{'need'}) {
    $p{'need'} = [$p{'need'}]  unless (ref($p{'need'}) eq 'ARRAY');
    foreach my $test (@{$p{'need'}}) {
      return printf("# skip %-2s (test requires: '%s')\n", $count++, $test)
        unless $history{$test};
    }
  }

  undef $@;
  my $val = eval qq{$p{'code'}};
  $@ and $val = $@;

  if (exists $p{'expect'}) {
    if (ref($p{'expect'}) eq 'Regexp') {
      $ok = $val =~ /$p{'expect'}/;
      print "\t$count regex match on [$val]\n"  if debug;
    } elsif ($@) {
      $ok = 0;
      print STDERR "\tunexpected exception:\n$@\n";#  if debug;
    } else { # Is it a number or a string
      $ok = ($p{'expect'} =~ /^([+-]?)(?=\d|\.d)\d*(\.\d*)?([Ee]([+-]?\d+))?$/)
          ? ($val == $p{'expect'})
          : ($val eq $p{'expect'});
      print "\texpected=[$p{'expect'}]\n\tvalue=[$val]\n"  if debug;
    }
  } else {
    $ok = $val ? 1 : 0
  }

  $history{$p{'desc'}} = $ok;

  print 'not '  unless $ok;
  printf("ok %-6s %s\n", $count, $p{'desc'});
  $count++;
  return $ok
}

1;
__END__