package junit.runner; | |
import java.util.*; | |
import java.io.*; | |
/** | |
* An implementation of a TestCollector that consults the | |
* class path. It considers all classes on the class path | |
* excluding classes in JARs. It leaves it up to subclasses | |
* to decide whether a class is a runnable Test. | |
* | |
* @see TestCollector | |
*/ | |
public abstract class ClassPathTestCollector implements TestCollector { | |
static final int SUFFIX_LENGTH= ".class".length(); | |
public ClassPathTestCollector() { | |
} | |
public Enumeration collectTests() { | |
String classPath= System.getProperty("java.class.path"); | |
Hashtable result = collectFilesInPath(classPath); | |
return result.elements(); | |
} | |
public Hashtable collectFilesInPath(String classPath) { | |
Hashtable result= collectFilesInRoots(splitClassPath(classPath)); | |
return result; | |
} | |
Hashtable collectFilesInRoots(Vector roots) { | |
Hashtable result= new Hashtable(100); | |
Enumeration e= roots.elements(); | |
while (e.hasMoreElements()) | |
gatherFiles(new File((String)e.nextElement()), "", result); | |
return result; | |
} | |
void gatherFiles(File classRoot, String classFileName, Hashtable result) { | |
File thisRoot= new File(classRoot, classFileName); | |
if (thisRoot.isFile()) { | |
if (isTestClass(classFileName)) { | |
String className= classNameFromFile(classFileName); | |
result.put(className, className); | |
} | |
return; | |
} | |
String[] contents= thisRoot.list(); | |
if (contents != null) { | |
for (int i= 0; i < contents.length; i++) | |
gatherFiles(classRoot, classFileName+File.separatorChar+contents[i], result); | |
} | |
} | |
Vector splitClassPath(String classPath) { | |
Vector result= new Vector(); | |
String separator= System.getProperty("path.separator"); | |
StringTokenizer tokenizer= new StringTokenizer(classPath, separator); | |
while (tokenizer.hasMoreTokens()) | |
result.addElement(tokenizer.nextToken()); | |
return result; | |
} | |
protected boolean isTestClass(String classFileName) { | |
return | |
classFileName.endsWith(".class") && | |
classFileName.indexOf('$') < 0 && | |
classFileName.indexOf("Test") > 0; | |
} | |
protected String classNameFromFile(String classFileName) { | |
// convert /a/b.class to a.b | |
String s= classFileName.substring(0, classFileName.length()-SUFFIX_LENGTH); | |
String s2= s.replace(File.separatorChar, '.'); | |
if (s2.startsWith(".")) | |
return s2.substring(1); | |
return s2; | |
} | |
} |