package org.xtest.ui.runner;
import java.util.List;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.OperationCanceledException;
import org.eclipse.core.runtime.SubMonitor;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.xtext.ui.validation.DefaultResourceUIValidatorExtension;
import org.eclipse.xtext.validation.CheckMode;
import org.eclipse.xtext.validation.Issue;
import org.xtest.preferences.PerFilePreferenceProvider;
import org.xtest.preferences.RuntimePref;
import org.xtest.results.XTestResult;
import org.xtest.runner.external.DependencyAcceptor;
import org.xtest.runner.external.TestResult;
import org.xtest.ui.editor.SpecialResourceValidator;
import org.xtest.ui.resource.XtestDependencyAcceptingResource;
import org.xtest.xTest.Body;
import com.google.inject.Inject;
/**
* Runs Xtest files and adds error markers to the file for failed tests
*
* @author Michael Barry
*/
public class TestRunner extends DefaultResourceUIValidatorExtension {
@Inject
private PerFilePreferenceProvider prefProvider;
@Inject
private SpecialResourceValidator resourceValidator;
/**
* Run an xtest file
*
* @param file
* The xtest file to run
* @param resource
* The EMF resource associated with that file
* @param acceptor
* The dependency acceptor
* @param monitor
* The progress monitor
* @return The test result, either pass or fail
*/
public TestResult runTests(IFile file, Resource resource, DependencyAcceptor acceptor,
IProgressMonitor monitor) {
TestResult result = TestResult.notRun();
SubMonitor subMonitor = SubMonitor.convert(monitor, 1);
try {
Body body = null;
if (resource instanceof XtestDependencyAcceptingResource) {
XtestDependencyAcceptingResource resource2 = (XtestDependencyAcceptingResource) resource;
resource2.setAcceptor(acceptor);
body = (Body) resource2.getContents().get(0);
}
if (body == null || prefProvider.get(body, RuntimePref.RUN_ON_SAVE)) {
List<Issue> list = resourceValidator.validate(resource, CheckMode.EXPENSIVE_ONLY,
getCancelIndicator(subMonitor));
if (subMonitor.isCanceled()) {
throw new OperationCanceledException();
}
subMonitor.worked(1);
deleteMarkers(file, CheckMode.EXPENSIVE_ONLY, subMonitor);
if (file.findMaxProblemSeverity(null, true, 0) == IMarker.SEVERITY_ERROR) {
// don't bother adding new errors if there are errors still left after removing
// expensive markers tests because there is already an error
} else {
createMarkers(file, list, subMonitor);
}
if (resource instanceof XtestDependencyAcceptingResource) {
XtestDependencyAcceptingResource resource2 = (XtestDependencyAcceptingResource) resource;
XTestResult result2 = resource2.getResult();
if (result2 != null) {
result = TestResult.create(result2.countFailures(),
result2.countPendings(), result2.countTests());
}
}
if (result.getNumTotal() == 0
&& file.findMaxProblemSeverity(null, true, 0) == IMarker.SEVERITY_ERROR) {
result = TestResult.syntaxFailure();
}
} else {
// Clear expensive markers when run-on-save disabled
deleteMarkers(file, CheckMode.EXPENSIVE_ONLY, subMonitor);
}
} catch (CoreException e) {
}
return result;
}
}