package jetbrains.mps.baseLanguage.unitTest.execution.server;
/*Generated by MPS */
import jetbrains.mps.baseLanguage.unitTest.execution.client.ITestNodeWrapper;
import org.junit.runner.Request;
import java.util.List;
import java.util.ArrayList;
import jetbrains.mps.smodel.ModelAccess;
import org.jetbrains.mps.openapi.module.SModule;
import org.junit.runner.Description;
import org.jetbrains.annotations.NotNull;
import jetbrains.mps.module.ModuleClassLoaderIsNullException;
import jetbrains.mps.module.ReloadableModule;
import jetbrains.mps.classloading.ClassLoaderManager;
import jetbrains.mps.classloading.ModuleIsNotLoadableException;
import org.jetbrains.mps.openapi.model.SNode;
import org.jetbrains.mps.openapi.model.SModel;
import jetbrains.mps.lang.smodel.generator.smodelAdapter.SNodeOperations;
import org.jetbrains.mps.openapi.module.SModuleReference;
import jetbrains.mps.smodel.ModuleRepositoryFacade;
import org.junit.runner.Runner;
import org.junit.runner.notification.RunNotifier;
import org.junit.runner.notification.Failure;
public class NodeWrappersTestsContributor implements TestsContributor {
private final Iterable<? extends ITestNodeWrapper> myTestNodes;
public NodeWrappersTestsContributor(Iterable<? extends ITestNodeWrapper> testNodes) {
myTestNodes = testNodes;
}
@Override
public Iterable<Request> gatherTests() throws Exception {
final List<Request> requestList = new ArrayList<Request>();
ModelAccess.instance().runReadAction(new Runnable() {
public void run() {
for (ITestNodeWrapper<?> testNode : myTestNodes) {
String fqName = testNode.getFqName();
final SModule module = getModuleByNode(testNode.getNode());
if (testNode.isTestCase()) {
Request requestForClass;
try {
final Class<?> aClass = loadTestClass(fqName, module);
requestForClass = Request.aClass(aClass);
} catch (ClassNotFoundException e) {
requestForClass = new NodeWrappersTestsContributor.EmptyRequest(Description.createSuiteDescription(fqName), e);
}
TestNodeRequest request = new TestNodeRequest(requestForClass, testNode);
requestList.add(request);
} else {
int index = fqName.lastIndexOf('.');
String testFqName = fqName.substring(0, index);
String methodName = fqName.substring(index + 1);
Request requestForMethod;
try {
final Class aClass = loadTestClass(testFqName, module);
requestForMethod = Request.method(aClass, methodName);
} catch (ClassNotFoundException e) {
requestForMethod = new NodeWrappersTestsContributor.EmptyRequest(Description.createTestDescription(testFqName, methodName), e);
}
TestNodeRequest request = new TestNodeRequest(requestForMethod, testNode);
requestList.add(request);
}
}
}
});
return requestList;
}
@NotNull
private Class<?> loadTestClass(String fqName, SModule module) throws ClassNotFoundException, ModuleClassLoaderIsNullException {
if (module instanceof ReloadableModule && ClassLoaderManager.getInstance().isLoadedByMPS(((ReloadableModule) module))) {
return ((ReloadableModule) module).getOwnClass(fqName);
} else {
throw new ModuleIsNotLoadableException(module, "Module's " + module + " classes are managed by MPS (try setting compileInMPS flag to true)");
}
}
private SModule getModuleByNode(SNode testNode) {
final SModel model = SNodeOperations.getModel(testNode);
final SModuleReference moduleReference = model.getModule().getModuleReference();
return ModuleRepositoryFacade.getInstance().getModule(moduleReference);
}
private static class EmptyRequest extends Request {
private final Description myDescription;
private final Exception myException;
public EmptyRequest(Description description, Exception exception) {
myDescription = description;
myException = exception;
}
public Runner getRunner() {
return new NodeWrappersTestsContributor.EmptyRequest.IgnoringRunner();
}
private class IgnoringRunner extends Runner {
@Override
public Description getDescription() {
return myDescription;
}
@Override
public void run(RunNotifier notifier) {
notifier.fireTestStarted(myDescription);
notifier.fireTestAssumptionFailed(new Failure(myDescription, myException));
notifier.fireTestFinished(myDescription);
}
}
}
}