Home | History | Annotate | Download | only in runner
      1 package junit.runner;
      2 
      3 import java.lang.reflect.*;
      4 import junit.runner.*;
      5 import junit.framework.*;
      6 
      7 /**
      8  * An implementation of a TestCollector that loads
      9  * all classes on the class path and tests whether
     10  * it is assignable from Test or provides a static suite method.
     11  * @see TestCollector
     12  * {@hide} - Not needed for 1.0 SDK
     13  */
     14 public class LoadingTestCollector extends ClassPathTestCollector {
     15 
     16     TestCaseClassLoader fLoader;
     17 
     18     public LoadingTestCollector() {
     19         fLoader= new TestCaseClassLoader();
     20     }
     21 
     22     protected boolean isTestClass(String classFileName) {
     23         try {
     24             if (classFileName.endsWith(".class")) {
     25                 Class testClass= classFromFile(classFileName);
     26                 return (testClass != null) && isTestClass(testClass);
     27             }
     28         }
     29         catch (ClassNotFoundException expected) {
     30         }
     31         catch (NoClassDefFoundError notFatal) {
     32         }
     33         return false;
     34     }
     35 
     36     Class classFromFile(String classFileName) throws ClassNotFoundException {
     37         String className= classNameFromFile(classFileName);
     38         if (!fLoader.isExcluded(className))
     39             return fLoader.loadClass(className, false);
     40         return null;
     41     }
     42 
     43     boolean isTestClass(Class testClass) {
     44         if (hasSuiteMethod(testClass))
     45             return true;
     46         if (Test.class.isAssignableFrom(testClass) &&
     47                 Modifier.isPublic(testClass.getModifiers()) &&
     48                 hasPublicConstructor(testClass))
     49             return true;
     50         return false;
     51     }
     52 
     53     boolean hasSuiteMethod(Class testClass) {
     54         try {
     55             testClass.getMethod(BaseTestRunner.SUITE_METHODNAME, new Class[0]);
     56         } catch(Exception e) {
     57             return false;
     58         }
     59         return true;
     60     }
     61 
     62     boolean hasPublicConstructor(Class testClass) {
     63         try {
     64             TestSuite.getTestConstructor(testClass);
     65         } catch(NoSuchMethodException e) {
     66             return false;
     67         }
     68         return true;
     69     }
     70 }
     71