Show More
Commit Description:
Various UI improvements.
Commit Description:
Various UI improvements.
References:
File last commit:
Show/Diff file:
Action:
FNA/lib/MojoShader/unit_tests/run_tests.pl
192 lines | 5.0 KiB | text/plain | PerlLexer
192 lines | 5.0 KiB | text/plain | PerlLexer
r0 | #!/usr/bin/perl -w | |||
use warnings; | ||||
use strict; | ||||
use Digest::SHA1; | ||||
use Cwd; | ||||
use FindBin qw($Bin); | ||||
my $testdir = $Bin; | ||||
undef $Bin; | ||||
#print("testdir is $testdir\n"); | ||||
my $binpath = getcwd(); | ||||
#print("binpath is $binpath\n"); | ||||
my $GPrintCmds = 0; | ||||
my @modules = qw( preprocessor assembler compiler parser ); | ||||
sub compare_files { | ||||
my ($a, $b, $endlines) = @_; | ||||
if (not open(FILE1, '<', $a)) { | ||||
return (0, "Couldn't open '$a' for checksum"); | ||||
} | ||||
if (not open(FILE2, '<', $b)) { | ||||
close(FILE1); | ||||
return (0, "Couldn't open '$b' for checksum"); | ||||
} | ||||
my $sha1 = Digest::SHA1->new; | ||||
my $sha2 = Digest::SHA1->new; | ||||
if (not $endlines) { | ||||
$sha1->addfile(*FILE1); | ||||
$sha2->addfile(*FILE2); | ||||
} else { | ||||
while (<FILE1>) { s/[\r\n]//g; $sha1->add($_); } | ||||
while (<FILE2>) { s/[\r\n]//g; $sha2->add($_); } | ||||
} | ||||
close(FILE1); | ||||
close(FILE2); | ||||
if ($sha1->hexdigest ne $sha2->hexdigest) { | ||||
return (0, "Result doesn't match expectations"); | ||||
} | ||||
return (1); | ||||
} | ||||
my %tests = (); | ||||
$tests{'output'} = sub { | ||||
my ($module, $fname) = @_; | ||||
my $output = 'unittest_tempoutput'; | ||||
my $desired = $fname . '.correct'; | ||||
my $cmd = undef; | ||||
my $endlines = 1; | ||||
# !!! FIXME: this should go elsewhere. | ||||
if ($module eq 'preprocessor') { | ||||
$cmd = "$binpath/mojoshader-compiler -P '$fname' -o '$output'"; | ||||
} else { | ||||
return (0, "Don't know how to do this module type"); | ||||
} | ||||
$cmd .= ' 2>/dev/null 1>/dev/null'; | ||||
print("$cmd\n") if ($GPrintCmds); | ||||
if (system($cmd) != 0) { | ||||
unlink($output) if (-f $output); | ||||
return (0, "External program reported error"); | ||||
} | ||||
if (not -f $output) { return (0, "Didn't get any output file"); } | ||||
my @retval = compare_files($desired, $output, $endlines); | ||||
unlink($output); | ||||
return @retval; | ||||
}; | ||||
$tests{'errors'} = sub { | ||||
my ($module, $fname) = @_; | ||||
my $error_output = 'unittest_temperroutput'; | ||||
my $output = 'unittest_tempoutput'; | ||||
my $desired = $fname . '.correct'; | ||||
my $cmd = undef; | ||||
my $endlines = 1; | ||||
# !!! FIXME: this should go elsewhere. | ||||
if ($module eq 'preprocessor') { | ||||
$cmd = "$binpath/mojoshader-compiler -P '$fname' -o '$output'"; | ||||
} else { | ||||
return (0, "Don't know how to do this module type"); | ||||
} | ||||
$cmd .= " 2>$error_output 1>/dev/null"; | ||||
print("$cmd\n") if ($GPrintCmds); | ||||
system($cmd); | ||||
unlink($output) if (-f $output); | ||||
if (not -f $error_output) { return (0, "Didn't get any error output"); } | ||||
my @retval = compare_files($desired, $error_output, $endlines); | ||||
unlink($error_output); | ||||
return @retval; | ||||
}; | ||||
my $totaltests = 0; | ||||
my $pass = 0; | ||||
my $fail = 0; | ||||
my $skip = 0; | ||||
my @fails = (); | ||||
my $result = ''; | ||||
chdir($testdir) or die("Failed to chdir('$testdir'): $!\n"); | ||||
foreach (@modules) { | ||||
my $module = $_; | ||||
foreach (keys %tests) { | ||||
my $testtype = $_; | ||||
my $fn = $tests{$_}; | ||||
my $d = "$module/$testtype"; | ||||
next if (not -d $d); # no tests at the moment. | ||||
opendir(TESTDIR, $d) || die("Failed to open dir '$d': $!\n"); | ||||
my $subsection = " ... $module / $testtype ...\n"; | ||||
print($subsection); | ||||
my $addedsubsection = 0; | ||||
my $fname = readdir(TESTDIR); | ||||
while (defined $fname) { | ||||
my $isfail = 0; | ||||
my $origfname = $fname; | ||||
$fname = readdir(TESTDIR); # set for next iteration. | ||||
next if (-d $origfname); | ||||
next if ($origfname =~ /\.correct\Z/); | ||||
my $fullfname = "$d/$origfname"; | ||||
my ($rc, $reason) = &$fn($module, $fullfname); | ||||
if ($rc == 1) { | ||||
$result = 'PASS'; | ||||
$pass++; | ||||
} elsif ($rc == 0) { | ||||
$isfail = 1; | ||||
$result = 'FAIL'; | ||||
$fail++; | ||||
} elsif ($rc == -1) { | ||||
$result = 'SKIP'; | ||||
$skip++; | ||||
} | ||||
if (defined $reason) { | ||||
$reason = " ($reason)"; | ||||
} else { | ||||
$reason = ''; | ||||
} | ||||
my $output = "$result ${origfname}${reason}\n"; | ||||
print($output); | ||||
if ($isfail) { | ||||
if (!$addedsubsection) { | ||||
$addedsubsection = 1; | ||||
push(@fails, $subsection); | ||||
} | ||||
push(@fails, $output); | ||||
} | ||||
$totaltests++; | ||||
} | ||||
closedir(TESTDIR); | ||||
} | ||||
} | ||||
if (scalar(@fails)) { | ||||
print("\n\n"); | ||||
print("*************************************************************\n"); | ||||
print("*************************************************************\n"); | ||||
print("** SOME TESTS FAILED! PLEASE CORRECT THE FOLLOWING ISSUES. **\n"); | ||||
print("*************************************************************\n"); | ||||
print("*************************************************************\n"); | ||||
print("\n"); | ||||
foreach (@fails) { | ||||
print $_; | ||||
} | ||||
print("\n\n"); | ||||
} | ||||
print("\n$totaltests tests, $pass passed, $fail failed, $skip skipped.\n\n"); | ||||
exit(($fail > 0) ? 1 : 0); | ||||
# end if run_tests.pl ... | ||||