webgui/t/00_compile.t
Graham Knop 3049435e28 large revisions to syntax checker to be faster and more useful
It now only fails for compile warnings in WebGUI files, not prereqs.
The compile checks on the upgrades and utility scripts run much faster,
resulting in the entire test taking about 10% of the time it previously
did.  It will also BAIL_OUT for any compile errors, preventing any other
tests from being run.
2009-09-16 21:07:47 -05:00

108 lines
3 KiB
Perl

#-------------------------------------------------------------------
# WebGUI is Copyright 2001-2009 Plain Black Corporation.
#-------------------------------------------------------------------
# Please read the legal notices (docs/legal.txt) and the license
# (docs/license.txt) that came with this distribution before using
# this software.
#-------------------------------------------------------------------
# http://www.plainblack.com info@plainblack.com
#-------------------------------------------------------------------
use strict;
use warnings;
# We don't load WebGUI::Test, because we want to test the
# loading of WebGUI::Session ourselves
use Test::More;
use File::Find;
use File::Spec;
use File::Spec::Functions;
use File::Basename;
use Cwd qw(realpath);
my $wgRoot = realpath catdir(dirname(__FILE__), updir);
my $wgLib = catdir($wgRoot, 'lib');
my @modules = findModules($wgLib);
my @scripts = findScripts(catdir($wgRoot, 'docs', 'upgrades'), catdir($wgRoot, 'sbin'));
plan tests => 2 * (scalar @modules + scalar @scripts);
my $failed_compile = 0;
foreach my $library (@modules) {
my $warnings = '';
local $^W = 1;
local $SIG{__WARN__} = sub {
my $warn = shift;
# file the warning occurred in
my $warning_file = realpath( (caller(0))[1] );
# only care about it if it is within the WebGUI lib directory
if ($warning_file =~ /^\Q$wgLib/) {
$warnings .= $warn;
}
};
eval {
require $library;
};
chomp $warnings;
is($@, '', "$library compiles successfully")
|| $failed_compile++;
is($warnings, '', "$library compiles without warnings");
}
my $script_compiler = <<'END_SCRIPT';
return 1;
package WebGUI::Test::ScriptTest::%s;
use warnings;
# line 1 "%s"
%s
END_SCRIPT
for my $script (@scripts) {
open my $fh, '<', $script;
my $script_content = do { local $/; <$fh> };
close $fh;
my $short_name = File::Spec->abs2rel($script, $wgRoot);
my $package_name = $script;
$package_name =~ s{.*/}{}msx;
$package_name =~ s/\W//msxg;
my $to_compile = sprintf $script_compiler, $package_name, $short_name, $script_content;
my $warnings = '';
local $SIG{__WARN__} = sub {
$warnings .= shift;
};
eval $to_compile;
chomp $warnings;
is($@, '', "$short_name compiles successfully");
is($warnings, '', "$short_name compiles without warnings");
}
if ($failed_compile) {
BAIL_OUT("Failed to compile $failed_compile modules!");
}
#----------------------------------------
sub findModules {
my $libDir = shift;
my @modules;
File::Find::find( {
no_chdir => 1,
wanted => sub {
return unless $File::Find::name =~ /\.pm$/;
my $lib = File::Spec->abs2rel($File::Find::name, $libDir);
push @modules, $lib;
},
}, $libDir);
return @modules;
}
sub findScripts {
my @scripts;
for my $dir (@_) {
push @scripts, glob("$dir/*.pl");
}
return @scripts;
}