diff --git a/lib/annotations/junit4/org/junit/rules/annotations.xml b/lib/annotations/junit4/org/junit/rules/annotations.xml index f98664b3e98e..ce244a99075c 100644 --- a/lib/annotations/junit4/org/junit/rules/annotations.xml +++ b/lib/annotations/junit4/org/junit/rules/annotations.xml @@ -11,6 +11,14 @@ + + + + + + diff --git a/platform/configuration-store-impl/testSrc/DefaultProjectStoreTest.kt b/platform/configuration-store-impl/testSrc/DefaultProjectStoreTest.kt index da31665df5f4..f007c52cbf1b 100644 --- a/platform/configuration-store-impl/testSrc/DefaultProjectStoreTest.kt +++ b/platform/configuration-store-impl/testSrc/DefaultProjectStoreTest.kt @@ -8,15 +8,11 @@ import com.intellij.openapi.components.StoragePathMacros import com.intellij.openapi.components.service import com.intellij.openapi.components.stateStore import com.intellij.openapi.project.ProjectManager -import com.intellij.testFramework.ProjectRule -import com.intellij.testFramework.RuleChain -import com.intellij.testFramework.TemporaryDirectory -import com.intellij.testFramework.deleteRecursively +import com.intellij.testFramework.* import org.assertj.core.api.Assertions.assertThat import org.junit.ClassRule import org.junit.Rule import org.junit.Test -import org.junit.rules.ExternalResource import java.nio.file.Paths internal class DefaultProjectStoreTest { @@ -30,17 +26,11 @@ internal class DefaultProjectStoreTest { private val ruleChain = RuleChain( tempDirManager, - object : ExternalResource() { - private var isDoNotSave = false - - override fun before() { - val app = ApplicationManagerEx.getApplicationEx() - isDoNotSave = app.isDoNotSave - app.doNotSave(false) - } - - override fun after() { - val app = ApplicationManagerEx.getApplicationEx() + WrapRule { + val app = ApplicationManagerEx.getApplicationEx() + val isDoNotSave = app.isDoNotSave + app.doNotSave(false); + { try { app.doNotSave(isDoNotSave) } @@ -49,17 +39,11 @@ internal class DefaultProjectStoreTest { } } }, - object : ExternalResource() { - private var externalDependenciesManager: ExternalDependenciesManager? = null - - override fun before() { - val defaultProject = ProjectManager.getInstance().defaultProject - externalDependenciesManager = defaultProject.service() - externalDependenciesManager!!.allDependencies = requiredPlugins - } - - override fun after() { - externalDependenciesManager?.allDependencies = emptyList() + WrapRule { + val externalDependenciesManager = ProjectManager.getInstance().defaultProject.service() + externalDependenciesManager.allDependencies = requiredPlugins + { + externalDependenciesManager.allDependencies = emptyList() } } ) diff --git a/platform/testFramework/test-framework-java8/FixtureRule.kt b/platform/testFramework/test-framework-java8/FixtureRule.kt index 05864409f047..332adba765af 100644 --- a/platform/testFramework/test-framework-java8/FixtureRule.kt +++ b/platform/testFramework/test-framework-java8/FixtureRule.kt @@ -245,7 +245,7 @@ class DisposeModulesRule(private val projectRule: ProjectRule) : ExternalResourc try { moduleManager.disposeModule(module) } - catch(e: Throwable) { + catch (e: Throwable) { if (errors == null) { errors = SmartList() } @@ -256,4 +256,24 @@ class DisposeModulesRule(private val projectRule: ProjectRule) : ExternalResourc CompoundRuntimeException.throwIfNotEmpty(errors) } } -} \ No newline at end of file +} + +/** + * Only and only if "before" logic in case of exception doesn't require "after" logic - must be no side effects if "before" finished abnormally. + * So, should be one task per rule. + */ +class WrapRule(private val before: () -> () -> Unit) : TestRule { + override final fun apply(base: Statement, description: Description): Statement { + return object : Statement() { + override fun evaluate() { + val after = before() + try { + base.evaluate() + } + finally { + after() + } + } + } + } +}