/*
* This software is subject to the terms of the Eclipse Public License v1.0
* Agreement, available at the following URL:
* http://www.eclipse.org/legal/epl-v10.html.
* You must accept the terms of that agreement to use this software.
*
* Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved.
*/
package mondrian.test;
import junit.framework.*;
import java.lang.reflect.Constructor;
import java.util.Enumeration;
/**
* Simple test runner.
*/
public class SimpleTestRunner {
protected static void usage(String msg) {
StringBuilder buf = new StringBuilder(64);
if (msg != null) {
buf.append(msg);
buf.append('\n');
}
buf.append("Usage: mondrian.test.SimpleTestRunner options tests*");
buf.append('\n');
buf.append(" options:");
buf.append('\n');
buf.append(" -h (print this text)");
buf.append('\n');
buf.append(" -q (error output quiet)");
buf.append('\n');
buf.append(" tests:");
buf.append('\n');
buf.append(" -c testcaseclassname methodnames*");
buf.append('\n');
buf.append("If no method names are given, then all are tested");
buf.append('\n');
System.out.println(buf.toString());
System.exit(0);
}
protected static TestCase makeTestCase(String classname) throws Exception {
Class cls = Class.forName(classname);
return (TestCase) cls.newInstance();
}
protected static TestCase makeTestCase(String classname, String methodname)
throws Exception
{
Class cls = Class.forName(classname);
Constructor cons = cls.getConstructor(new Class[] { String.class});
return (TestCase) cons.newInstance(new Object[] { methodname });
}
protected static void outputErrorInfo(Enumeration e, boolean quiet) {
while (e.hasMoreElements()) {
TestFailure tf = (TestFailure) e.nextElement();
if (! quiet) {
System.out.println(tf.trace());
Throwable t = tf.thrownException().getCause();
while (t != null) {
t.printStackTrace();
t = t.getCause();
}
} else {
System.out.println(tf.toString());
System.out.println("run without -quiet for more information");
}
}
}
public static void main(String[] args) throws Throwable {
String classname = null;
TestCase testcase = null;
boolean quiet = false;
boolean explicitMethods = false;
for (int i = 0; i < args.length; i++) {
String arg = args[i];
if (arg.equals("-h")) {
usage(null);
} else if (arg.equals("-q")) {
quiet = true;
} else if (arg.equals("-quiet")) {
quiet = true;
} else if (arg.equals("-c")) {
i++;
if (i == args.length) {
usage("Must supply TestCase classname after -c");
}
classname = args[i];
} else {
explicitMethods = true;
String methodname = arg;
if (testcase == null) {
if (classname == null) {
usage(
"Must supply TestCase classname before methodname");
}
testcase = makeTestCase(classname, methodname);
} else {
testcase.setName(methodname);
}
//testcase.runBare();
junit.framework.TestResult tr = testcase.run();
System.out.println("Test Class: " + classname);
System.out.println(" Method : " + methodname);
System.out.println(" Error Count : " + tr.errorCount());
if (tr.errorCount() != 0) {
Enumeration e = tr.errors();
outputErrorInfo(e, quiet);
}
System.out.println(" Failure Count : " + tr.failureCount());
if (tr.failureCount() != 0) {
Enumeration e = tr.failures();
outputErrorInfo(e, quiet);
}
testcase = null;
}
}
if (! explicitMethods) {
if (classname == null) {
usage("Must supply TestCase classname");
}
if (testcase == null) {
try {
// maybe it has a no argument constructor
testcase = makeTestCase(classname);
} catch (InstantiationException ex) {
String msg =
"InstantiationException: "
+ "most likely the test class does not have a "
+ "zero-parameter, public constructor.";
System.out.println(msg);
System.exit(1);
} catch (Exception ex) {
testcase = null;
// ignore
}
}
if (testcase != null) {
TestSuite suite = new TestSuite(testcase.getClass());
TestResult tr = new TestResult();
suite.run(tr);
System.out.println("Test Class: " + classname);
System.out.println(" Method Count : " + tr.runCount());
System.out.println(" Error Count : " + tr.errorCount());
if (tr.errorCount() != 0) {
Enumeration e = tr.errors();
outputErrorInfo(e, quiet);
}
System.out.println(" Failure Count : " + tr.failureCount());
if (tr.failureCount() != 0) {
Enumeration e = tr.failures();
outputErrorInfo(e, quiet);
}
}
}
}
}
// End SimpleTestRunner.java