From 740f311af695fc33bb90271d004528e7e2542ce5 Mon Sep 17 00:00:00 2001 From: Dmitry Kovanikov Date: Mon, 24 Aug 2015 12:49:08 +0300 Subject: [PATCH] [test] Fix testOnRunPossibility --- .../kotlin/console/KotlinConsoleKeeper.kt | 4 +- .../kotlin/console/KotlinConsoleRunner.kt | 15 +++++++- .../actions/BuildAndRestartConsoleAction.kt | 5 ++- .../kotlin/idea/console/KotlinReplTest.kt | 38 ++++--------------- 4 files changed, 27 insertions(+), 35 deletions(-) diff --git a/idea/idea-repl/src/org/jetbrains/kotlin/console/KotlinConsoleKeeper.kt b/idea/idea-repl/src/org/jetbrains/kotlin/console/KotlinConsoleKeeper.kt index 0748bea03d0..00eaf21ff4d 100644 --- a/idea/idea-repl/src/org/jetbrains/kotlin/console/KotlinConsoleKeeper.kt +++ b/idea/idea-repl/src/org/jetbrains/kotlin/console/KotlinConsoleKeeper.kt @@ -44,11 +44,11 @@ public class KotlinConsoleKeeper(val project: Project) { fun putVirtualFileToConsole(virtualFile: VirtualFile, console: KotlinConsoleRunner) = consoleMap.put(virtualFile, console) fun removeConsole(virtualFile: VirtualFile) = consoleMap.remove(virtualFile) - fun run(module: Module): KotlinConsoleRunner? { + fun run(module: Module, testMode: Boolean = false): KotlinConsoleRunner? { val path = module.moduleFilePath val cmdLine = createCommandLine(module) ?: return errorNotification(project, "Module SDK not found") let { null } - val consoleRunner = KotlinConsoleRunner(cmdLine, module, project, REPL_TITLE, path) + val consoleRunner = KotlinConsoleRunner(cmdLine, module, testMode, project, REPL_TITLE, path) consoleRunner.initAndRun() consoleRunner.setupGutters() diff --git a/idea/idea-repl/src/org/jetbrains/kotlin/console/KotlinConsoleRunner.kt b/idea/idea-repl/src/org/jetbrains/kotlin/console/KotlinConsoleRunner.kt index 68c368c0cec..33f932b0b14 100644 --- a/idea/idea-repl/src/org/jetbrains/kotlin/console/KotlinConsoleRunner.kt +++ b/idea/idea-repl/src/org/jetbrains/kotlin/console/KotlinConsoleRunner.kt @@ -29,6 +29,7 @@ import com.intellij.openapi.editor.ex.EditorEx import com.intellij.openapi.editor.markup.* import com.intellij.openapi.module.Module import com.intellij.openapi.project.Project +import com.intellij.openapi.util.Disposer import com.intellij.psi.PsiManager import com.intellij.util.Consumer import org.jetbrains.kotlin.console.actions.BuildAndRestartConsoleAction @@ -46,10 +47,12 @@ import java.awt.Color import java.awt.Font import java.util.concurrent.ConcurrentHashMap import javax.swing.Icon +import kotlin.properties.Delegates public class KotlinConsoleRunner( private val cmdLine: GeneralCommandLine, private val module: Module, + private val testMode: Boolean, myProject: Project, title: String, path: String? @@ -58,6 +61,8 @@ public class KotlinConsoleRunner( private val historyManager = KotlinConsoleHistoryManager(this) val executor = KotlinConsoleExecutor(this, historyManager) + private var disposableDescriptor: RunContentDescriptor by Delegates.notNull() + override fun createProcess() = cmdLine.createProcess() override fun createConsoleView(): LanguageConsoleView? { @@ -102,8 +107,10 @@ public class KotlinConsoleRunner( defaultExecutor: Executor, contentDescriptor: RunContentDescriptor ): List { + disposableDescriptor = contentDescriptor + val actionList = arrayListOf( - BuildAndRestartConsoleAction(project, module, defaultExecutor, contentDescriptor, restarter), + BuildAndRestartConsoleAction(project, module, defaultExecutor, contentDescriptor, restarter, testMode), createConsoleExecAction(consoleExecuteActionHandler), createCloseAction(defaultExecutor, contentDescriptor) ) @@ -177,4 +184,10 @@ public class KotlinConsoleRunner( val oldHighlighter = editorToIndicator[editor] ?: return WriteCommandAction.runWriteCommandAction(project) { oldHighlighter.gutterIconRenderer = KotlinConsoleIndicatorRenderer(newIcon) } } + + // this method shouldn't be called in normal usage; it is for test purpose only + fun dispose() { + processHandler.destroyProcess() + Disposer.dispose(disposableDescriptor) + } } \ No newline at end of file diff --git a/idea/idea-repl/src/org/jetbrains/kotlin/console/actions/BuildAndRestartConsoleAction.kt b/idea/idea-repl/src/org/jetbrains/kotlin/console/actions/BuildAndRestartConsoleAction.kt index 34beaf640b2..d672c86661c 100644 --- a/idea/idea-repl/src/org/jetbrains/kotlin/console/actions/BuildAndRestartConsoleAction.kt +++ b/idea/idea-repl/src/org/jetbrains/kotlin/console/actions/BuildAndRestartConsoleAction.kt @@ -41,11 +41,12 @@ public class BuildAndRestartConsoleAction( private val module: Module, private val executor: Executor, private val contentDescriptor: RunContentDescriptor, - private val restarter: Consumer + private val restarter: Consumer, + private val testMode: Boolean ) : AnAction("Build and restart", buildAndRestartMessage(module), AllIcons.Actions.Restart) { init { - showOutdatedClassedNotificationIfNeeded() + if (!testMode) showOutdatedClassedNotificationIfNeeded() } override fun actionPerformed(_: AnActionEvent) = compileModule() diff --git a/idea/tests/org/jetbrains/kotlin/idea/console/KotlinReplTest.kt b/idea/tests/org/jetbrains/kotlin/idea/console/KotlinReplTest.kt index cf87d10bed0..f300c0e3057 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/console/KotlinReplTest.kt +++ b/idea/tests/org/jetbrains/kotlin/idea/console/KotlinReplTest.kt @@ -17,53 +17,38 @@ package org.jetbrains.kotlin.idea.console import com.intellij.execution.impl.ConsoleViewImpl -import com.intellij.openapi.Disposable -import com.intellij.openapi.util.Disposer import com.intellij.testFramework.PlatformTestCase import org.jetbrains.kotlin.console.KotlinConsoleKeeper import org.jetbrains.kotlin.console.KotlinConsoleRunner +import org.junit.FixMethodOrder import org.junit.Test +import org.junit.runners.MethodSorters import kotlin.properties.Delegates import kotlin.test.assertFalse import kotlin.test.assertTrue +@FixMethodOrder(MethodSorters.JVM) public class KotlinReplTest : PlatformTestCase() { private var consoleRunner: KotlinConsoleRunner by Delegates.notNull() override fun setUp() { super.setUp() - consoleRunner = KotlinConsoleKeeper.getInstance(project).run(module)!! + consoleRunner = KotlinConsoleKeeper.getInstance(project).run(module, testMode = true)!! } override fun tearDown() { - val consoleView = consoleRunner.consoleView - - consoleRunner.processHandler.destroyProcess() - - // dispose RunContentDescriptor by reflection - val getNodeMethod = Disposer.getTree().javaClass.getDeclaredMethod("getNode", Object().javaClass) - getNodeMethod.isAccessible = true - val consoleNode = getNodeMethod(Disposer.getTree(), consoleView) - val getParentMethod = consoleNode.javaClass.getDeclaredMethod("getParent") - getParentMethod.isAccessible = true - val consoleParent = getParentMethod(consoleNode) - val getObjectMethod = consoleParent.javaClass.getDeclaredMethod("getObject") - getObjectMethod.isAccessible = true - val descriptor = getObjectMethod(consoleParent) as Disposable - - Disposer.dispose(descriptor) - + consoleRunner.dispose() super.tearDown() } - fun checkHistoryUpdate(maxIter: Int = 20, sleepTime: Long = 500, p: (String) -> Boolean): String { + private fun checkHistoryUpdate(maxIterations: Int = 20, sleepTime: Long = 1000, predicate: (String) -> Boolean): String { val consoleView = consoleRunner.consoleView as ConsoleViewImpl var docHistory: String = "" - for (i in 1..maxIter) { + for (i in 1..maxIterations) { docHistory = consoleRunner.consoleView.historyViewer.document.text.trim() - if (p(docHistory)) break + if (predicate(docHistory)) break Thread.sleep(sleepTime) consoleView.flushDeferredText() @@ -81,11 +66,4 @@ public class KotlinReplTest : PlatformTestCase() { assertTrue(allOk(historyText), "Successful run should contain text: ':help for help'") assertFalse(consoleRunner.processHandler.isProcessTerminated, "Process accidentally terminated") } - - @Test fun testSimpleCommand() { - consoleRunner.pipeline.submitCommand("1 + 1") - val docHistory = checkHistoryUpdate { x: String -> x.endsWith("2") } - - assertTrue(docHistory.endsWith("2"), "1 + 1 should be equal 2, but document history is: '$docHistory'") - } } \ No newline at end of file