package org.elixir_lang.mix.importWizard; import com.intellij.compiler.CompilerWorkspaceConfiguration; import com.intellij.ide.projectWizard.ProjectWizardTestCase; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.PathMacros; import com.intellij.openapi.components.PathMacroManager; import com.intellij.openapi.module.Module; import com.intellij.openapi.module.ModuleManager; import com.intellij.openapi.project.Project; import com.intellij.openapi.projectRoots.ProjectJdkTable; import com.intellij.openapi.projectRoots.Sdk; import com.intellij.openapi.roots.ModuleRootManager; import com.intellij.openapi.roots.impl.ModuleRootManagerImpl; import com.intellij.openapi.util.JDOMUtil; import com.intellij.openapi.util.io.FileUtil; import org.elixir_lang.configuration.ElixirCompilerSettings; import org.elixir_lang.sdk.ElixirSdkRelease; import org.elixir_lang.sdk.ElixirSdkType; import org.jdom.Document; import org.jdom.Element; import org.jetbrains.annotations.NotNull; import java.io.File; import java.util.Arrays; /** * Created by zyuyou on 15/7/17. */ public class MixProjectImportBuilderTest extends ProjectWizardTestCase{ private static final String[] FORMATS = new String[]{"14", "2017.1"}; private static final String MODULE_DIR = "MODULE_DIR"; private static final String TEST_DATA = "testData/org/elixir_lang/"; private static final String TEST_DATA_IMPORT = TEST_DATA + "mix/import/"; private static final String MOCK_SDK_DIR = TEST_DATA + "mockSdk-1.0.4/"; public void testFromRootMixExsFile() throws Exception{ doTest(); } @Override protected String getTestDirectoryName() { return super.getTestDirectoryName(); } @Override protected void setUp() throws Exception { super.setUp(); createMockSdk(); File currentTestRoot = new File(TEST_DATA_IMPORT, getTestName(true)); FileUtil.copyDir(currentTestRoot, new File(getProject().getBaseDir().getPath())); } private static void createMockSdk(){ final Sdk mockSdk = ElixirSdkType.createMockSdk(MOCK_SDK_DIR, ElixirSdkRelease.V_1_0_4); ApplicationManager.getApplication().runWriteAction(() -> ProjectJdkTable.getInstance().addJdk(mockSdk)); } private void doTest() throws Exception{ String projectPath = getProject().getBaseDir().getPath(); String importFromPath = projectPath + "/test/"; Module firstModule = importProjectFrom(importFromPath, null, new MixProjectImportProvider(new MixProjectImportBuilder())); Project createProject = firstModule.getProject(); validateProject(createProject); for(Module importedModule: ModuleManager.getInstance(createProject).getModules()){ validateModule(importedModule); } } private static void validateProject(@NotNull Project project){ ElixirCompilerSettings compilerSettings = ElixirCompilerSettings.getInstance(project); assertNotNull("Elixir compiler settings are not created.", compilerSettings); assertTrue("Mix compiler is not set as default compiler.", compilerSettings.isUseMixCompilerEnabled()); assertFalse("Clear output directory flag was not unset", CompilerWorkspaceConfiguration.getInstance(project).CLEAR_OUTPUT_DIRECTORY); } private void validateModule(@NotNull Module module) throws Exception{ String importedModulePath = getProject().getBaseDir().getPath(); Element actualImlElement = new Element("root"); ((ModuleRootManagerImpl) ModuleRootManager.getInstance(module)).getState().writeExternal(actualImlElement); PathMacros.getInstance().setMacro(MODULE_DIR, importedModulePath); PathMacroManager.getInstance(module).collapsePaths(actualImlElement); PathMacroManager.getInstance(getProject()).collapsePaths(actualImlElement); PathMacros.getInstance().removeMacro(MODULE_DIR); String projectPath = getProject().getBaseDir().getPath(); StringBuilder expected = new StringBuilder("Configuration of module ").append(module.getName()).append(" does not meet expectations\nExpected:\n"); boolean formattedFound = false; for (String format : FORMATS) { File expectedImlFile = new File(projectPath + "/expected/" + format + "/" + module.getName() + ".iml"); Document expectedIml = JDOMUtil.loadDocument(expectedImlFile); Element expectedImlElement = expectedIml.getRootElement(); expected.append(Arrays.toString(JDOMUtil.printDocument(expectedIml, "\n"))).append('\n'); if (JDOMUtil.areElementsEqual(expectedImlElement, actualImlElement)) { assertTrue(true); formattedFound = true; } } if (!formattedFound) { String errorMsg = expected .append("\nBut got:\n") .append(Arrays.toString(JDOMUtil.printDocument(new Document(actualImlElement), "\n"))) .toString(); assertTrue(errorMsg, false); } } }