Add basic tests for KotlinStandaloneScriptRunConfiguration

This commit is contained in:
Pavel V. Talanov
2015-11-25 18:51:44 +03:00
parent 7577a375ae
commit 4a1c3f02fd
5 changed files with 140 additions and 45 deletions
@@ -0,0 +1,3 @@
package foo
println("Hello from script")
@@ -0,0 +1,3 @@
package foo
println("Hello from script")
@@ -16,23 +16,17 @@
package org.jetbrains.kotlin.idea.run
import com.intellij.execution.Executor
import com.intellij.execution.Location
import com.intellij.execution.PsiLocation
import com.intellij.execution.RunManagerEx
import com.intellij.execution.actions.ConfigurationContext
import com.intellij.execution.configurations.JavaCommandLine
import com.intellij.execution.configurations.JavaParameters
import com.intellij.execution.configurations.RunConfiguration
import com.intellij.execution.configurations.RunProfile
import com.intellij.execution.executors.DefaultRunExecutor
import com.intellij.execution.runners.ExecutionEnvironment
import com.intellij.execution.runners.ExecutionEnvironmentBuilder
import com.intellij.openapi.module.Module
import com.intellij.openapi.projectRoots.Sdk
import com.intellij.openapi.roots.ModuleRootModificationUtil
import com.intellij.openapi.vfs.VirtualFile
import com.intellij.psi.*
import com.intellij.psi.JavaPsiFacade
import com.intellij.psi.PsiComment
import com.intellij.psi.PsiDocumentManager
import com.intellij.psi.PsiManager
import com.intellij.refactoring.RefactoringFactory
import com.intellij.testFramework.MapDataContext
import com.intellij.testFramework.PlatformTestCase
@@ -43,8 +37,6 @@ import org.jetbrains.kotlin.idea.search.allScope
import org.jetbrains.kotlin.idea.stubindex.KotlinFullClassNameIndex
import org.jetbrains.kotlin.idea.stubindex.KotlinTopLevelFunctionFqnNameIndex
import org.jetbrains.kotlin.idea.test.ConfigLibraryUtil
import org.jetbrains.kotlin.idea.test.ConfigLibraryUtil.configureKotlinJsRuntimeAndSdk
import org.jetbrains.kotlin.idea.test.ConfigLibraryUtil.configureKotlinRuntimeAndSdk
import org.jetbrains.kotlin.idea.test.KotlinCodeInsightTestCase
import org.jetbrains.kotlin.idea.test.PluginTestCaseBase
import org.jetbrains.kotlin.idea.util.application.runWriteAction
@@ -216,24 +208,13 @@ class RunConfigurationTest: KotlinCodeInsightTestCase() {
private fun createConfigurationFromMain(mainFqn: String): JetRunConfiguration {
val mainFunction = KotlinTopLevelFunctionFqnNameIndex.getInstance().get(mainFqn, getTestProject(), getTestProject().allScope()).first()
return createConfigurationFromElement(mainFunction)
return createConfigurationFromElement(mainFunction) as JetRunConfiguration
}
private fun createConfigurationFromObject(objectFqn: String, save: Boolean = false): JetRunConfiguration {
val obj = KotlinFullClassNameIndex.getInstance().get(objectFqn, getTestProject(), getTestProject().allScope()).single()
val mainFunction = obj.getDeclarations().single { it is KtFunction && it.getName() == "main" }
return createConfigurationFromElement(mainFunction, save)
}
private fun createConfigurationFromElement(element: PsiElement?, save: Boolean = false): JetRunConfiguration {
val dataContext = MapDataContext()
dataContext.put(Location.DATA_KEY, PsiLocation(getTestProject(), element))
val runnerAndConfigurationSettings = ConfigurationContext.getFromContext(dataContext).getConfiguration()
if (save) {
RunManagerEx.getInstanceEx(myProject).setTemporaryConfiguration(runnerAndConfigurationSettings)
}
return runnerAndConfigurationSettings!!.getConfiguration() as JetRunConfiguration
return createConfigurationFromElement(mainFunction, save) as JetRunConfiguration
}
private fun configureModule(moduleDir: String, outputParentDir: VirtualFile, configModule: Module = getModule()): CreateModuleResult {
@@ -264,16 +245,6 @@ class RunConfigurationTest: KotlinCodeInsightTestCase() {
private fun moduleDirPath(moduleName: String) = "${getTestDataPath()}${getTestName(false)}/$moduleName"
private fun getJavaRunParameters(configuration: RunConfiguration): JavaParameters {
val state = configuration.getState(MockExecutor, ExecutionEnvironmentBuilder.create(myProject!!, MockExecutor, MockProfile).build())
Assert.assertNotNull(state)
Assert.assertTrue(state is JavaCommandLine)
configuration.checkConfiguration()
return (state as JavaCommandLine).getJavaParameters()!!
}
override fun getTestDataPath() = PluginTestCaseBase.getTestDataPathBase() + "/run/"
override fun getTestProjectJdk() = PluginTestCaseBase.mockJdk()
@@ -283,14 +254,4 @@ class RunConfigurationTest: KotlinCodeInsightTestCase() {
val srcOutputDir: VirtualFile,
val testOutputDir: VirtualFile
)
private object MockExecutor : DefaultRunExecutor() {
override fun getId() = DefaultRunExecutor.EXECUTOR_ID
}
private object MockProfile : RunProfile {
override fun getState(executor: Executor, env: ExecutionEnvironment) = null
override fun getIcon() = null
override fun getName() = null
}
}
@@ -0,0 +1,63 @@
/*
* Copyright 2010-2015 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jetbrains.kotlin.idea.run
import com.intellij.refactoring.RefactoringFactory
import org.jetbrains.kotlin.idea.run.script.standalone.KotlinStandaloneScriptRunConfiguration
import org.jetbrains.kotlin.idea.search.allScope
import org.jetbrains.kotlin.idea.stubindex.KotlinScriptFqnIndex
import org.jetbrains.kotlin.idea.test.KotlinCodeInsightTestCase
import org.jetbrains.kotlin.idea.test.PluginTestCaseBase
import org.junit.Assert
import kotlin.test.assertNotEquals
class StandaloneScriptRunConfigurationTest : KotlinCodeInsightTestCase() {
fun testConfigurationForScript() {
configureByFile("run/simpleScript.kts")
val script = KotlinScriptFqnIndex.instance.get("foo.SimpleScript", project, project.allScope()).single()
val runConfiguration = createConfigurationFromElement(script) as KotlinStandaloneScriptRunConfiguration
Assert.assertEquals(script.containingFile.virtualFile.canonicalPath, runConfiguration.filePath)
Assert.assertEquals("SimpleScript", runConfiguration.name)
val javaParameters = getJavaRunParameters(runConfiguration)
val programParametersList = javaParameters.programParametersList.list
val (first, second) = programParametersList
Assert.assertEquals("Should pass -script to compiler", "-script", first)
Assert.assertTrue("Should pass script file to compiler", second.contains("simpleScript.kts"))
}
fun testOnFileRename() {
configureByFile("renameFile/simpleScript.kts")
val script = KotlinScriptFqnIndex.instance.get("foo.SimpleScript", project, project.allScope()).single()
val runConfiguration = createConfigurationFromElement(script, save = true) as KotlinStandaloneScriptRunConfiguration
Assert.assertEquals("SimpleScript", runConfiguration.name)
val originalPath = script.containingFile.virtualFile.canonicalPath
assertEquals(originalPath, runConfiguration.filePath)
RefactoringFactory.getInstance(project).createRename(script.containingFile, "renamedScript.kts").run()
Assert.assertEquals("RenamedScript", runConfiguration.name)
assertEquals(script.containingFile.virtualFile.canonicalPath, runConfiguration.filePath)
assertNotEquals(originalPath, runConfiguration.filePath)
}
override fun getTestDataPath() = PluginTestCaseBase.getTestDataPathBase() + "/run/StandaloneScript/"
override fun getTestProjectJdk() = PluginTestCaseBase.mockJdk()
}
@@ -0,0 +1,65 @@
/*
* Copyright 2010-2015 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jetbrains.kotlin.idea.run
import com.intellij.execution.Executor
import com.intellij.execution.Location
import com.intellij.execution.PsiLocation
import com.intellij.execution.RunManagerEx
import com.intellij.execution.actions.ConfigurationContext
import com.intellij.execution.configurations.JavaCommandLine
import com.intellij.execution.configurations.JavaParameters
import com.intellij.execution.configurations.RunConfiguration
import com.intellij.execution.configurations.RunProfile
import com.intellij.execution.executors.DefaultRunExecutor
import com.intellij.execution.runners.ExecutionEnvironment
import com.intellij.execution.runners.ExecutionEnvironmentBuilder
import com.intellij.psi.PsiElement
import com.intellij.testFramework.MapDataContext
import org.junit.Assert
fun getJavaRunParameters(configuration: RunConfiguration): JavaParameters {
val state = configuration.getState(MockExecutor, ExecutionEnvironmentBuilder.create(configuration.project, MockExecutor, MockProfile).build())
Assert.assertNotNull(state)
Assert.assertTrue(state is JavaCommandLine)
configuration.checkConfiguration()
return (state as JavaCommandLine).getJavaParameters()!!
}
fun createConfigurationFromElement(element: PsiElement, save: Boolean = false): RunConfiguration {
val dataContext = MapDataContext()
dataContext.put(Location.DATA_KEY, PsiLocation(element.project, element))
val runnerAndConfigurationSettings = ConfigurationContext.getFromContext(dataContext).getConfiguration()
if (save) {
RunManagerEx.getInstanceEx(element.project).setTemporaryConfiguration(runnerAndConfigurationSettings)
}
return runnerAndConfigurationSettings!!.getConfiguration()
}
private object MockExecutor : DefaultRunExecutor() {
override fun getId() = DefaultRunExecutor.EXECUTOR_ID
}
private object MockProfile : RunProfile {
override fun getState(executor: Executor, env: ExecutionEnvironment) = null
override fun getIcon() = null
override fun getName() = null
}