blob: 24addddc44b8df72f7d41eaf635106d168512fe0 [file] [log] [blame]
#!/usr/bin/perl -w
use strict;
use lib 't/lib';
use Test::More;
use constant LIBS => 'lib/';
use constant FIRST => 'TAP::Parser';
read_manifest( 'MANIFEST', my $manifest = {} );
read_manifest( 'MANIFEST.CUMMULATIVE', my $manifest_cummulative = {} );
my @classes = uniq(
FIRST,
map { file_to_mod($_) } filter_lib( keys %$manifest )
);
plan tests => @classes * 2 + 1;
for my $class (@classes) {
use_ok $class or BAIL_OUT("Could not load $class");
is $class->VERSION, TAP::Parser->VERSION,
"... and $class should have the correct version";
}
my @orphans = diff(
[ filter_lib( keys %$manifest ) ],
[ filter_lib( keys %$manifest_cummulative ) ]
);
my @waifs = intersection( \@orphans, [ keys %INC ] );
unless ( ok 0 == @waifs, 'no old versions loaded' ) {
diag "\nThe following modules were loaded in error:\n";
for my $waif ( sort @waifs ) {
diag sprintf " %s (%s)\n", file_to_mod($waif), $INC{$waif};
}
diag "\n";
}
diag("Testing Test::Harness $Test::Harness::VERSION, Perl $], $^X")
unless $ENV{PERL_CORE};
sub intersection {
my ( $la, $lb ) = @_;
my %seen = map { $_ => 1 } @$la;
return grep { $seen{$_} } @$lb;
}
sub diff {
my ( $la, $lb ) = @_;
my %seen = map { $_ => 1 } @$la;
return grep { !$seen{$_}++ } @$lb;
}
sub uniq {
my %seen = ();
grep { !$seen{$_}++ } @_;
}
sub lib_matcher {
my @libs = @_;
my $re = join ')|(', map quotemeta, @libs;
return qr{^($re)};
}
sub filter_lib {
my $matcher = lib_matcher(LIBS);
return map { s{$matcher}{}; $_ }
grep {m{$matcher.+?\.pm$}} sort @_;
}
sub mod_to_file {
my $mod = shift;
$mod =~ s{::}{/}g;
return "$mod.pm";
}
sub file_to_mod {
my $file = shift;
$file =~ s{/}{::}g;
$file =~ s{\.pm$}{};
return $file;
}
sub read_manifest {
my ( $file, $into ) = @_;
open my $fh, '<', $file or die "Can't read $file: $!";
while (<$fh>) {
chomp;
s/\s*#.*//;
$into->{$_}++ if length $_;
}
return;
}