package org.projectusus.autotestsuite.core.internal;
import static java.util.Arrays.asList;
import static org.projectusus.autotestsuite.core.internal.config.ExtendedJUnitLaunchConfigurationConstants.toProject;
import java.text.MessageFormat;
import java.util.Collection;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.SubProgressMonitor;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IMember;
import org.eclipse.jdt.internal.junit.launcher.ITestKind;
import org.eclipse.jdt.junit.launcher.JUnitLaunchConfigurationDelegate;
import org.eclipse.jdt.launching.IJavaLaunchConfigurationConstants;
import org.projectusus.autotestsuite.core.internal.config.ExtendedJUnitLaunchConfigurationReader;
@SuppressWarnings( "restriction" )
public class ExtendedJUnitLaunchConfigurationDelegate extends JUnitLaunchConfigurationDelegate {
@Override
protected IMember[] evaluateTests( ILaunchConfiguration config, IProgressMonitor monitor ) throws CoreException {
return evaluateTests( new ExtendedJUnitLaunchConfigurationReader( config ), monitor );
}
private IMember[] evaluateTests( ExtendedJUnitLaunchConfigurationReader config, IProgressMonitor monitor ) throws CoreException {
Collection<IJavaProject> projects = collectProjects( config );
Set<IMember> result = collectTests( config, projects, monitor );
checkResult( config, result );
return result.toArray( new IMember[result.size()] );
}
private Set<IMember> collectTests( ExtendedJUnitLaunchConfigurationReader config, Collection<IJavaProject> projects, IProgressMonitor monitor ) throws CoreException {
Set<IMember> result = new HashSet<IMember>();
ITestKind testKind = config.getTestKind();
monitor.beginTask( "Looking for tests", projects.size() );
for( IJavaProject project : projects ) {
monitor.subTask( project.getElementName() );
testKind.getFinder().findTestsInContainer( project, result, new SubProgressMonitor( monitor, 1 ) );
}
monitor.done();
return result;
}
private Collection<IJavaProject> collectProjects( ExtendedJUnitLaunchConfigurationReader config ) {
IJavaProject project = toProject( config.getProjectName() );
List<IJavaProject> projects = new LinkedList<IJavaProject>( findRequired( project ) );
IJavaProject[] checkedProjects = config.getCheckedProjects();
projects.retainAll( asList( checkedProjects ) );
return projects;
}
private Collection<IJavaProject> findRequired( IJavaProject project ) {
IAllJavaProjects allProjects = new AllJavaProjectsInWorkspace();
return new RequiredJavaProjects( allProjects ).findFor( project );
}
private void checkResult( ExtendedJUnitLaunchConfigurationReader config, Collection<IMember> result ) throws CoreException {
if( result.isEmpty() ) {
String pattern = "No tests found with test runner ''{0}''.";
String message = MessageFormat.format( pattern, config.getTestKind().getDisplayName() );
abort( message, null, IJavaLaunchConfigurationConstants.ERR_UNSPECIFIED_MAIN_TYPE );
}
}
}