package CloneModule.test.test;
/*Generated by MPS */
import junit.framework.TestCase;
import org.apache.log4j.Logger;
import org.apache.log4j.LogManager;
import jetbrains.mps.vfs.IFile;
import jetbrains.mps.project.MPSProject;
import org.jetbrains.mps.openapi.module.SModuleReference;
import org.jetbrains.mps.openapi.persistence.PersistenceFacade;
import jetbrains.mps.project.MPSExtentions;
import jetbrains.mps.smodel.Language;
import jetbrains.mps.project.AbstractModule;
import junit.framework.Assert;
import jetbrains.mps.baseLanguage.closures.runtime.Wrappers;
import java.util.List;
import org.jetbrains.mps.openapi.model.SModel;
import jetbrains.mps.tool.environment.Environment;
import jetbrains.mps.tool.environment.IdeaEnvironment;
import jetbrains.mps.tool.environment.EnvironmentConfig;
import java.io.File;
import jetbrains.mps.vfs.IFileUtils;
import jetbrains.mps.project.validation.MessageCollectProcessor;
import jetbrains.mps.project.validation.ValidationProblem;
import jetbrains.mps.project.validation.ValidationUtil;
import org.apache.log4j.Level;
import jetbrains.mps.util.Reference;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.application.ModalityState;
import org.jetbrains.annotations.NotNull;
import jetbrains.mps.project.Solution;
import org.jetbrains.mps.openapi.module.SModule;
import jetbrains.mps.ide.newModuleDialogs.CopyModuleHelper;
public class CloneModule_Test extends TestCase {
private static final Logger LOG = LogManager.getLogger(CloneModule_Test.class);
private static final String PROJECT_PATH = "testbench/modules/testCloneModule/";
private static final String SUFFIX = "_testclone";
private IFile clonedModulesDirectory;
private MPSProject project;
private final SModuleReference XML = PersistenceFacade.getInstance().createModuleReference("04399201-cb79-4edc-8d1a-e2b946892642(XML)");
private final SModuleReference PER_ROOT = PersistenceFacade.getInstance().createModuleReference("1b06eede-ff4f-40f3-92e8-3cf27f8127bd(PER_ROOT)");
private final SModuleReference BINARY = PersistenceFacade.getInstance().createModuleReference("6c080adc-7c51-4b56-a8e2-17397071f3cc(BINARY)");
private final SModuleReference TEST_LANG = PersistenceFacade.getInstance().createModuleReference("d1ea9b08-060f-4f7d-83b7-0f97f71cbbf7(TestLanguage)");
private final SModuleReference TEST_LANG_ACCESORIES = PersistenceFacade.getInstance().createModuleReference("eee56556-94d4-4d71-a8ea-0e2403133b8d(TestLanguage_ACCESORIES)");
public void test_cloneXMLSolution() throws Exception {
testModule(resolveSolution(XML), MPSExtentions.DOT_SOLUTION);
}
public void test_clonePerRootSolution() throws Exception {
testModule(resolveSolution(PER_ROOT), MPSExtentions.DOT_SOLUTION);
}
public void test_cloneBinarySolution() throws Exception {
testModule(resolveSolution(BINARY), MPSExtentions.DOT_SOLUTION);
}
public void test_cloneLanguage() throws Exception {
testModule(resolveLanguage(TEST_LANG), MPSExtentions.DOT_LANGUAGE);
}
public void test_cloneLanguageWithAcessoryModels() throws Exception {
final Language originalLang = resolveLanguage(TEST_LANG_ACCESORIES);
AbstractModule module = testModule(originalLang, MPSExtentions.DOT_LANGUAGE);
Assert.assertTrue("Language clone is not a language", module instanceof Language);
final Language clonedLang = as_i3fixg_a0a4a41(module, Language.class);
final Wrappers._T<List<SModel>> originalAccesoryModels = new Wrappers._T<List<SModel>>();
final Wrappers._T<List<SModel>> clonedAccesoryModels = new Wrappers._T<List<SModel>>();
executeUnderLock(new Runnable() {
public void run() {
originalAccesoryModels.value = originalLang.getAccessoryModels();
clonedAccesoryModels.value = clonedLang.getAccessoryModels();
}
});
Assert.assertEquals("Different count of accesory models", originalAccesoryModels.value.size(), clonedAccesoryModels.value.size());
int size = originalAccesoryModels.value.size();
for (int i = 0; i < size; i++) {
SModel originalAccesoryModel = originalAccesoryModels.value.get(i);
SModel clonedAccesoryModel = clonedAccesoryModels.value.get(i);
Assert.assertFalse("Same accesory models", originalAccesoryModel.equals(clonedAccesoryModel));
Assert.assertFalse("Same accesory model references", originalAccesoryModel.getReference().equals(clonedAccesoryModel.getReference()));
}
}
public void setUp() {
Environment env = IdeaEnvironment.getOrCreate(EnvironmentConfig.defaultConfig());
project = ((MPSProject) env.openProject(new File(PROJECT_PATH)));
executeUnderLock(new Runnable() {
public void run() {
clonedModulesDirectory = IFileUtils.createTmpDir();
}
});
}
public void tearDown() {
executeUnderLock(new Runnable() {
public void run() {
clonedModulesDirectory.delete();
}
});
}
public static void checkModule(AbstractModule module) {
MessageCollectProcessor<ValidationProblem> processor = new MessageCollectProcessor<ValidationProblem>();
ValidationUtil.validateModule(module, processor);
if (!(processor.getErrors().isEmpty())) {
for (String error : processor.getErrors()) {
if (LOG.isEnabledFor(Level.ERROR)) {
LOG.error("Error found while checking '" + module + "': " + error);
}
}
org.junit.Assert.fail();
}
}
public void executeUnderLock(final Runnable runnable) {
final Reference<Throwable> ref = new Reference<Throwable>();
ApplicationManager.getApplication().invokeAndWait(new Runnable() {
public void run() {
project.getModelAccess().executeCommand(new Runnable() {
public void run() {
try {
runnable.run();
} catch (Throwable t) {
ref.set(t);
}
}
});
}
}, ModalityState.defaultModalityState());
if (!(ref.isNull())) {
throw new RuntimeException(ref.get());
}
}
@NotNull
private Solution resolveSolution(@NotNull final SModuleReference moduleRef) {
final Wrappers._T<SModule> module = new Wrappers._T<SModule>();
executeUnderLock(new Runnable() {
public void run() {
module.value = moduleRef.resolve(project.getRepository());
}
});
Assert.assertTrue("Solution expected; Something wrong in test case", module.value instanceof Solution);
return (Solution) module.value;
}
@NotNull
private Language resolveLanguage(@NotNull final SModuleReference moduleRef) {
final Wrappers._T<SModule> module = new Wrappers._T<SModule>();
executeUnderLock(new Runnable() {
public void run() {
module.value = moduleRef.resolve(project.getRepository());
}
});
Assert.assertTrue("Language expected; Something wrong in test case", module.value instanceof Language);
return (Language) module.value;
}
@NotNull
private AbstractModule testModule(@NotNull final AbstractModule originalModule, final String moduleFileNameExtension) {
final Wrappers._T<AbstractModule> clonedModule = new Wrappers._T<AbstractModule>();
executeUnderLock(new Runnable() {
public void run() {
String clonedModuleName = originalModule.getModuleName() + SUFFIX;
IFile copyLocation = clonedModulesDirectory.getDescendant(clonedModuleName + moduleFileNameExtension);
CopyModuleHelper helper = new CopyModuleHelper(project, originalModule, clonedModuleName, copyLocation, "");
clonedModule.value = helper.copy();
Assert.assertEquals(clonedModule.value.getModuleName(), clonedModuleName);
checkModule(originalModule);
checkModule(clonedModule.value);
}
});
return clonedModule.value;
}
private static <T> T as_i3fixg_a0a4a41(Object o, Class<T> type) {
return (type.isInstance(o) ? (T) o : null);
}
}