/
Casefiles.pm
84 lines (65 loc) · 2.15 KB
/
Casefiles.pm
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
82
83
84
package Casefiles;
use strict;
use warnings;
use Carp;
use File::Find 1;
use File::Basename qw(basename);
use Test::More;
# Get optional test support
eval "use Test::Differences";
my $HAVE_DIFF = $@ eq '' ? 1 : 0;
#--------------------------------------------------------------------------#
# new
#--------------------------------------------------------------------------#
sub new {
my ($class, $data_dir) = @_;
# Verify directory
croak "Error: Couldn't read data directory"
if ( ! ( -e $data_dir && -r $data_dir ) );
# create blesed object
return bless { DATA_DIR => $data_dir }, $class;
}
#--------------------------------------------------------------------------#
# data_dir - accessor
#--------------------------------------------------------------------------#
sub data_dir { return $_[0]->{DATA_DIR} }
#--------------------------------------------------------------------------#
# files() - Return list of files
#--------------------------------------------------------------------------#
sub files {
my ($self) = shift;
my @case_files;
my $options = {
wanted => sub {
return if -d $File::Find::name;
push @case_files, $File::Find::name;
},
no_chdir => 1,
};
File::Find::finddepth( $options, $self->data_dir );
return @case_files;
}
#--------------------------------------------------------------------------#
# run_tests() - Run test for each case file
#--------------------------------------------------------------------------#
sub run_tests {
my ($self, $filter) = @_;
my @case_files = $self->files();
if ( not Test::More->builder->has_plan ) {
plan tests => scalar @case_files;
}
for my $case ( sort @case_files ) {
open my $fh, "<", $case
or die "Couldn't open file $case";
my $raw_data = do { local $/; <$fh> };
my ($input, $expected) = split /^#-+#\n/ms, $raw_data;
my $got = $filter->( $input );
if ( $HAVE_DIFF ) {
eq_or_diff( $got, $expected, basename( $case) );
}
else {
is( $got, $expected, basename( $case ) );
}
}
}
1;