package com.intellij.flex.bc; import com.intellij.lang.javascript.ConversionTestBase; import com.intellij.lang.javascript.flex.projectStructure.model.impl.ConversionHelper; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.PathMacros; import com.intellij.openapi.projectRoots.ProjectJdkTable; import com.intellij.openapi.projectRoots.impl.ProjectJdkTableImpl; import com.intellij.openapi.roots.impl.libraries.ApplicationLibraryTable; import com.intellij.openapi.roots.libraries.Library; import com.intellij.openapi.util.JDOMUtil; import com.intellij.openapi.util.io.FileUtil; import org.jdom.Element; import org.jdom.JDOMException; import java.io.File; import java.io.IOException; import java.nio.file.Path; import java.nio.file.Paths; import static com.intellij.testFramework.assertions.Assertions.assertThat; public abstract class ConversionTestBaseEx extends ConversionTestBase { private static final String SDK_HOME_VAR = "TEST_SDK_HOME"; private static final String SDK_HOME_VAR_2 = "TEST_SDK_HOME_2"; private static final String PROJECT_VAR = "TEST_PROJECT"; public static final String JDK_TABLE_XML = "jdk.table.xml"; public static final String GLOBAL_LIBS_XML = "applicationLibraries.xml"; private Element myOriginalGlobalLibraries; private Element myOriginalSkds; protected boolean checkJdk() { return true; } @Override protected void setUp() throws Exception { super.setUp(); myOriginalGlobalLibraries = ApplicationLibraryTable.getApplicationTable().getState(); if (checkJdk()) { myOriginalSkds = ((ProjectJdkTableImpl)ProjectJdkTable.getInstance()).getState(); PathMacros.getInstance().setMacro(SDK_HOME_VAR, FileUtil.toCanonicalPath(getHomePath() + getBasePath() + "_fake_sdk")); PathMacros.getInstance().setMacro(SDK_HOME_VAR_2, FileUtil.toCanonicalPath(getHomePath() + getBasePath() + "_fake_sdk_2")); } } @Override protected void tearDown() throws Exception { try { ApplicationManager.getApplication().runWriteAction(() -> { final Library[] libraries = ApplicationLibraryTable.getApplicationTable().getLibraries(); for (Library library : libraries) { ApplicationLibraryTable.getApplicationTable().removeLibrary(library); } ApplicationLibraryTable.getApplicationTable().loadState(myOriginalGlobalLibraries); if (checkJdk()) { ((ProjectJdkTableImpl)ProjectJdkTable.getInstance()).loadState(myOriginalSkds); } }); if (checkJdk()) { PathMacros.getInstance().removeMacro(SDK_HOME_VAR); PathMacros.getInstance().removeMacro(SDK_HOME_VAR_2); } if (PathMacros.getInstance().getAllMacroNames().contains(PROJECT_VAR)) { PathMacros.getInstance().removeMacro(PROJECT_VAR); } } finally { super.tearDown(); } } @Override protected boolean doTest(String testName, boolean conversionShouldHappen) throws IOException, JDOMException { String path = getHomePath() + getBasePath() + testName; final File globalBefore = new File(path, "global_before"); ApplicationManager.getApplication().runWriteAction(() -> { try { if (checkJdk()) { Element d = JDOMUtil.load(new File(globalBefore, JDK_TABLE_XML)); ConversionHelper.expandPaths(d); ((ProjectJdkTableImpl)ProjectJdkTable.getInstance()).loadState(d); } { Element d = JDOMUtil.load(new File(globalBefore, GLOBAL_LIBS_XML)); ConversionHelper.expandPaths(d); ApplicationLibraryTable.getApplicationTable().loadState(d); } } catch (Exception e) { throw new RuntimeException(e); } }); if (!super.doTest(testName, conversionShouldHappen)) { return false; } Path globalAfter = Paths.get(path, "global_after"); if (checkJdk()) { Element sdkState = ((ProjectJdkTableImpl)ProjectJdkTable.getInstance()).getState(); ConversionHelper.collapsePaths(sdkState); assertThat(sdkState).isEqualTo(globalAfter.resolve(JDK_TABLE_XML)); } { Element globalLibState = ApplicationLibraryTable.getApplicationTable().getState(); ConversionHelper.collapsePaths(globalLibState); assertThat(globalLibState).isEqualTo(globalAfter.resolve(GLOBAL_LIBS_XML)); } return true; } }