// Copyright (c) 1998, 1999, 2001 Red Hat, Inc.
// Written by Tom Tromey <tromey@cygnus.com>
// This file is part of Mauve.
// Mauve is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2, or (at your option)
// any later version.
// Mauve is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
// You should have received a copy of the GNU General Public License
// along with Mauve; see the file COPYING. If not, write to
// the Free Software Foundation, 51 Franklin Street, Fifth Floor,
// Boston, MA 02110-1301, USA.
// KNOWN BUGS:
// - should look for /*{ ... }*/ and treat contents as expected
// output of test. In this case we should redirect System.out
// to a temp file we create.
package gnu.testlet;
import java.io.*;
import java.util.Vector;
public class SimpleTestHarness
extends TestHarness
implements gnu.testlet.config
{
private int count = 0;
private int failures = 0;
private static Vector expected_xfails = new Vector ();
private int xfailures = 0;
private int xpasses = 0;
private int total = 0;
private boolean verbose = false;
private boolean debug = false;
private boolean results_only=false;
private String description;
private String last_check;
private final String getDescription (String pf)
{
return (pf + ": " + description
+ ((last_check == null) ? "" : (": " + last_check))
+ " (number " + (count + 1) + ")");
}
public void check (boolean result)
{
if (! result)
{
String desc;
if (!expected_xfails.contains (desc = getDescription ("FAIL")))
{
System.out.println (desc);
++failures;
}
else if (verbose || results_only)
{
System.out.println ("X" + desc);
++xfailures;
}
}
else if (verbose || results_only)
{
if (expected_xfails.contains (getDescription ("FAIL")))
{
System.out.println (getDescription ("XPASS"));
++xpasses;
}
else
{
System.out.println (getDescription ("PASS"));
}
}
++count;
++total;
}
public String getSourceDirectory ()
{
return srcdir;
}
public String getTempDirectory ()
{
return tmpdir;
}
public String getPathSeparator ()
{
return pathSeparator;
}
public String getSeparator ()
{
return separator;
}
public Reader getResourceReader (String name)
throws ResourceNotFoundException
{
return (new BufferedReader (new InputStreamReader (
getResourceStream (name))));
}
public InputStream getResourceStream (String name)
throws ResourceNotFoundException
{
// The following code assumes File.separator is a single character.
if (File.separator.length () > 1)
throw new Error ("File.separator length is greater than 1");
String realName = name.replace ('#', File.separator.charAt (0));
try
{
return
new FileInputStream (getSourceDirectory ()
+ File.separator
+ realName);
}
catch (FileNotFoundException ex)
{
throw new ResourceNotFoundException (ex.getLocalizedMessage ()
+ ": " + getSourceDirectory ()
+ File.separator + realName);
}
}
public void checkPoint (String name)
{
last_check = name;
count = 0;
}
public void verbose (String message)
{
if (verbose)
System.out.println (message);
}
public void debug (String message)
{
debug(message, true);
}
public void debug (String message, boolean newline)
{
if (debug)
{
if (newline)
System.out.println (message);
else
System.out.print (message);
}
}
public void debug (Throwable ex)
{
if (debug)
ex.printStackTrace(System.out);
}
public void debug(Object[] o, String desc)
{
debug("Dumping Object Array: " + desc);
if (o == null)
{
debug("null");
return;
}
for (int i = 0; i < o.length; i++)
if (o[i] instanceof Object[])
debug((Object[])o[i], desc + " element " + i);
else
debug(" Element " + i + ": " + o[i]);
}
protected void runtest (String name)
{
// Try to ensure we start off with a reasonably clean slate.
System.gc();
System.runFinalization();
checkPoint (null);
Testlet t = null;
try
{
Class k = Class.forName (name);
Object o = k.newInstance();
if (!(o instanceof Testlet))
return;
t = (Testlet)o;
}
catch (Throwable ex)
{
String d = "FAIL: uncaught exception loading " + name;
if (verbose)
d += ": " + ex.toString();
System.out.println (d);
debug (ex);
++failures;
++total;
}
if (t != null)
{
description = name;
try
{
t.test (this);
}
catch (Throwable ex)
{
String d = ("FAIL: " + description
+ ": uncaught exception at "
+ ((last_check == null) ? "" :
("\"" + last_check + "\""))
+" number "
+ (count + 1));
if (verbose)
d += ": " + ex.toString();
System.out.println (d);
debug (ex);
++failures;
++total;
}
}
}
protected int done ()
{
if (!results_only)
{
System.out.println(failures + " of " + total + " tests failed");
if (xpasses > 0)
System.out.println(xpasses + " of " + total
+ " tests unexpectedly passed");
if (xfailures > 0)
System.out.println(xfailures + " of " + total
+ " tests expectedly failed");
}
return failures > 0 ? 1 : 0;
}
protected SimpleTestHarness (boolean verbose, boolean debug)
{
this(verbose, debug, false);
}
protected SimpleTestHarness (boolean verbose, boolean debug,
boolean results_only)
{
this.verbose = verbose;
this.debug = debug;
this.results_only= results_only;
try
{
BufferedReader xfile = new BufferedReader (new FileReader ("xfails"));
String str;
while ((str = xfile.readLine ()) != null)
expected_xfails.addElement (str);
}
catch (FileNotFoundException ex)
{
// Nothing.
}
catch (IOException ex)
{
// Nothing.
}
}
public static void main (String[] args)
{
boolean verbose = false;
boolean debug = false;
boolean results_only = false;
String file = null;
int i;
for (i = 0; i < args.length; i++)
{
if (args[i].equals("-verbose"))
verbose = true;
else if (args[i].equals("-debug"))
debug = true;
else if (args[i].equals("-resultsonly"))
{
results_only = true;
verbose = false;
debug = false;
}
else if (args[i].equalsIgnoreCase("-file"))
try
{
file = args[++i];
}
catch (Exception x)
{
throw new RuntimeException ("Missing file path after '-file'. Exit");
}
else
break;
}
SimpleTestHarness harness
= new SimpleTestHarness (verbose, debug, results_only);
BufferedReader r = null;
if (file != null)
try
{
r = new BufferedReader (new FileReader (file));
}
catch (FileNotFoundException x)
{
throw new RuntimeException ("Unable to find \""+file+"\". Exit");
}
else
r = new BufferedReader (new InputStreamReader (System.in));
while (true)
{
String cname = null;
try
{
cname = r.readLine ();
if (cname == null)
break;
if (verbose)
System.out.println (cname);
}
catch (IOException x)
{
// Nothing.
}
if (verbose)
System.out.println ("----");
harness.runtest (cname);
}
System.exit(harness.done());
}
}