-
Notifications
You must be signed in to change notification settings - Fork 26
/
gen-tests.perl
117 lines (88 loc) · 2.82 KB
/
gen-tests.perl
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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
#!/usr/bin/perl -w
# rocco // vim: ts=2 sw=2 expandtab
use strict;
use File::Spec;
use File::Path;
BEGIN {
eval "require POE::Test::Loops";
if ($@) {
warn "Could not load POE::Test::Loops. Skipping loop tests";
exit;
}
}
my $test_base = "t";
### Resources, and their perl and XS implementations.
{
my $base_dir = File::Spec->catfile($test_base, "20_resources");
my $base_lib = File::Spec->catfile($base_dir, "00_base");
my %derived_conf = (
"10_perl" => { implementation => "perl" },
# TODO - Enable when an XS implementation arrives.
# "20_xs" => { implementation => "xs" },
);
my $source = (
"#!/usr/bin/perl -w\n" .
"\n" .
"use strict;\n" .
"use lib qw(--base_lib--);\n" .
"use Test::More;\n" .
"\n" .
"\$ENV{POE_IMPLEMENTATION} = '--implementation--';\n" .
"\n" .
"require '--base_file--';\n" .
"\n" .
"CORE::exit 0;\n"
);
derive_files(
base_dir => $base_dir,
base_lib => $base_lib,
derived_conf => \%derived_conf,
src_template => $source,
);
}
### Event loops and the tests that love them.
{
my $base_dir = File::Spec->catfile($test_base, "30_loops");
my @loops = qw(Select IO::Poll);
POE::Test::Loops::generate($base_dir, \@loops);
}
exit 0;
sub derive_files {
my %conf = @_;
my $base_dir = $conf{base_dir};
# Gather the list of base files. Each will be used to generate a
# real test file.
opendir BASE, $conf{base_lib} or die $!;
my @base_files = grep /\.pm$/, readdir(BASE);
closedir BASE;
# Generate a set of test files for each configuration.
foreach my $dst_dir (keys %{$conf{derived_conf}}) {
my $full_dst = File::Spec->catfile($base_dir, $dst_dir);
$full_dst =~ tr[/][/]s;
$full_dst =~ s{/+$}{};
my %template_conf = %{$conf{derived_conf}{$dst_dir}};
# Blow away any previously generated test files.
rmtree($full_dst);
mkpath($full_dst, 0, 0755);
# For each base file, generate a corresponding one in the
# configured destination directory. Expand various bits to
# customize the test.
foreach my $base_file (@base_files) {
my $full_file = File::Spec->catfile($full_dst, $base_file);
$full_file =~ s/\.pm$/.t/;
# These hardcoded expansions are for the base file to be
# required, and the base library directory where it'll be found.
my $expanded_src = $conf{src_template};
$expanded_src =~ s/--base_file--/$base_file/g;
$expanded_src =~ s/--base_lib--/$conf{base_lib}/g;
# The others are plugged in from the directory configuration.
while (my ($key, $val) = each %template_conf) {
$expanded_src =~ s/--\Q$key\E--/$val/g;
}
# Write with lots of error checking.
open EXPANDED, ">$full_file" or die $!;
print EXPANDED $expanded_src;
close EXPANDED or die $!;
}
}
}