public static Test suite() {
    TestSuite suite = new TestSuite();
    
    try {
      // determine all test methods in the OptionHandlerTest class
      Vector<String> testMethods = new Vector<String>();
      Method[] methods = OptionHandlerTest.class.getDeclaredMethods();
      for (int i = 0; i < methods.length; i++) {
	if (methods[i].getName().startsWith("test"))
	  testMethods.add(methods[i].getName());
      }
      
      // get all classes that are accessible through the GUI
      GenericPropertiesCreator creator = new GenericPropertiesCreator();
      creator.execute(false);
      Properties props = creator.getOutputProperties();
      
      // traverse all super-classes
      Enumeration names = props.propertyNames();
      while (names.hasMoreElements()) {
	String name = names.nextElement().toString();

	// add tests for all listed classes
	StringTokenizer tok = new StringTokenizer(props.getProperty(name, ""), ",");
	while (tok.hasMoreTokens()) {
	  String classname = tok.nextToken();
	  
	  // does class implement OptionHandler?
	  try {
	    Class cls = Class.forName(classname);
	    if (!ClassDiscovery.hasInterface(OptionHandler.class, cls))
	      continue;
	  }
	  catch (Exception e) {
	    // some other problem, skip this class
	    continue;
	  }
	  
	  // add tests for this class
	  for (int i = 0; i < testMethods.size(); i++)
	    suite.addTest(new OptionHandlerTest(testMethods.get(i), classname));
	}
      }
    }
    catch (Exception e) {
      e.printStackTrace();
    }

    return suite;
  }