carbidecpp20devenv/plugins/org.eclipse.test.source_3.3.0.v20080507/src/org.junit4_4.3.1/junitsrc/junit/runner/BaseTestRunner.java
author cawthron
Wed, 18 Mar 2009 17:21:00 -0500
changeset 1 82d1d1de1a01
permissions -rw-r--r--
import Carbide.c++
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
     1
package junit.runner;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
     2
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
     3
import java.io.BufferedReader;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
     4
import java.io.File;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
     5
import java.io.FileInputStream;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
     6
import java.io.FileOutputStream;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
     7
import java.io.IOException;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
     8
import java.io.InputStream;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
     9
import java.io.PrintWriter;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    10
import java.io.StringReader;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    11
import java.io.StringWriter;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    12
import java.lang.reflect.InvocationTargetException;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    13
import java.lang.reflect.Method;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    14
import java.lang.reflect.Modifier;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    15
import java.text.NumberFormat;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    16
import java.util.Properties;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    17
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    18
import junit.framework.AssertionFailedError;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    19
import junit.framework.Test;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    20
import junit.framework.TestCase;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    21
import junit.framework.TestListener;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    22
import junit.framework.TestSuite;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    23
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    24
/**
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    25
 * Base class for all test runners.
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    26
 * This class was born live on stage in Sardinia during XP2000.
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    27
 */
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    28
public abstract class BaseTestRunner implements TestListener {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    29
	public static final String SUITE_METHODNAME= "suite";
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    30
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    31
	private static Properties fPreferences;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    32
	static int fgMaxMessageLength= 500;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    33
	static boolean fgFilterStack= true;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    34
	boolean fLoading= true;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    35
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    36
    /*
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    37
    * Implementation of TestListener
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    38
    */
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    39
	public synchronized void startTest(Test test) {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    40
		testStarted(test.toString());
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    41
	}
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    42
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    43
	protected static void setPreferences(Properties preferences) {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    44
		fPreferences= preferences;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    45
	}
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    46
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    47
	protected static Properties getPreferences() {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    48
		if (fPreferences == null) {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    49
			fPreferences= new Properties();
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    50
	 		fPreferences.put("loading", "true");
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    51
 			fPreferences.put("filterstack", "true");
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    52
  			readPreferences();
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    53
		}
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    54
		return fPreferences;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    55
	}
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    56
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    57
	public static void savePreferences() throws IOException {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    58
		FileOutputStream fos= new FileOutputStream(getPreferencesFile());
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    59
		try {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    60
			getPreferences().store(fos, "");
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    61
		} finally {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    62
			fos.close();
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    63
		}
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    64
	}
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    65
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    66
	public static void setPreference(String key, String value) {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    67
		getPreferences().put(key, value);
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    68
	}
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    69
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    70
	public synchronized void endTest(Test test) {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    71
		testEnded(test.toString());
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    72
	}
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    73
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    74
	public synchronized void addError(final Test test, final Throwable t) {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    75
		testFailed(TestRunListener.STATUS_ERROR, test, t);
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    76
	}
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    77
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    78
	public synchronized void addFailure(final Test test, final AssertionFailedError t) {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    79
		testFailed(TestRunListener.STATUS_FAILURE, test, t);
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    80
	}
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    81
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    82
	// TestRunListener implementation
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    83
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    84
	public abstract void testStarted(String testName);
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    85
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    86
	public abstract void testEnded(String testName);
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    87
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    88
	public abstract void testFailed(int status, Test test, Throwable t);
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    89
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    90
	/**
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    91
	 * Returns the Test corresponding to the given suite. This is
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    92
	 * a template method, subclasses override runFailed(), clearStatus().
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    93
	 */
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    94
	public Test getTest(String suiteClassName) {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    95
		if (suiteClassName.length() <= 0) {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    96
			clearStatus();
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    97
			return null;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    98
		}
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    99
		Class<? extends TestCase> testClass= null;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   100
		try {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   101
			testClass= loadSuiteClass(suiteClassName);
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   102
		} catch (ClassNotFoundException e) {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   103
			String clazz= e.getMessage();
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   104
			if (clazz == null)
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   105
				clazz= suiteClassName;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   106
			runFailed("Class not found \""+clazz+"\"");
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   107
			return null;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   108
		} catch(Exception e) {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   109
			runFailed("Error: "+e.toString());
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   110
			return null;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   111
		}
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   112
		Method suiteMethod= null;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   113
		try {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   114
			suiteMethod= testClass.getMethod(SUITE_METHODNAME, new Class[0]);
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   115
	 	} catch(Exception e) {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   116
	 		// try to extract a test suite automatically
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   117
			clearStatus();
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   118
			return new TestSuite(testClass);
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   119
		}
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   120
		if (! Modifier.isStatic(suiteMethod.getModifiers())) {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   121
			runFailed("Suite() method must be static");
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   122
			return null;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   123
		}
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   124
		Test test= null;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   125
		try {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   126
			test= (Test)suiteMethod.invoke(null, (Object[])new Class[0]); // static method
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   127
			if (test == null)
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   128
				return test;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   129
		}
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   130
		catch (InvocationTargetException e) {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   131
			runFailed("Failed to invoke suite():" + e.getTargetException().toString());
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   132
			return null;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   133
		}
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   134
		catch (IllegalAccessException e) {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   135
			runFailed("Failed to invoke suite():" + e.toString());
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   136
			return null;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   137
		}
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   138
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   139
		clearStatus();
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   140
		return test;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   141
	}
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   142
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   143
	/**
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   144
	 * Returns the formatted string of the elapsed time.
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   145
	 */
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   146
	public String elapsedTimeAsString(long runTime) {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   147
		return NumberFormat.getInstance().format((double)runTime/1000);
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   148
	}
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   149
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   150
	/**
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   151
	 * Processes the command line arguments and
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   152
	 * returns the name of the suite class to run or null
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   153
	 */
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   154
	protected String processArguments(String[] args) {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   155
		String suiteName= null;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   156
		for (int i= 0; i < args.length; i++) {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   157
			if (args[i].equals("-noloading")) {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   158
				setLoading(false);
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   159
			} else if (args[i].equals("-nofilterstack")) {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   160
				fgFilterStack= false;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   161
			} else if (args[i].equals("-c")) {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   162
				if (args.length > i+1)
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   163
					suiteName= extractClassName(args[i+1]);
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   164
				else
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   165
					System.out.println("Missing Test class name");
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   166
				i++;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   167
			} else {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   168
				suiteName= args[i];
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   169
			}
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   170
		}
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   171
		return suiteName;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   172
	}
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   173
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   174
	/**
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   175
	 * Sets the loading behaviour of the test runner
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   176
	 */
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   177
	public void setLoading(boolean enable) {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   178
		fLoading= enable;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   179
	}
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   180
	/**
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   181
	 * Extract the class name from a String in VA/Java style
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   182
	 */
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   183
	public String extractClassName(String className) {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   184
		if(className.startsWith("Default package for"))
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   185
			return className.substring(className.lastIndexOf(".")+1);
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   186
		return className;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   187
	}
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   188
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   189
	/**
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   190
	 * Truncates a String to the maximum length.
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   191
	 */
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   192
	public static String truncate(String s) {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   193
		if (fgMaxMessageLength != -1 && s.length() > fgMaxMessageLength)
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   194
			s= s.substring(0, fgMaxMessageLength)+"...";
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   195
		return s;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   196
	}
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   197
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   198
	/**
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   199
	 * Override to define how to handle a failed loading of
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   200
	 * a test suite.
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   201
	 */
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   202
	protected abstract void runFailed(String message);
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   203
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   204
	/**
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   205
	 * Returns the loaded Class for a suite name.
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   206
	 */
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   207
	protected Class<? extends TestCase> loadSuiteClass(String suiteClassName) throws ClassNotFoundException {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   208
		return Class.forName(suiteClassName).asSubclass(TestCase.class);
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   209
	}
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   210
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   211
	/**
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   212
	 * Clears the status message.
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   213
	 */
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   214
	protected void clearStatus() { // Belongs in the GUI TestRunner class
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   215
	}
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   216
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   217
	protected boolean useReloadingTestSuiteLoader() {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   218
		return getPreference("loading").equals("true") && fLoading;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   219
	}
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   220
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   221
	private static File getPreferencesFile() {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   222
	 	String home= System.getProperty("user.home");
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   223
 		return new File(home, "junit.properties");
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   224
 	}
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   225
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   226
 	private static void readPreferences() {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   227
 		InputStream is= null;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   228
 		try {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   229
 			is= new FileInputStream(getPreferencesFile());
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   230
 			setPreferences(new Properties(getPreferences()));
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   231
			getPreferences().load(is);
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   232
		} catch (IOException e) {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   233
			try {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   234
				if (is != null)
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   235
					is.close();
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   236
			} catch (IOException e1) {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   237
			}
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   238
		}
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   239
 	}
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   240
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   241
 	public static String getPreference(String key) {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   242
 		return getPreferences().getProperty(key);
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   243
 	}
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   244
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   245
 	public static int getPreference(String key, int dflt) {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   246
 		String value= getPreference(key);
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   247
 		int intValue= dflt;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   248
 		if (value == null)
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   249
 			return intValue;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   250
 		try {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   251
 			intValue= Integer.parseInt(value);
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   252
 	 	} catch (NumberFormatException ne) {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   253
 		}
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   254
 		return intValue;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   255
 	}
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   256
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   257
	/**
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   258
	 * Returns a filtered stack trace
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   259
	 */
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   260
	public static String getFilteredTrace(Throwable t) {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   261
		StringWriter stringWriter= new StringWriter();
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   262
		PrintWriter writer= new PrintWriter(stringWriter);
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   263
		t.printStackTrace(writer);
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   264
		StringBuffer buffer= stringWriter.getBuffer();
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   265
		String trace= buffer.toString();
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   266
		return BaseTestRunner.getFilteredTrace(trace);
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   267
	}
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   268
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   269
	/**
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   270
	 * Filters stack frames from internal JUnit classes
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   271
	 */
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   272
	public static String getFilteredTrace(String stack) {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   273
		if (showStackRaw())
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   274
			return stack;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   275
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   276
		StringWriter sw= new StringWriter();
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   277
		PrintWriter pw= new PrintWriter(sw);
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   278
		StringReader sr= new StringReader(stack);
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   279
		BufferedReader br= new BufferedReader(sr);
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   280
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   281
		String line;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   282
		try {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   283
			while ((line= br.readLine()) != null) {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   284
				if (!filterLine(line))
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   285
					pw.println(line);
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   286
			}
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   287
		} catch (Exception IOException) {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   288
			return stack; // return the stack unfiltered
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   289
		}
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   290
		return sw.toString();
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   291
	}
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   292
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   293
	protected static boolean showStackRaw() {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   294
		return !getPreference("filterstack").equals("true") || fgFilterStack == false;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   295
	}
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   296
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   297
	static boolean filterLine(String line) {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   298
		String[] patterns= new String[] {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   299
			"junit.framework.TestCase",
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   300
			"junit.framework.TestResult",
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   301
			"junit.framework.TestSuite",
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   302
			"junit.framework.Assert.", // don't filter AssertionFailure
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   303
			"junit.swingui.TestRunner",
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   304
			"junit.awtui.TestRunner",
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   305
			"junit.textui.TestRunner",
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   306
			"java.lang.reflect.Method.invoke("
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   307
		};
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   308
		for (int i= 0; i < patterns.length; i++) {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   309
			if (line.indexOf(patterns[i]) > 0)
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   310
				return true;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   311
		}
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   312
		return false;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   313
	}
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   314
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   315
 	static {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   316
 		fgMaxMessageLength= getPreference("maxmessage", fgMaxMessageLength);
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   317
 	}
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   318
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   319
}