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); } }