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()
+ }
+ }
+ }
+ }
+}