| 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 | |
| * {@hide} - Not needed for 1.0 SDK | |
| */ | |
| 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; | |
| } | |
| } |