Scratch tests: print test output at onFinish to avoid multiple calls of invokeLater

Multiple calls of invokeLater significantly affects test speed
This commit is contained in:
Natalia Selezneva
2019-07-01 12:40:13 +03:00
parent 85f07927c9
commit 30222582f4
2 changed files with 27 additions and 9 deletions
@@ -29,6 +29,7 @@ object InlayScratchOutputHandler : ScratchOutputHandler {
private const val minSpaceCount = 4 private const val minSpaceCount = 4
override fun onStart(file: ScratchFile) { override fun onStart(file: ScratchFile) {
getToolwindowHandler().onStart(file)
} }
override fun handle(file: ScratchFile, expression: ScratchExpression, output: ScratchOutput) { override fun handle(file: ScratchFile, expression: ScratchExpression, output: ScratchOutput) {
@@ -46,7 +47,7 @@ object InlayScratchOutputHandler : ScratchOutputHandler {
} }
override fun onFinish(file: ScratchFile) { override fun onFinish(file: ScratchFile) {
getToolwindowHandler().onFinish(file)
} }
override fun clear(file: ScratchFile) { override fun clear(file: ScratchFile) {
@@ -32,7 +32,6 @@ import com.intellij.openapi.wm.ToolWindowAnchor
import com.intellij.openapi.wm.ToolWindowFactory import com.intellij.openapi.wm.ToolWindowFactory
import com.intellij.openapi.wm.ToolWindowManager import com.intellij.openapi.wm.ToolWindowManager
import com.intellij.psi.PsiFile import com.intellij.psi.PsiFile
import org.jetbrains.annotations.TestOnly
import org.jetbrains.kotlin.idea.scratch.ScratchExpression 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.psi.KtPsiFactory import org.jetbrains.kotlin.psi.KtPsiFactory
@@ -169,22 +168,40 @@ private class ScratchToolWindowFactory : ToolWindowFactory {
} }
private object TestOutputHandler : ScratchOutputHandlerAdapter() { private object TestOutputHandler : ScratchOutputHandlerAdapter() {
private val errors = arrayListOf<String>()
private val inlays = arrayListOf<Pair<ScratchExpression, String>>()
override fun handle(file: ScratchFile, expression: ScratchExpression, output: ScratchOutput) { override fun handle(file: ScratchFile, expression: ScratchExpression, output: ScratchOutput) {
testPrint(file, output.text, expression) inlays.add(expression to output.text)
} }
override fun error(file: ScratchFile, message: String) { override fun error(file: ScratchFile, message: String) {
testPrint(file, message) errors.add(message)
} }
private fun testPrint(file: ScratchFile, output: String, expression: ScratchExpression? = null) { override fun onFinish(file: ScratchFile) {
ApplicationManager.getApplication().invokeLater { ApplicationManager.getApplication().invokeLater {
WriteCommandAction.runWriteCommandAction(file.project) { if (inlays.isNotEmpty()) {
val psiFile = file.getPsiFile()!! val psiFile = file.getPsiFile()!!
testPrint(file, inlays.map { (expression, text) ->
"/** ${getLineInfo(psiFile, expression)} $text */"
})
inlays.clear()
}
if (errors.isNotEmpty()) {
testPrint(file, listOf(errors.joinToString(prefix = "/** ", postfix = " */")))
errors.clear()
}
}
}
private fun testPrint(file: ScratchFile, comments: List<String>) {
WriteCommandAction.runWriteCommandAction(file.project) {
val psiFile = file.getPsiFile()!!
for (comment in comments) {
psiFile.addAfter( psiFile.addAfter(
KtPsiFactory(file.project).createComment( KtPsiFactory(file.project).createComment(comment),
"/** ${expression?.let { getLineInfo(psiFile, expression) + " " } ?: ""}$output */"
),
psiFile.lastChild psiFile.lastChild
) )
} }