Home | History | Annotate | Download | only in runner
      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  * {@hide} - Not needed for 1.0 SDK
     14  */
     15 public 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