diff --git a/idea/performanceTests/org/jetbrains/kotlin/idea/perf/AbstractPerformanceCompletionHandlerTests.kt b/idea/performanceTests/org/jetbrains/kotlin/idea/perf/AbstractPerformanceCompletionHandlerTests.kt index 8c2fc0fd9cb..f0493376e92 100644 --- a/idea/performanceTests/org/jetbrains/kotlin/idea/perf/AbstractPerformanceCompletionHandlerTests.kt +++ b/idea/performanceTests/org/jetbrains/kotlin/idea/perf/AbstractPerformanceCompletionHandlerTests.kt @@ -13,8 +13,6 @@ import com.intellij.openapi.util.io.FileUtil import org.jetbrains.kotlin.idea.completion.test.ExpectedCompletionUtils import org.jetbrains.kotlin.idea.completion.test.configureWithExtraFile import org.jetbrains.kotlin.idea.completion.test.handlers.AbstractCompletionHandlerTest.Companion.CODE_STYLE_SETTING_PREFIX -import org.jetbrains.kotlin.idea.completion.test.handlers.AbstractCompletionHandlerTest.Companion.COMPLETION_CHARS_PREFIX -import org.jetbrains.kotlin.idea.completion.test.handlers.AbstractCompletionHandlerTest.Companion.COMPLETION_CHAR_PREFIX import org.jetbrains.kotlin.idea.completion.test.handlers.AbstractCompletionHandlerTest.Companion.ELEMENT_TEXT_PREFIX import org.jetbrains.kotlin.idea.completion.test.handlers.AbstractCompletionHandlerTest.Companion.INVOCATION_COUNT_PREFIX import org.jetbrains.kotlin.idea.completion.test.handlers.AbstractCompletionHandlerTest.Companion.LOOKUP_STRING_PREFIX @@ -116,23 +114,21 @@ abstract class AbstractPerformanceCompletionHandlerTests( tailText: String?, completionChars: String ) { - - val testName = getTestName(false) - - val stats = stats() - stats.perfTest( - testName = testName, - setUp = { + performanceTest { + name(getTestName(false)) + stats(stats()) + setUp { setUpFixture(testPath) - }, - test = { + } + test { perfTestCore(completionType, time, lookupString, itemText, tailText, completionChars) - }, - tearDown = { + } + tearDown { runWriteAction { myFixture.file.delete() } - }) + } + } } private fun perfTestCore( diff --git a/idea/performanceTests/org/jetbrains/kotlin/idea/perf/AbstractPerformanceCompletionIncrementalResolveTest.kt b/idea/performanceTests/org/jetbrains/kotlin/idea/perf/AbstractPerformanceCompletionIncrementalResolveTest.kt index 7dbfa63ac0a..994ff2d608c 100644 --- a/idea/performanceTests/org/jetbrains/kotlin/idea/perf/AbstractPerformanceCompletionIncrementalResolveTest.kt +++ b/idea/performanceTests/org/jetbrains/kotlin/idea/perf/AbstractPerformanceCompletionIncrementalResolveTest.kt @@ -102,18 +102,19 @@ abstract class AbstractPerformanceCompletionIncrementalResolveTest : KotlinLight private fun innerPerfTest(name: String, setUpBody: (TestData>) -> Unit) { CompletionBindingContextProvider.ENABLED = true try { - stats.perfTest( - testName = name, - setUp = setUpBody, - test = { it.value = perfTestCore() }, - tearDown = { + performanceTest> { + name(name) + stats(stats) + setUp(setUpBody) + test { it.value = perfTestCore() } + tearDown { // no reasons to validate output as it is a performance test assertNotNull(it.value) runWriteAction { myFixture.file.delete() } } - ) + } } finally { CompletionBindingContextProvider.ENABLED = false } diff --git a/idea/performanceTests/org/jetbrains/kotlin/idea/perf/AbstractPerformanceHighlightingTest.kt b/idea/performanceTests/org/jetbrains/kotlin/idea/perf/AbstractPerformanceHighlightingTest.kt index 799ab361e22..06ff83ac535 100644 --- a/idea/performanceTests/org/jetbrains/kotlin/idea/perf/AbstractPerformanceHighlightingTest.kt +++ b/idea/performanceTests/org/jetbrains/kotlin/idea/perf/AbstractPerformanceHighlightingTest.kt @@ -72,19 +72,20 @@ abstract class AbstractPerformanceHighlightingTest : KotlinLightCodeInsightFixtu } private fun innerPerfTest(name: String, setUpBody: (TestData>) -> Unit) { - stats.perfTest>( - testName = name, - setUp = { + performanceTest> { + name(name) + stats(stats) + setUp { setUpBody(it) - }, - test = { it.value = perfTestCore() }, - tearDown = { + } + test { it.value = perfTestCore() } + tearDown { assertNotNull("no reasons to validate output as it is a performance test", it.value) runWriteAction { myFixture.file.delete() } } - ) + } } private fun perfTestCore(): MutableList = myFixture.doHighlighting() diff --git a/idea/performanceTests/org/jetbrains/kotlin/idea/perf/AbstractPerformanceImportTest.kt b/idea/performanceTests/org/jetbrains/kotlin/idea/perf/AbstractPerformanceImportTest.kt index 188f3351b12..481fd6b45fe 100644 --- a/idea/performanceTests/org/jetbrains/kotlin/idea/perf/AbstractPerformanceImportTest.kt +++ b/idea/performanceTests/org/jetbrains/kotlin/idea/perf/AbstractPerformanceImportTest.kt @@ -80,20 +80,21 @@ abstract class AbstractPerformanceImportTest : KotlinLightCodeInsightFixtureTest val importInsertHelper = ImportInsertHelper.getInstance(project) val psiDocumentManager = PsiDocumentManager.getInstance(project) - stats().perfTest( - testName = testName, - setUp = { + performanceTest { + name(testName) + stats(stats()) + setUp { fixture.configureByFile(fileName()) file = fixture.file as KtFile fileText = file.text - }, - test = { + } + test { it.value = project.executeWriteCommand("") { perfTestCore(file, fqName, filter, descriptorName, importInsertHelper, psiDocumentManager) } - }, - tearDown = { + } + tearDown { val log = it.value val testPath = testPath() val afterFile = File("$testPath.after") @@ -109,7 +110,8 @@ abstract class AbstractPerformanceImportTest : KotlinLightCodeInsightFixtureTest runWriteAction { myFixture.file.delete() } - }) + } + } } finally { CodeStyle.dropTemporarySettings(project) } diff --git a/idea/performanceTests/org/jetbrains/kotlin/idea/perf/AbstractPerformanceJavaToKotlinCopyPasteConversionTest.kt b/idea/performanceTests/org/jetbrains/kotlin/idea/perf/AbstractPerformanceJavaToKotlinCopyPasteConversionTest.kt index c69ed1ee0ee..116de6e0ce9 100644 --- a/idea/performanceTests/org/jetbrains/kotlin/idea/perf/AbstractPerformanceJavaToKotlinCopyPasteConversionTest.kt +++ b/idea/performanceTests/org/jetbrains/kotlin/idea/perf/AbstractPerformanceJavaToKotlinCopyPasteConversionTest.kt @@ -47,29 +47,28 @@ abstract class AbstractPerformanceJavaToKotlinCopyPasteConversionTest(private va } private fun doWarmUpPerfTest() { - stats().perfTest( - testName = WARM_UP, - setUp = { + performanceTest { + name(WARM_UP) + stats(stats()) + setUp { with(myFixture) { configureByText(JavaFileType.INSTANCE, "public class Foo {\nprivate String value;\n}") performEditorAction(IdeActions.ACTION_CUT) configureByText(KotlinFileType.INSTANCE, "") } ConvertJavaCopyPasteProcessor.conversionPerformed = false - }, - test = { + } + test { myFixture.performEditorAction(IdeActions.ACTION_PASTE) - }, - tearDown = { + } + tearDown { val document = myFixture.getDocument(myFixture.file) PsiDocumentManager.getInstance(project).commitDocument(document) kotlin.test.assertFalse(!ConvertJavaCopyPasteProcessor.conversionPerformed, "No conversion to Kotlin suggested") assertEquals("class Foo {\n private val value: String? = null\n}", myFixture.file.text) - runWriteAction { - myFixture.file.delete() - } + deleteFixtureFile() } - ) + } } private fun j2kIndex(): Int { @@ -86,9 +85,10 @@ abstract class AbstractPerformanceJavaToKotlinCopyPasteConversionTest(private va val fileText = myFixture.editor.document.text val noConversionExpected = InTextDirectivesUtils.findListWithPrefixes(fileText, "// NO_CONVERSION_EXPECTED").isNotEmpty() - stats().perfTest( - testName = testName, - setUp = { + performanceTest { + name(testName) + stats(stats()) + setUp { myFixture.configureByFiles("$testName.java") myFixture.performEditorAction(IdeActions.ACTION_COPY) @@ -98,18 +98,22 @@ abstract class AbstractPerformanceJavaToKotlinCopyPasteConversionTest(private va configureTargetFile("$testName.to.kt") ConvertJavaCopyPasteProcessor.conversionPerformed = false - }, - test = { + } + test { perfTestCore() - }, - tearDown = { + } + tearDown { commitAllDocuments() validate(path, noConversionExpected) - - // to avoid VFS refresh - myFixture.performEditorAction(IdeActions.ACTION_UNDO) + deleteFixtureFile() } - ) + } + } + + private fun deleteFixtureFile() { + runWriteAction { + myFixture.file.delete() + } } private fun perfTestCore() { diff --git a/idea/performanceTests/org/jetbrains/kotlin/idea/perf/AbstractPerformanceLiteralKotlinToKotlinCopyPasteTest.kt b/idea/performanceTests/org/jetbrains/kotlin/idea/perf/AbstractPerformanceLiteralKotlinToKotlinCopyPasteTest.kt index ec5dd591e96..68efedcb332 100644 --- a/idea/performanceTests/org/jetbrains/kotlin/idea/perf/AbstractPerformanceLiteralKotlinToKotlinCopyPasteTest.kt +++ b/idea/performanceTests/org/jetbrains/kotlin/idea/perf/AbstractPerformanceLiteralKotlinToKotlinCopyPasteTest.kt @@ -46,25 +46,26 @@ abstract class AbstractPerformanceLiteralKotlinToKotlinCopyPasteTest : AbstractC private fun doWarmUpPerfTest() { val fileEditorManager = FileEditorManagerEx.getInstance(project) - stats.perfTest, Unit>( - testName = WARM_UP, - iterations = 1, - setUp = { + performanceTest, Unit> { + name(WARM_UP) + stats(stats) + iterations(1) + setUp { val file1 = myFixture.configureByText( "src.kt", "class Foo {\n private val value: String? = n\n}" ) val file2 = myFixture.configureByText("target.kt", "") it.setUpValue = Pair(file1, file2) - }, - test = { + } + test { fileEditorManager.setSelectedEditor(it.setUpValue!!.first.virtualFile, "") myFixture.performEditorAction(IdeActions.ACTION_COPY) fileEditorManager.setSelectedEditor(it.setUpValue!!.second.virtualFile, "") myFixture.performEditorAction(IdeActions.ACTION_PASTE) - }, - tearDown = { + } + tearDown { assertEquals("private val value: String? = n", it.setUpValue!!.second.text) // to avoid VFS refresh @@ -75,7 +76,7 @@ abstract class AbstractPerformanceLiteralKotlinToKotlinCopyPasteTest : AbstractC it.setUpValue!!.second.delete() } } - ) + } } fun doPerfTest(unused: String) { @@ -85,19 +86,20 @@ abstract class AbstractPerformanceLiteralKotlinToKotlinCopyPasteTest : AbstractC val expectedPath = File(testPath.replace(".kt", ".expected.kt")) val fileEditorManager = FileEditorManagerEx.getInstance(project) - stats.perfTest, Unit>( - testName = testName, - setUp = { + performanceTest, Unit> { + name(testName) + stats(stats) + setUp { it.setUpValue = myFixture.configureByFiles(fileName, fileName.replace(".kt", ".to.kt")) - }, - test = { + } + test { fileEditorManager.setSelectedEditor(it.setUpValue!![0].virtualFile, "") myFixture.performEditorAction(IdeActions.ACTION_COPY) fileEditorManager.setSelectedEditor(it.setUpValue!![1].virtualFile, "") myFixture.performEditorAction(IdeActions.ACTION_PASTE) - }, - tearDown = { + } + tearDown { KotlinTestUtils.assertEqualsToFile(expectedPath, it.setUpValue!![1].text) // to avoid VFS refresh @@ -107,6 +109,6 @@ abstract class AbstractPerformanceLiteralKotlinToKotlinCopyPasteTest : AbstractC it.setUpValue!!.forEach { f -> f.delete() } } } - ) + } } } \ No newline at end of file diff --git a/idea/performanceTests/org/jetbrains/kotlin/idea/perf/AbstractPerformanceProjectsTest.kt b/idea/performanceTests/org/jetbrains/kotlin/idea/perf/AbstractPerformanceProjectsTest.kt index b85e0390f35..6501d275700 100644 --- a/idea/performanceTests/org/jetbrains/kotlin/idea/perf/AbstractPerformanceProjectsTest.kt +++ b/idea/performanceTests/org/jetbrains/kotlin/idea/perf/AbstractPerformanceProjectsTest.kt @@ -157,11 +157,12 @@ abstract class AbstractPerformanceProjectsTest : UsefulTestCase() { var lastProject: Project? = null var counter = 0 - stats.perfTest( - warmUpIterations = warmUpIterations, - iterations = iterations, - testName = "open project${if (note.isNotEmpty()) " $note" else ""}", - test = { + performanceTest { + name("open project${if (note.isNotEmpty()) " $note" else ""}") + stats(stats) + warmUpIterations(warmUpIterations) + iterations(iterations) + test { val project = if (!simpleModule) { val project = loadProjectWithName(name = name, path = path) assertNotNull("project $name at $path is not loaded", project) @@ -196,8 +197,8 @@ abstract class AbstractPerformanceProjectsTest : UsefulTestCase() { } it.value = project - }, - tearDown = { + } + tearDown { it.value?.let { project -> runAndMeasure("refresh gradle project $name") { @@ -234,7 +235,7 @@ abstract class AbstractPerformanceProjectsTest : UsefulTestCase() { counter++ } } - ) + } // indexing lastProject?.let { project -> @@ -305,11 +306,12 @@ abstract class AbstractPerformanceProjectsTest : UsefulTestCase() { note: String = "" ) { assertTrue("lookupElements has to be not empty", lookupElements.isNotEmpty()) - stats.perfTest, Array>( - warmUpIterations = 8, - iterations = 15, - testName = "typeAndAutocomplete ${notePrefix(note)}$fileName", - setUp = { + performanceTest, Array> { + name("typeAndAutocomplete ${notePrefix(note)}$fileName") + stats(stats) + warmUpIterations(8) + iterations(15) + setUp { val fixture = openFixture(project, fileName) val editor = fixture.editor @@ -340,12 +342,12 @@ abstract class AbstractPerformanceProjectsTest : UsefulTestCase() { fixture.type(insertString) it.setUpValue = Pair(initialText, fixture) - }, - test = { + } + test { val fixture = it.setUpValue!!.second it.value = fixture.complete() - }, - tearDown = { + } + tearDown { val items = it.value?.map { e -> e.lookupString }?.toList() ?: emptyList() try { for (lookupElement in lookupElements) { @@ -357,9 +359,9 @@ abstract class AbstractPerformanceProjectsTest : UsefulTestCase() { } commitAllDocuments() } - }, - profileEnabled = true - ) + } + profileEnabled(true) + } } fun perfTypeAndHighlight( @@ -388,11 +390,12 @@ abstract class AbstractPerformanceProjectsTest : UsefulTestCase() { revertChangesAtTheEnd: Boolean = true, note: String = "" ) { - stats.perfTest, List>( - warmUpIterations = 8, - iterations = 15, - testName = "typeAndHighlight ${notePrefix(note)}$fileName", - setUp = { + performanceTest, List> { + name("typeAndHighlight ${notePrefix(note)}$fileName") + stats(stats) + warmUpIterations(8) + iterations(15) + setUp { val fixture = openFixture(project, fileName) val editor = fixture.editor @@ -423,12 +426,12 @@ abstract class AbstractPerformanceProjectsTest : UsefulTestCase() { fixture.type(insertString) it.setUpValue = Pair(initialText, fixture) - }, - test = { + } + test { val fixture = it.setUpValue!!.second it.value = fixture.doHighlighting() - }, - tearDown = { + } + tearDown { it.value?.let { list -> assertNotEmpty(list) } @@ -436,9 +439,9 @@ abstract class AbstractPerformanceProjectsTest : UsefulTestCase() { pair.second.revertChanges(revertChangesAtTheEnd, pair.first) } commitAllDocuments() - }, - profileEnabled = true - ) + } + profileEnabled(true) + } } fun perfCopyAndPaste( @@ -468,11 +471,12 @@ abstract class AbstractPerformanceProjectsTest : UsefulTestCase() { targetFinalMarker: String? = null, note: String = "" ) { - stats.perfTest, String>, Boolean>( - warmUpIterations = 8, - iterations = 15, - testName = "${notePrefix(note)}$sourceFileName", - setUp = { + performanceTest, String>, Boolean> { + name("${notePrefix(note)}$sourceFileName") + stats(stats) + warmUpIterations(8) + iterations(15) + setUp { val fixture1 = openFixture(project, sourceFileName) val fixture2 = openFixture(project, targetFileName) @@ -485,16 +489,16 @@ abstract class AbstractPerformanceProjectsTest : UsefulTestCase() { fixture2.selectMarkers(targetInitialMarker, targetFinalMarker) it.setUpValue = Pair(arrayOf(fixture1, fixture2), initialText2) - }, - test = { + } + test { it.setUpValue?.let { setUpValue -> val fixture1 = setUpValue.first[0] val fixture2 = setUpValue.first[1] it.value = fixture1.performEditorAction(IdeActions.ACTION_COPY) && fixture2.performEditorAction(IdeActions.ACTION_PASTE) } - }, - tearDown = { + } + tearDown { try { commitAllDocuments() it.value?.let { performed -> @@ -510,9 +514,9 @@ abstract class AbstractPerformanceProjectsTest : UsefulTestCase() { } commitAllDocuments() } - }, - profileEnabled = true - ) + } + profileEnabled(true) + } } private fun updateScriptDependenciesIfNeeded( @@ -560,25 +564,26 @@ abstract class AbstractPerformanceProjectsTest : UsefulTestCase() { return highlightFile { val isWarmUp = note == WARM_UP var highlightInfos: List = emptyList() - stats.perfTest>( - warmUpIterations = if (isWarmUp) 1 else 3, - iterations = if (isWarmUp) 2 else 10, - testName = "highlighting ${notePrefix(note)}${simpleFilename(fileName)}", - setUp = { + performanceTest> { + name("highlighting ${notePrefix(note)}${simpleFilename(fileName)}") + stats(stats) + warmUpIterations(if (isWarmUp) 1 else 3) + iterations(if (isWarmUp) 2 else 10) + setUp { it.setUpValue = openFileInEditor(project, fileName) - }, - test = { + } + test { val file = it.setUpValue it.value = highlightFile(project, file!!.psiFile) - }, - tearDown = { + } + tearDown { highlightInfos = it.value ?: emptyList() commitAllDocuments() FileEditorManager.getInstance(project).closeFile(it.setUpValue!!.psiFile.virtualFile) PsiManager.getInstance(project).dropPsiCaches() - }, - profileEnabled = !isWarmUp - ) + } + profileEnabled(!isWarmUp) + } highlightInfos } } @@ -610,19 +615,20 @@ abstract class AbstractPerformanceProjectsTest : UsefulTestCase() { note: String = "" ) { if (!isAKotlinScriptFile(fileName)) return - stats.perfTest( - testName = "updateScriptDependencies ${notePrefix(note)}${simpleFilename(fileName)}", - setUp = { it.setUpValue = openFileInEditor(project, fileName) }, - test = { + performanceTest { + name("updateScriptDependencies ${notePrefix(note)}${simpleFilename(fileName)}") + stats(stats) + setUp { it.setUpValue = openFileInEditor(project, fileName) } + test { ScriptConfigurationManager.updateScriptDependenciesSynchronously(it.setUpValue!!.psiFile, project) it.value = it.setUpValue - }, - tearDown = { + } + tearDown { it.setUpValue?.let { ef -> cleanupCaches(project, ef.psiFile.virtualFile) } it.value?.let { v -> assertNotNull(v) } - }, - profileEnabled = true - ) + } + profileEnabled(true) + } } fun notePrefix(note: String) = if (note.isNotEmpty()) { diff --git a/idea/performanceTests/org/jetbrains/kotlin/idea/perf/PerfTestBuilder.kt b/idea/performanceTests/org/jetbrains/kotlin/idea/perf/PerfTestBuilder.kt new file mode 100644 index 00000000000..b862db23e9d --- /dev/null +++ b/idea/performanceTests/org/jetbrains/kotlin/idea/perf/PerfTestBuilder.kt @@ -0,0 +1,65 @@ +/* + * Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors. + * 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.perf + +class PerfTestBuilder { + private lateinit var stats: Stats + private lateinit var name: String + private var warmUpIterations: Int = 5 + private var iterations: Int = 20 + private var setUp: (TestData) -> Unit = { } + private lateinit var test: (TestData) -> Unit + private var tearDown: (TestData) -> Unit = { } + private var profileEnabled: Boolean = false + + fun run() { + stats.perfTest( + testName = name, + warmUpIterations = warmUpIterations, + iterations = iterations, + setUp = setUp, + test = test, + tearDown = tearDown, + profileEnabled = profileEnabled + ) + } + + fun stats(stats: Stats) { + this.stats = stats + } + + fun name(name: String) { + this.name = name + } + + fun warmUpIterations(warmUpIterations: Int) { + this.warmUpIterations = warmUpIterations + } + + fun iterations(iterations: Int) { + this.iterations = iterations + } + + fun setUp(setUp: (TestData) -> Unit) { + this.setUp = setUp + } + + fun test(test: (TestData) -> Unit) { + this.test = test + } + + fun tearDown(tearDown: (TestData) -> Unit) { + this.tearDown = tearDown + } + + fun profileEnabled(profileEnabled: Boolean) { + this.profileEnabled = profileEnabled + } +} + +fun performanceTest(initializer: PerfTestBuilder.() -> Unit) { + PerfTestBuilder().apply(initializer).run() +} \ No newline at end of file diff --git a/idea/performanceTests/org/jetbrains/kotlin/idea/perf/PerformanceProjectsTest.kt b/idea/performanceTests/org/jetbrains/kotlin/idea/perf/PerformanceProjectsTest.kt index f20cf479687..92dbb0f72d8 100644 --- a/idea/performanceTests/org/jetbrains/kotlin/idea/perf/PerformanceProjectsTest.kt +++ b/idea/performanceTests/org/jetbrains/kotlin/idea/perf/PerformanceProjectsTest.kt @@ -248,15 +248,16 @@ class PerformanceProjectsTest : AbstractPerformanceProjectsTest() { val warmUpIterations = 3 val iterations = 10 - stats.perfTest( - warmUpIterations = warmUpIterations, - iterations = iterations, - testName = testName, - setUp = perfKtsFileAnalysisSetUp(project, fileName), - test = perfKtsFileAnalysisTest(), - tearDown = perfKtsFileAnalysisTearDown(extraTimingsNs, project), - profileEnabled = true - ) + performanceTest>> { + name(testName) + stats(stats) + warmUpIterations(warmUpIterations) + iterations(iterations) + setUp(perfKtsFileAnalysisSetUp(project, fileName)) + test(perfKtsFileAnalysisTest()) + tearDown(perfKtsFileAnalysisTearDown(extraTimingsNs, project)) + profileEnabled(true) + } extraStats.printWarmUpTimings( "annotator",