package jetbrains.mps.testbench;
/*Generated by MPS */
import org.junit.runner.RunWith;
import jetbrains.mps.testbench.junit.runners.TeamCityParameterizedRunner;
import jetbrains.mps.project.Project;
import org.jetbrains.mps.openapi.module.SModule;
import org.junit.runners.Parameterized;
import java.util.List;
import java.lang.reflect.InvocationTargetException;
import jetbrains.mps.tool.environment.Environment;
import jetbrains.mps.tool.environment.MpsEnvironment;
import jetbrains.mps.tool.environment.EnvironmentConfig;
import jetbrains.mps.testbench.junit.runners.FromProjectPathProjectStrategy;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import org.junit.Test;
import jetbrains.mps.testbench.junit.Order;
import org.junit.Assert;
import jetbrains.mps.internal.collections.runtime.IterableUtils;
/**
* todo: extract common part from ProjectTest and BaseCheckModulesTest
*/
@RunWith(TeamCityParameterizedRunner.class)
public class ProjectTest {
private static Project ourContextProject;
private final ModuleGenerationHolder generationHolder;
public ProjectTest(SModule module, ModuleGenerationHolder generationHolder) {
// module argument only for test name
this.generationHolder = generationHolder;
}
@Parameterized.Parameters
public static List<Object[]> testParameters() throws InvocationTargetException, InterruptedException {
initTestEnvironment();
return createTestParametersFromModules(ourContextProject.getModules());
}
public static void initTestEnvironment() throws InvocationTargetException, InterruptedException {
Environment env = MpsEnvironment.getOrCreate(EnvironmentConfig.defaultConfig());
ourContextProject = env.createProject(new FromProjectPathProjectStrategy());
}
public static List<Object[]> createTestParametersFromModules(Iterable<? extends SModule> modules) {
ArrayList<Object[]> res = new ArrayList<Object[]>();
for (SModule module : modules) {
res.add(new Object[]{module, new ModuleGenerationHolder(module, ourContextProject)});
}
Collections.sort(res, new Comparator<Object[]>() {
@Override
public int compare(Object[] o1, Object[] o2) {
return String.valueOf(o1[0]).compareTo(String.valueOf(o2[0]));
}
});
return res;
}
@Test
@Order(value = 1)
public void buildModule() throws Exception {
generationHolder.build();
if (!(generationHolder.isBuildSuccessful())) {
List<String> errors = generationHolder.buildErrors();
Assert.assertTrue("Build errors:\n" + IterableUtils.join(errors, "\n"), errors.isEmpty());
List<String> warns = generationHolder.buildWarns();
Assert.assertTrue("Build warnings:\n" + IterableUtils.join(warns, "\n"), warns.isEmpty());
// sanity, if build fails without messages
Assert.fail(String.format("Make failed with %d errors and %d warnings", errors.size(), warns.size()));
}
}
@Test
@Order(value = 2)
public void diffModule() throws Exception {
if (generationHolder.needsGeneration()) {
Assert.assertTrue("Can't diff a module that needs generation but didn't get any file generated", generationHolder.hasFilesGenerated());
}
List<String> diffReport = generationHolder.diff();
Assert.assertTrue("Difference:\n" + IterableUtils.join(diffReport, "\n"), diffReport.isEmpty());
generationHolder.cleanUp();
}
}