| #use strict; |
| |
| # usage perl harness.pl [testNum] |
| # where testNum is an integer from 1 to 41 |
| # testNum may also be a list of integers denoting tests to be run |
| # ommitting testNum will lead to all tests being run |
| # |
| # this harness outputs the results to the file results.html as well |
| # as reporting them to stderr. |
| # |
| # note that the XInclude sample application must be discoverable on |
| # the current PATH. |
| |
| # |
| # Find out the platform from 'uname -s' |
| # |
| open(PLATFORM, "uname -s|"); |
| $platform = <PLATFORM>; |
| chomp($platform); |
| close (PLATFORM); |
| |
| if ($platform =~ m/Windows/i || $platform =~ m/CYGWIN/i) { |
| $pathsep = "\\"; |
| } |
| else { |
| $pathsep = "/"; |
| } |
| |
| @CORRECT_TEST_RESULTS = ( |
| -3, |
| 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, |
| 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, |
| 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, |
| 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, |
| 1 |
| ); |
| |
| # private static boolean[] TEST_RESULTS = new boolean[] { |
| # // one value for each test |
| # true, true, true, true, true, true, false, true, false, true, // 10 |
| # false, false, false, false, true, true, true, false, true, true, // 20 |
| # true, false, true, false, false, false, true, true, false, true, // 30 |
| # true, false, true, true, true, true, true, true, false, false, // 40 |
| # true, }; |
| |
| #no need to add one to this value since there is a dummy value in the tables |
| $NUM_TESTS = $#CORRECT_TEST_RESULTS; |
| |
| @ACTUAL_TEST_RESULTS = ( |
| -3, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| -1 |
| ); |
| |
| print "Running XInclude Tests\n"; |
| |
| $dateAndTime = localtime(); |
| |
| open(outfile, ">results.html"); |
| print outfile "<html><head><title>XInclude results generated at $dateAndTime </title>"; |
| print outfile "</head><body bgcolor=\"black\" text=\"white\"><center>"; |
| |
| print outfile "<table border cellspacing=\"0\" cellpadding=\"5\"><caption align=\"bottom\">Results of XI Test Run</caption>"; |
| print outfile "<tr><th>Test Number</th><th>Test Input File</th><th>Generated Output File</th>"; |
| print outfile "<th>Reference Result File</th><th>Result</th><th>Expected Result</th><th>Test Status</th></tr>"; |
| |
| $successes = 0; |
| $correct = 0; |
| $numTestsToRun = $#ARGV + 1; |
| while (<@ARGV>){ |
| $i = $_; |
| if ($i < 10) { |
| $testNum = "0$i"; |
| } else { |
| $testNum = "$i"; |
| } |
| $input_file = "tests".$pathsep."xinclude".$pathsep."tests".$pathsep."test$testNum.xml"; |
| if ($CORRECT_TEST_RESULTS[$i] == 1) { |
| $output_file = "tests".$pathsep."xinclude".$pathsep."written".$pathsep."test$testNum.xml"; |
| $expected_result_file = "tests".$pathsep."xinclude".$pathsep."cppoutput".$pathsep."test$testNum.xml"; |
| } else { |
| $output_file = "tests".$pathsep."xinclude".$pathsep."written".$pathsep."test$testNum.txt"; |
| $expected_result_file = "tests".$pathsep."xinclude".$pathsep."cppoutput".$pathsep."test$testNum.txt"; |
| } |
| |
| # run the tests and apture the output |
| $command = "XInclude $input_file $output_file"; |
| print "R[$command]\n"; |
| system("$command"); |
| |
| $outcome = 0; |
| if (! -e $output_file) { |
| $ACTUAL_TEST_RESULTS[$i] = 0; |
| # we didn't generate an output, we are correct if the test was expected to fail |
| if($CORRECT_TEST_RESULTS[$i] eq 0) { |
| $outcome = 1; |
| } |
| } else { |
| $ACTUAL_TEST_RESULTS[$i] = 1; |
| # we generated an output, we are correct if our result matches |
| if($CORRECT_TEST_RESULTS[$i] eq 1) { |
| $outcome = &compareFiles($expected_result_file, $output_file); |
| } |
| } |
| |
| print outfile "<tr bgcolor="; |
| if ($outcome eq 1) { |
| print outfile "green"; |
| } else { |
| print outfile "red"; |
| } |
| |
| print outfile ">"; |
| #test number |
| print outfile "<td>$testNum</td>"; |
| print outfile "<td>"; |
| $anchor = &createHTMLAnchor("$input_file"); |
| print outfile "$anchor"; |
| print outfile "</td><td>"; |
| $anchor = &createHTMLAnchor("$output_file"); |
| print outfile "$anchor"; |
| print outfile "</td><td>"; |
| $anchor = &createHTMLAnchor("$expected_result_file"); |
| print outfile "$anchor"; |
| print outfile "</td>"; |
| # actual result |
| $result = (($ACTUAL_TEST_RESULTS[$i])?"true":"false"); |
| print outfile "<td>$result</td>"; |
| |
| # correct result |
| $result = (($CORRECT_TEST_RESULTS[$i])?"true":"false"); |
| print outfile "<td>$result</td>"; |
| |
| if ($outcome eq 1) { |
| $successes++; |
| $result = "Passed"; |
| print "[test $testNum PASSED]\n"; |
| $correct++; |
| } else { |
| $result = "Failed"; |
| print "[test $testNum FAILED]\n"; |
| } |
| print outfile "<td>$result</td></tr>"; |
| } |
| |
| print outfile "</table>"; |
| |
| print "Tests Passed: $correct\n"; |
| $percentSucceeding = $correct / $numTestsToRun * 100.0; |
| print outfile "<hr/><h2>$percentSucceeding% of tests that were run passed ($correct out of $numTestsToRun).</h2>"; |
| |
| $shPass = 0; |
| $shFail = 0; |
| for ($i = 1; $i < $NUM_TESTS+1; $i++){ |
| if ($CORRECT_TEST_RESULTS[$i]){ |
| $shPass++; |
| } else { |
| $shFail++; |
| } |
| } |
| |
| print outfile "<h2>$shPass should pass ($successes) did</h2>"; |
| $failures = $NUM_TESTS - $successes; |
| print outfile "<h2>$shFail should fail ($failures) did</h2>"; |
| |
| $percentSucceeding = $correct / $NUM_TESTS * 100.0; |
| print outfile "<h2>$percentSucceeding% of all available tests passed ($correct out of $NUM_TESTS).</h2>"; |
| |
| $percentSucceeding = $numTestsToRun / $NUM_TESTS * 100.0; |
| print outfile "<h2>$percentSucceeding% of all available tests were run ($numTestsToRun out of $NUM_TESTS).</h2>"; |
| |
| print outfile "</center><hr/></body></html>"; |
| close(outfile); |
| |
| # quick and dirty but functional |
| sub compareFiles |
| { |
| $result = 1; |
| print "C[$_[0]]:[$_[1]]\n"; |
| |
| if (! -e $_[0]) { |
| print "No such file as $_[0] - cannot compare\n"; |
| return 0; |
| } |
| |
| if (! -e $_[1]) { |
| print "No such file as $_[1] - cannot compare\n"; |
| return 0; |
| } |
| |
| open(expected, "<$_[0]"); |
| open(actual, "<$_[1]"); |
| |
| #compare the files |
| @expectedData = <expected>; |
| @actualData = <actual>; |
| |
| close(expected); |
| close(actual); |
| |
| for ($x = 0, $a = 0; $x < $#expectedData && $a < $#actualData; $x++, $a++){ |
| $dataLineEx = $expectedData[$x]; |
| $dataLineAc = $actualData[$a]; |
| chomp($dataLineEx); |
| chomp($dataLineAc); |
| if ($dataLineEx ne $dataLineAc) { |
| # check if its a warning and can be ignored at this stage |
| if ($dataLineEx =~ /Warning/) { |
| print "probably just a warning line:\n"; |
| print "[$dataLineEx]\n"; |
| $a-- |
| } elsif ( $dataLineEx =~ m/^\s*$/ && $dataLineAc =~ m/^\s*$/ ) { |
| $line_num = $x + 1; |
| print "Line $line_num ws difference: \n[$dataLineEx] != \n[$dataLineAc]\n"; |
| print "probably just white space on both lines\n"; |
| $a-- |
| } else { |
| $line_num = $x + 1; |
| print "Line $line_num difference: \n[$dataLineEx] != \n[$dataLineAc]\n"; |
| print "From files: $_[0] $_[1]\n"; |
| return 0; |
| } |
| } |
| } |
| |
| return 1; |
| } |
| |
| sub createHTMLAnchor { |
| "<a target=\"_blank\" href=\"$_[0]\">$_[0]</a>"; |
| } |