ClassPathTestCollector.java revision e70f61b1160e953e5e4d18d30a463fa9ba821779
1package junit.runner;
2
3import java.util.*;
4import java.io.*;
5
6/**
7 * An implementation of a TestCollector that consults the
8 * class path. It considers all classes on the class path
9 * excluding classes in JARs. It leaves it up to subclasses
10 * to decide whether a class is a runnable Test.
11 *
12 * @see TestCollector
13 * {@hide} - Not needed for 1.0 SDK
14 */
15public abstract class ClassPathTestCollector implements TestCollector {
16
17	static final int SUFFIX_LENGTH= ".class".length();
18
19	public ClassPathTestCollector() {
20	}
21
22	public Enumeration collectTests() {
23		String classPath= System.getProperty("java.class.path");
24		Hashtable result = collectFilesInPath(classPath);
25		return result.elements();
26	}
27
28	public Hashtable collectFilesInPath(String classPath) {
29		Hashtable result= collectFilesInRoots(splitClassPath(classPath));
30		return result;
31	}
32
33	Hashtable collectFilesInRoots(Vector roots) {
34		Hashtable result= new Hashtable(100);
35		Enumeration e= roots.elements();
36		while (e.hasMoreElements())
37			gatherFiles(new File((String)e.nextElement()), "", result);
38		return result;
39	}
40
41	void gatherFiles(File classRoot, String classFileName, Hashtable result) {
42		File thisRoot= new File(classRoot, classFileName);
43		if (thisRoot.isFile()) {
44			if (isTestClass(classFileName)) {
45				String className= classNameFromFile(classFileName);
46				result.put(className, className);
47			}
48			return;
49		}
50		String[] contents= thisRoot.list();
51		if (contents != null) {
52			for (int i= 0; i < contents.length; i++)
53				gatherFiles(classRoot, classFileName+File.separatorChar+contents[i], result);
54		}
55	}
56
57	Vector splitClassPath(String classPath) {
58		Vector result= new Vector();
59		String separator= System.getProperty("path.separator");
60		StringTokenizer tokenizer= new StringTokenizer(classPath, separator);
61		while (tokenizer.hasMoreTokens())
62			result.addElement(tokenizer.nextToken());
63		return result;
64	}
65
66	protected boolean isTestClass(String classFileName) {
67		return
68			classFileName.endsWith(".class") &&
69			classFileName.indexOf('$') < 0 &&
70			classFileName.indexOf("Test") > 0;
71	}
72
73	protected String classNameFromFile(String classFileName) {
74		// convert /a/b.class to a.b
75		String s= classFileName.substring(0, classFileName.length()-SUFFIX_LENGTH);
76		String s2= s.replace(File.separatorChar, '.');
77		if (s2.startsWith("."))
78			return s2.substring(1);
79		return s2;
80	}
81}
82