view test/runtests @ 402:b20f14edda5a

Completed initial conversion to new parser allowing spaces in operands Converted the remaining addressing modes. This required a complete rewrite of a large portion of the indexed addressing parser. Now the entire indexed parsing system is programmatic without cheating with a lookup table. This update also fixes the "force 0,r" by writing a literal 0,r which is *supposed* to work. There will likely be some pseudo ops that need tweaking for space handling, specially those that take multiple operands of some description which are not expressions. (The expression parser call eats the spaces both before and after the expression, if appropriate.)
author William Astle <lost@l-w.ca>
date Wed, 14 Oct 2015 20:49:41 -0600
parents 3413a88f4d09
children 3cd8aa013b88
line wrap: on
line source

#!/usr/bin/perl
#
# This program will execute all programs in the "tests" directory. Each
# program is expected to produce output as follows on stdout:
#
# each line begins with a test name followed by whitespace followed by
# PASS, FAIL, or SKIP.
#
# stderr is not redirected during testing. Any test that might spam stderr
# is encouraged to redirect it somewhere useful.
#
# After each test script exits, a report indicating number passed, failed,
# and skipped is presented, or if the script failed to run.
#
# Once all tests have been run, a report showing the grand total number of
# tests performed, passed, failed, and skipped.
#
# Each test can be in any programming language that is appropriate for
# the task.
#
# Each test can assume the current directory is the root of the source tree.

use File::Basename;

$testdir = dirname($0) . '/tests';

opendir DH, $testdir;
while ($fe = readdir DH)
{
	next if ($fe =~ /^\./);
	next if ($fe =~ /~$/);
	
	$fn = $testdir . '/' . $fe;

	open P,"$fn|";
	while (<P>)
	{
		chomp;
		($tn, $ts) = split /\s+/;
		$testresults{$fe}{$tn} = $ts;
		if ($ts eq 'PASS')
		{
			$testspassed += 1;
			$testresults{$fe}{'..passed'} += 1;
		}
		elsif ($ts eq 'FAIL')
		{
			$testsfailed += 1;
			$testresults{$fe}{'..failed'} =+ 1;
		}
		elsif ($ts eq 'SKIP')
		{
			$testsskipped += 1;
			$testresults{$fe}{'..skipped'} += 1;
		}
		else
		{
			$testsunknown += 1;
			$testresults{$fe}{'..unknown'} += 1;
		}
		$teststotal += 1;
		$testresults{$fe}{'..total'} += 1;
	}
	close P;
	$fdn = $fe;
	$fdn =~ s/\..+?$//;
	$rline = sprintf("%-25.25s: %d/%d (%d skipped, %d unknown, %d failed)",  $fdn, $testresults{$fe}{'..passed'}, $testresults{$fe}{'..total'}, $testresults{$fe}{'..skipped'}, $testresults{$fe}{'..unknown'}, $testresults{$fe}{'..failed'});
	print "$rline\n";
}
closedir DH;

print sprintf("\n===================\nTotal: %d/%d (%d skipped, %d unknown, %d failed)\n", $testspassed, $teststotal, $testsskipped, $testsunknown, $testsfailed);

if ($testspassed < $teststotal)
{
	print "\nThe following tests either failed or were otherwise dubious:\n";
	foreach $i (keys %testresults)
	{
		$fdn = $i;
		$fdn =~ s/\..+?$//;
		foreach $j (keys %{ $testresults{$i} })
		{
			next if $j =~ /^\./;
			if ($testresults{$i}{$j} ne 'PASS')
			{
				print "$fdn/$j: $testresults{$i}{$j}\n";
			}
		}
	}
	exit 1;
}
exit 0;