aboutsummaryrefslogtreecommitdiff
path: root/src/junit/runner/ClassPathTestCollector.java
blob: f48ddee6855fda7ba5382b2f509c886052006ffa (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
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;
    }
}