package com.google.gwt.maps.client;
/*
* #%L
* GWT Maps API V3 - Core API
* %%
* Copyright (C) 2011 - 2012 GWT Maps API V3
* %%
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* #L%
*/
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import junit.framework.TestSuite;
import com.google.gwt.junit.client.GWTTestCase;
import com.google.gwt.junit.tools.GWTTestSuite;
import com.google.gwt.maps.client.main.LoadApiGwtTest;
public class RunAllTestsGwtTestSuite extends GWTTestSuite {
public static final String TARGET_CLASS_SUFFIX = "Test";
public static TestSuite suite() throws Exception {
GWTTestSuite suite = new GWTTestSuite();
// be sure the libs get loaded at the beginning b/c they won't want to
// add the libs during
suite.addTestSuite(LoadApiGwtTest.class);
// don't run these twice
ArrayList<String> ignoreTestList = new ArrayList<String>();
ignoreTestList.add(LoadApiGwtTest.class.getName());
ignoreTestList.add(AbstractMapsGWTTestHelper.class.getName());
// make sure this test is run first to prime all library loads
suite.addTestSuite(LoadApiGwtTest.class);
for (Class<? extends GWTTestCase> clazz : getClasses("com.google.gwt.maps.client")) {
if (!ignoreTestList.contains(clazz.getName())) {
suite.addTestSuite(clazz);
}
}
return suite;
}
/**
* Scans all classes accessible from the context class loader which belong to the given package and sub-packages.
*
* @param packageName The base package
* @return The classes
* @throws ClassNotFoundException
* @throws IOException
*/
@SuppressWarnings("unchecked")
private static List<Class<? extends GWTTestCase>> getClasses(String packageName) throws ClassNotFoundException,
IOException {
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
assert classLoader != null;
String path = packageName.replace('.', '/');
Enumeration<URL> resources = classLoader.getResources(path);
List<File> dirs = new ArrayList<File>();
while (resources.hasMoreElements()) {
URL resource = resources.nextElement();
dirs.add(new File(resource.getFile()));
}
List<Class<? extends GWTTestCase>> classes = new ArrayList<Class<? extends GWTTestCase>>();
for (File directory : dirs) {
for (@SuppressWarnings("rawtypes")
Class dirClazz : findClasses(directory, packageName)) {
if (GWTTestCase.class.isAssignableFrom(dirClazz)) {
classes.add(dirClazz);
}
}
}
return classes;
}
/**
* Recursive method used to find all classes in a given directory and subdirs.
*
* @param directory The base directory
* @param packageName The package name for classes found inside the base directory
* @return The classes
* @throws ClassNotFoundException
*/
@SuppressWarnings("rawtypes")
private static List<Class> findClasses(File directory, String packageName) throws ClassNotFoundException {
final String targetSuffix = TARGET_CLASS_SUFFIX + ".class";
List<Class> classes = new ArrayList<Class>();
if (!directory.exists()) {
return classes;
}
File[] files = directory.listFiles();
for (File file : files) {
if (file.isDirectory()) {
assert !file.getName().contains(".");
classes.addAll(findClasses(file, packageName + "." + file.getName()));
} else if (file.getName().endsWith(targetSuffix)) {
classes.add(Class.forName(packageName + '.' + file.getName().substring(0, file.getName().length() - 6)));
}
}
return classes;
}
}