OSDN Git Service

original
[gb-231r1-is01/Gingerbread_2.3.3_r1_IS01.git] / libcore / junit / src / test / java / junit / runner / ClassPathTestCollector.java
1 package junit.runner;
2
3 import java.util.*;
4 import 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  */
14 public abstract class ClassPathTestCollector implements TestCollector {
15
16     static final int SUFFIX_LENGTH= ".class".length();
17
18     public ClassPathTestCollector() {
19     }
20
21     public Enumeration collectTests() {
22         String classPath= System.getProperty("java.class.path");
23         Hashtable result = collectFilesInPath(classPath);
24         return result.elements();
25     }
26
27     public Hashtable collectFilesInPath(String classPath) {
28         Hashtable result= collectFilesInRoots(splitClassPath(classPath));
29         return result;
30     }
31
32     Hashtable collectFilesInRoots(Vector roots) {
33         Hashtable result= new Hashtable(100);
34         Enumeration e= roots.elements();
35         while (e.hasMoreElements())
36             gatherFiles(new File((String)e.nextElement()), "", result);
37         return result;
38     }
39
40     void gatherFiles(File classRoot, String classFileName, Hashtable result) {
41         File thisRoot= new File(classRoot, classFileName);
42         if (thisRoot.isFile()) {
43             if (isTestClass(classFileName)) {
44                 String className= classNameFromFile(classFileName);
45                 result.put(className, className);
46             }
47             return;
48         }
49         String[] contents= thisRoot.list();
50         if (contents != null) {
51             for (int i= 0; i < contents.length; i++)
52                 gatherFiles(classRoot, classFileName+File.separatorChar+contents[i], result);
53         }
54     }
55
56     Vector splitClassPath(String classPath) {
57         Vector result= new Vector();
58         String separator= System.getProperty("path.separator");
59         StringTokenizer tokenizer= new StringTokenizer(classPath, separator);
60         while (tokenizer.hasMoreTokens())
61             result.addElement(tokenizer.nextToken());
62         return result;
63     }
64
65     protected boolean isTestClass(String classFileName) {
66         return
67             classFileName.endsWith(".class") &&
68             classFileName.indexOf('$') < 0 &&
69             classFileName.indexOf("Test") > 0;
70     }
71
72     protected String classNameFromFile(String classFileName) {
73         // convert /a/b.class to a.b
74         String s= classFileName.substring(0, classFileName.length()-SUFFIX_LENGTH);
75         String s2= s.replace(File.separatorChar, '.');
76         if (s2.startsWith("."))
77             return s2.substring(1);
78         return s2;
79     }
80 }