package com.intellij.coldFusion; import com.intellij.coldFusion.UI.runner.CfmlRunConfiguration; import com.intellij.coldFusion.UI.runner.CfmlRunConfigurationType; import com.intellij.execution.RunManager; import com.intellij.execution.RunManagerEx; import com.intellij.execution.RunnerAndConfigurationSettings; import com.intellij.execution.actions.ConfigurationContext; import com.intellij.execution.actions.ConfigurationFromContext; import com.intellij.execution.actions.RunConfigurationProducer; import com.intellij.execution.configurations.RunConfiguration; import com.intellij.execution.lineMarker.ExecutorAction; import com.intellij.ide.DataManager; import com.intellij.openapi.actionSystem.*; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.options.ConfigurationException; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.PsiFile; import com.intellij.testFramework.UsefulTestCase; import junit.framework.TestCase; import org.jetbrains.annotations.Nullable; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.util.ArrayList; import java.util.List; public class CfmlRunConfigurationTest extends CfmlCodeInsightFixtureTestCase { private static final String WWWROOT_SRC = "wwwroot/src/"; private PsiFile indexCfm; private PsiFile index2Cfm; protected void setUp() throws Exception { super.setUp(); indexCfm = createCfmPsiFile("index.cfm"); index2Cfm = createCfmPsiFile("index2.cfm"); } public void testDefaultRunConfiguration() throws IOException { final CfmlRunConfiguration configuration = getDefaultCfmlRunConfiguration(); final String url = configuration.getRunnerParameters().getUrl(); TestCase.assertEquals(true, StringUtil.startsWith(url, "http://localhost:8500/")); TestCase.assertEquals(false, StringUtil.startsWith(url, "http://localhost:8500//")); } public CfmlRunConfiguration getDefaultCfmlRunConfiguration() throws IOException { final Project project = myFixture.getProject(); final Editor editor = openCfmFileInEditor(indexCfm); final Presentation presentation = getPresentationForRunAction(editor); assert editor != null; final DataContext dataContext = DataManager.getInstance().getDataContext(editor.getComponent()); TestCase.assertEquals("Run 'index.cfm'", presentation.getText()); final ConfigurationContext configurationContext = ConfigurationContext.getFromContext(dataContext); final List<RunConfigurationProducer<?>> producers = RunConfigurationProducer.getProducers(project); List<ConfigurationFromContext> configs = new ArrayList<>(); for (RunConfigurationProducer<?> producer : producers) { final ConfigurationFromContext configurationFromContext = producer.createConfigurationFromContext(configurationContext); if (configurationFromContext != null) configs.add(configurationFromContext); } TestCase.assertEquals(true, configs.size() == 1); final ConfigurationFromContext defaultConfigurationFromContext = configs.get(0); final RunConfiguration configuration = defaultConfigurationFromContext.getConfiguration(); TestCase.assertNotNull(configuration); UsefulTestCase.assertInstanceOf(configuration, CfmlRunConfiguration.class); return (CfmlRunConfiguration)configuration; } public void generateNonDefaultRunConfiguration() throws IOException, ConfigurationException { final CfmlRunConfiguration defaultCfmlRunConfiguration = getDefaultCfmlRunConfiguration(); final CfmlRunConfiguration clonedConfiguration = (CfmlRunConfiguration) defaultCfmlRunConfiguration.clone(); clonedConfiguration.getRunnerParameters().setUrl("http://4.4.4.4/src/index.cfm"); final RunnerAndConfigurationSettings runnerAndConfigurationSettings = RunManager.getInstance(getProject()) .createConfiguration(clonedConfiguration, CfmlRunConfigurationType.getInstance().getConfigurationFactories()[0]); RunManager.getInstance(getProject()).addConfiguration(runnerAndConfigurationSettings, false); } private static CfmlRunConfiguration getContextRunConfiguration(Editor editor){ final DataContext dataContext = DataManager.getInstance().getDataContext(editor.getComponent()); final ConfigurationContext configurationContext = ConfigurationContext.getFromContext(dataContext); //this block emulates RunContextAction.perform() RunnerAndConfigurationSettings configuration = configurationContext.findExisting(); if (configuration == null) { configuration = configurationContext.getConfiguration(); if (configuration == null) { return null; } ((RunManagerEx)configurationContext.getRunManager()).setTemporaryConfiguration(configuration); } //end of the emulated block return (CfmlRunConfiguration)configuration.getConfiguration(); } public void testNonDefaultRunConfiguration() throws IOException, ConfigurationException { generateNonDefaultRunConfiguration(); final Editor editor = myFixture.getEditor(); final CfmlRunConfiguration cfmlConfig = getContextRunConfiguration(editor); assert cfmlConfig != null; cfmlConfig.getRunnerParameters().getUrl(); assertEquals("http://4.4.4.4/src/index.cfm", cfmlConfig.getRunnerParameters().getUrl()); } public void testCreateContextRunConfiguration() throws IOException, ConfigurationException { generateNonDefaultRunConfiguration(); final Editor editor = openCfmFileInEditor(index2Cfm); final CfmlRunConfiguration configuration = getContextRunConfiguration(editor); assert configuration != null; TestCase.assertEquals("http://localhost:8500/src/index2.cfm", configuration.getRunnerParameters().getUrl()); TestCase.assertEquals("index2.cfm", configuration.getName()); } public PsiFile createCfmPsiFile(String filename) throws IOException { String filePath = getDataPath() + filename; FileInputStream fileInputStream = new FileInputStream(new File(filePath)); try { String testText = StringUtil.convertLineSeparators(FileUtil.loadTextAndClose(fileInputStream)); return myFixture.addFileToProject(WWWROOT_SRC + filename, testText); } catch (FileNotFoundException fnfe) { fnfe.printStackTrace(); } finally { fileInputStream.close(); } return null; } @Nullable public Editor openCfmFileInEditor(PsiFile cfmFile) throws IOException { myFixture.openFileInEditor(cfmFile.getVirtualFile()); final Editor editor = myFixture.getEditor(); myFixture.openFileInEditor(cfmFile.getVirtualFile()); return editor; } public Presentation getPresentationForRunAction(Editor editor){ AnAction[] actions = ExecutorAction.getActions(); final AnAction runAction = actions[0]; AnActionEvent e = AnActionEvent.createFromDataContext(ActionPlaces.EDITOR_POPUP, null, DataManager .getInstance().getDataContext(myFixture.getEditor().getComponent())); runAction.update(e); return e.getPresentation(); } protected String getDataPath() { return CfmlTestUtil.BASE_TEST_DATA_PATH + "/runconfig/"; } }