comparison test/runtests @ 173:3413a88f4d09

Added test framework
author lost@l-w.ca
date Wed, 07 Sep 2011 20:45:20 -0600
parents
children 3cd8aa013b88
comparison
equal deleted inserted replaced
172:a88b04ba5ab8 173:3413a88f4d09
1 #!/usr/bin/perl
2 #
3 # This program will execute all programs in the "tests" directory. Each
4 # program is expected to produce output as follows on stdout:
5 #
6 # each line begins with a test name followed by whitespace followed by
7 # PASS, FAIL, or SKIP.
8 #
9 # stderr is not redirected during testing. Any test that might spam stderr
10 # is encouraged to redirect it somewhere useful.
11 #
12 # After each test script exits, a report indicating number passed, failed,
13 # and skipped is presented, or if the script failed to run.
14 #
15 # Once all tests have been run, a report showing the grand total number of
16 # tests performed, passed, failed, and skipped.
17 #
18 # Each test can be in any programming language that is appropriate for
19 # the task.
20 #
21 # Each test can assume the current directory is the root of the source tree.
22
23 use File::Basename;
24
25 $testdir = dirname($0) . '/tests';
26
27 opendir DH, $testdir;
28 while ($fe = readdir DH)
29 {
30 next if ($fe =~ /^\./);
31 next if ($fe =~ /~$/);
32
33 $fn = $testdir . '/' . $fe;
34
35 open P,"$fn|";
36 while (<P>)
37 {
38 chomp;
39 ($tn, $ts) = split /\s+/;
40 $testresults{$fe}{$tn} = $ts;
41 if ($ts eq 'PASS')
42 {
43 $testspassed += 1;
44 $testresults{$fe}{'..passed'} += 1;
45 }
46 elsif ($ts eq 'FAIL')
47 {
48 $testsfailed += 1;
49 $testresults{$fe}{'..failed'} =+ 1;
50 }
51 elsif ($ts eq 'SKIP')
52 {
53 $testsskipped += 1;
54 $testresults{$fe}{'..skipped'} += 1;
55 }
56 else
57 {
58 $testsunknown += 1;
59 $testresults{$fe}{'..unknown'} += 1;
60 }
61 $teststotal += 1;
62 $testresults{$fe}{'..total'} += 1;
63 }
64 close P;
65 $fdn = $fe;
66 $fdn =~ s/\..+?$//;
67 $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'});
68 print "$rline\n";
69 }
70 closedir DH;
71
72 print sprintf("\n===================\nTotal: %d/%d (%d skipped, %d unknown, %d failed)\n", $testspassed, $teststotal, $testsskipped, $testsunknown, $testsfailed);
73
74 if ($testspassed < $teststotal)
75 {
76 print "\nThe following tests either failed or were otherwise dubious:\n";
77 foreach $i (keys %testresults)
78 {
79 $fdn = $i;
80 $fdn =~ s/\..+?$//;
81 foreach $j (keys %{ $testresults{$i} })
82 {
83 next if $j =~ /^\./;
84 if ($testresults{$i}{$j} ne 'PASS')
85 {
86 print "$fdn/$j: $testresults{$i}{$j}\n";
87 }
88 }
89 }
90 exit 1;
91 }
92 exit 0;