Scratch: tests for repl execution
This commit is contained in:
@@ -129,6 +129,7 @@ import org.jetbrains.kotlin.idea.refactoring.safeDelete.AbstractMultiModuleSafeD
|
|||||||
import org.jetbrains.kotlin.idea.refactoring.safeDelete.AbstractSafeDeleteTest
|
import org.jetbrains.kotlin.idea.refactoring.safeDelete.AbstractSafeDeleteTest
|
||||||
import org.jetbrains.kotlin.idea.repl.AbstractIdeReplCompletionTest
|
import org.jetbrains.kotlin.idea.repl.AbstractIdeReplCompletionTest
|
||||||
import org.jetbrains.kotlin.idea.resolve.*
|
import org.jetbrains.kotlin.idea.resolve.*
|
||||||
|
import org.jetbrains.kotlin.idea.scratch.AbstractScratchRunActionTest
|
||||||
import org.jetbrains.kotlin.idea.script.AbstractScriptConfigurationCompletionTest
|
import org.jetbrains.kotlin.idea.script.AbstractScriptConfigurationCompletionTest
|
||||||
import org.jetbrains.kotlin.idea.script.AbstractScriptConfigurationHighlightingTest
|
import org.jetbrains.kotlin.idea.script.AbstractScriptConfigurationHighlightingTest
|
||||||
import org.jetbrains.kotlin.idea.script.AbstractScriptConfigurationNavigationTest
|
import org.jetbrains.kotlin.idea.script.AbstractScriptConfigurationNavigationTest
|
||||||
@@ -732,6 +733,10 @@ fun main(args: Array<String>) {
|
|||||||
testClass<AbstractSlicerNullnessGroupingTest> {
|
testClass<AbstractSlicerNullnessGroupingTest> {
|
||||||
model("slicer/inflow", singleClass = true)
|
model("slicer/inflow", singleClass = true)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
testClass<AbstractScratchRunActionTest> {
|
||||||
|
model("scratch", extension = "kts")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
testGroup("idea/idea-maven/test", "idea/idea-maven/testData") {
|
testGroup("idea/idea-maven/test", "idea/idea-maven/testData") {
|
||||||
|
|||||||
@@ -30,6 +30,7 @@ import org.jetbrains.kotlin.idea.scratch.ScratchExpression
|
|||||||
import org.jetbrains.kotlin.idea.scratch.ScratchFile
|
import org.jetbrains.kotlin.idea.scratch.ScratchFile
|
||||||
import org.jetbrains.kotlin.idea.scratch.output.ScratchOutput
|
import org.jetbrains.kotlin.idea.scratch.output.ScratchOutput
|
||||||
import org.jetbrains.kotlin.idea.scratch.output.ScratchOutputType
|
import org.jetbrains.kotlin.idea.scratch.output.ScratchOutputType
|
||||||
|
import org.jetbrains.kotlin.idea.scratch.ui.scratchTopPanel
|
||||||
import org.w3c.dom.Element
|
import org.w3c.dom.Element
|
||||||
import org.xml.sax.InputSource
|
import org.xml.sax.InputSource
|
||||||
import java.io.ByteArrayInputStream
|
import java.io.ByteArrayInputStream
|
||||||
@@ -45,7 +46,7 @@ class KtScratchReplExecutor(file: ScratchFile) : ScratchExecutor(file) {
|
|||||||
override fun execute() {
|
override fun execute() {
|
||||||
handlers.forEach { it.onStart(file) }
|
handlers.forEach { it.onStart(file) }
|
||||||
|
|
||||||
val module = file.module ?: return error(file, "Module should be selected")
|
val module = file.scratchTopPanel?.getModule() ?: return error(file, "Module should be selected")
|
||||||
val cmdLine = KotlinConsoleKeeper.createCommandLine(module)
|
val cmdLine = KotlinConsoleKeeper.createCommandLine(module)
|
||||||
|
|
||||||
osProcessHandler = ReplOSProcessHandler(cmdLine)
|
osProcessHandler = ReplOSProcessHandler(cmdLine)
|
||||||
|
|||||||
Vendored
+3
@@ -0,0 +1,3 @@
|
|||||||
|
for (i in 0..5) {
|
||||||
|
println(i)
|
||||||
|
}
|
||||||
Vendored
+3
@@ -0,0 +1,3 @@
|
|||||||
|
for (i in 0..5) { // OUTPUT: 0; 1; 2; 3; 4; 5
|
||||||
|
println(i)
|
||||||
|
}
|
||||||
Vendored
+2
@@ -0,0 +1,2 @@
|
|||||||
|
val a = 1
|
||||||
|
a
|
||||||
+2
@@ -0,0 +1,2 @@
|
|||||||
|
val a = 1
|
||||||
|
a // RESULT: 1
|
||||||
Vendored
+5
@@ -0,0 +1,5 @@
|
|||||||
|
fun foo(): Int {
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
foo()
|
||||||
+5
@@ -0,0 +1,5 @@
|
|||||||
|
fun foo(): Int {
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
foo() // RESULT: 1
|
||||||
+3
@@ -0,0 +1,3 @@
|
|||||||
|
arrayListOf(1, 5, 7).map { it * 2 } // RESULT: 2
|
||||||
|
.filter { it < 10 }
|
||||||
|
.find { it == 2 }
|
||||||
Vendored
+3
@@ -0,0 +1,3 @@
|
|||||||
|
arrayListOf(1, 5, 7).map { it * 2 }
|
||||||
|
.filter { it < 10 }
|
||||||
|
.find { it == 2 }
|
||||||
+3
@@ -0,0 +1,3 @@
|
|||||||
|
arrayListOf(1, 5, 7).map { it * 2 } // RESULT: 2
|
||||||
|
.filter { it < 10 }
|
||||||
|
.find { it == 2 }
|
||||||
Vendored
+1
@@ -0,0 +1 @@
|
|||||||
|
foo()
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
foo() // ERROR: error: unresolved reference: foo
|
||||||
Vendored
+1
@@ -0,0 +1 @@
|
|||||||
|
println("hello")
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
println("hello") // OUTPUT: hello
|
||||||
@@ -0,0 +1,101 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2017 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.scratch
|
||||||
|
|
||||||
|
import com.intellij.ide.scratch.ScratchFileService
|
||||||
|
import com.intellij.ide.scratch.ScratchRootType
|
||||||
|
import com.intellij.openapi.actionSystem.AnAction
|
||||||
|
import com.intellij.openapi.actionSystem.CommonDataKeys
|
||||||
|
import com.intellij.openapi.fileEditor.FileEditorManager
|
||||||
|
import com.intellij.openapi.fileEditor.TextEditor
|
||||||
|
import com.intellij.openapi.project.Project
|
||||||
|
import com.intellij.openapi.vfs.VirtualFile
|
||||||
|
import com.intellij.psi.PsiDocumentManager
|
||||||
|
import com.intellij.testFramework.FileEditorManagerTestCase
|
||||||
|
import com.intellij.testFramework.MapDataContext
|
||||||
|
import com.intellij.testFramework.TestActionEvent
|
||||||
|
import com.intellij.util.ui.UIUtil
|
||||||
|
import org.jetbrains.kotlin.idea.KotlinLanguage
|
||||||
|
import org.jetbrains.kotlin.idea.scratch.actions.RunScratchAction
|
||||||
|
import org.jetbrains.kotlin.idea.scratch.output.InlayScratchOutputHandler
|
||||||
|
import org.jetbrains.kotlin.test.KotlinTestUtils
|
||||||
|
import org.junit.Assert
|
||||||
|
import java.io.File
|
||||||
|
|
||||||
|
abstract class AbstractScratchRunActionTest : FileEditorManagerTestCase() {
|
||||||
|
fun doTest(fileName: String) {
|
||||||
|
val sourceFile = File(testDataPath, fileName)
|
||||||
|
val fileText = sourceFile.readText()
|
||||||
|
|
||||||
|
val scratchFile = ScratchRootType.getInstance().createScratchFile(
|
||||||
|
project,
|
||||||
|
sourceFile.name,
|
||||||
|
KotlinLanguage.INSTANCE,
|
||||||
|
fileText,
|
||||||
|
ScratchFileService.Option.create_new_always
|
||||||
|
) ?: error("Couldn't create scratch file ${sourceFile.path}")
|
||||||
|
|
||||||
|
myFixture.openFileInEditor(scratchFile)
|
||||||
|
|
||||||
|
val event = getActionEvent(myFixture.file.virtualFile, RunScratchAction())
|
||||||
|
launchAction(event, RunScratchAction())
|
||||||
|
|
||||||
|
val start = System.currentTimeMillis()
|
||||||
|
// wait until output is displayed in editor or for 1 minute
|
||||||
|
while (!event.presentation.isEnabled && (System.currentTimeMillis() - start) < 60000) {
|
||||||
|
Thread.sleep(5000)
|
||||||
|
}
|
||||||
|
|
||||||
|
UIUtil.dispatchAllInvocationEvents()
|
||||||
|
|
||||||
|
val editors = FileEditorManager.getInstance(project).getEditors(myFixture.file.virtualFile).filterIsInstance<TextEditor>()
|
||||||
|
val doc =
|
||||||
|
PsiDocumentManager.getInstance(project).getDocument(myFixture.file) ?: error("Document for ${myFixture.file.name} is null")
|
||||||
|
|
||||||
|
val actualOutput = StringBuilder(myFixture.file.text)
|
||||||
|
for (line in doc.lineCount - 1 downTo 0) {
|
||||||
|
editors.flatMap { it.editor.inlayModel.getInlineElementsInRange(doc.getLineStartOffset(line), doc.getLineEndOffset(line)) }
|
||||||
|
.map { it.renderer }
|
||||||
|
.filterIsInstance<InlayScratchOutputHandler.ScratchFileRenderer>()
|
||||||
|
.forEach {
|
||||||
|
val str = it.toString()
|
||||||
|
|
||||||
|
val offset = doc.getLineEndOffset(line)
|
||||||
|
actualOutput.insert(offset, " // $str")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
val expectedFileName = fileName.replace(".kts", ".repl.after")
|
||||||
|
val expectedFile = File("$testDataPath/$expectedFileName")
|
||||||
|
KotlinTestUtils.assertEqualsToFile(expectedFile, actualOutput.toString())
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun launchAction(e: TestActionEvent, action: AnAction) {
|
||||||
|
action.beforeActionPerformedUpdate(e)
|
||||||
|
Assert.assertTrue(e.presentation.isEnabled && e.presentation.isVisible)
|
||||||
|
action.actionPerformed(e)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun getActionEvent(virtualFile: VirtualFile, action: AnAction): TestActionEvent {
|
||||||
|
val context = MapDataContext()
|
||||||
|
context.put(CommonDataKeys.VIRTUAL_FILE_ARRAY, arrayOf(virtualFile))
|
||||||
|
context.put<Project>(CommonDataKeys.PROJECT, myFixture.project)
|
||||||
|
return TestActionEvent(context, action)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun getTestDataPath() = KotlinTestUtils.getHomeDirectory()
|
||||||
|
}
|
||||||
+63
@@ -0,0 +1,63 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
|
||||||
|
* that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.idea.scratch;
|
||||||
|
|
||||||
|
import com.intellij.testFramework.TestDataPath;
|
||||||
|
import org.jetbrains.kotlin.test.JUnit3RunnerWithInners;
|
||||||
|
import org.jetbrains.kotlin.test.KotlinTestUtils;
|
||||||
|
import org.jetbrains.kotlin.test.TargetBackend;
|
||||||
|
import org.jetbrains.kotlin.test.TestMetadata;
|
||||||
|
import org.junit.runner.RunWith;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
|
/** This class is generated by {@link org.jetbrains.kotlin.generators.tests.TestsPackage}. DO NOT MODIFY MANUALLY */
|
||||||
|
@SuppressWarnings("all")
|
||||||
|
@TestMetadata("idea/testData/scratch")
|
||||||
|
@TestDataPath("$PROJECT_ROOT")
|
||||||
|
@RunWith(JUnit3RunnerWithInners.class)
|
||||||
|
public class ScratchRunActionTestGenerated extends AbstractScratchRunActionTest {
|
||||||
|
public void testAllFilesPresentInScratch() throws Exception {
|
||||||
|
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/scratch"), Pattern.compile("^(.+)\\.kts$"), TargetBackend.ANY, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("for.kts")
|
||||||
|
public void testFor() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/scratch/for.kts");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("simple.kts")
|
||||||
|
public void testSimple() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/scratch/simple.kts");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("simpleFun.kts")
|
||||||
|
public void testSimpleFun() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/scratch/simpleFun.kts");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("stdlibFun.kts")
|
||||||
|
public void testStdlibFun() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/scratch/stdlibFun.kts");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("unresolved.kts")
|
||||||
|
public void testUnresolved() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/scratch/unresolved.kts");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("userOutput.kts")
|
||||||
|
public void testUserOutput() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/scratch/userOutput.kts");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user