[TEST] Get rid of 'catch (_: ComparisonFailure)' in AbstractAnalysisApiBasedTest

Motivation:
1. In general, it's a bad idea to catch '*Failure'
2. People use `expectedFile.writeText(actual)` to update testData,
   but because of 'catch (_: ComparisonFailure)' this approach false
   positively updated green testData
diff --git a/analysis/analysis-test-framework/tests/org/jetbrains/kotlin/analysis/test/framework/base/AbstractAnalysisApiBasedTest.kt b/analysis/analysis-test-framework/tests/org/jetbrains/kotlin/analysis/test/framework/base/AbstractAnalysisApiBasedTest.kt
index ad15650..d82061d 100644
--- a/analysis/analysis-test-framework/tests/org/jetbrains/kotlin/analysis/test/framework/base/AbstractAnalysisApiBasedTest.kt
+++ b/analysis/analysis-test-framework/tests/org/jetbrains/kotlin/analysis/test/framework/base/AbstractAnalysisApiBasedTest.kt
@@ -240,9 +240,7 @@
         if (testPrefix != null) {
             val expectedFileWithoutPrefix = getTestDataFileSiblingPath(extension, testPrefix = null)
             if (expectedFile != expectedFileWithoutPrefix) {
-                try {
-                    assertEqualsToFile(expectedFileWithoutPrefix, actual)
-                } catch (_: ComparisonFailure) {
+                if (!doesEqualToFile(expectedFileWithoutPrefix.toFile(), actual)) {
                     return
                 }
 
diff --git a/compiler/test-infrastructure-utils/tests/org/jetbrains/kotlin/test/Assertions.kt b/compiler/test-infrastructure-utils/tests/org/jetbrains/kotlin/test/Assertions.kt
index 34e0d52..fe13249 100644
--- a/compiler/test-infrastructure-utils/tests/org/jetbrains/kotlin/test/Assertions.kt
+++ b/compiler/test-infrastructure-utils/tests/org/jetbrains/kotlin/test/Assertions.kt
@@ -15,6 +15,8 @@
         assertEqualsToFile(expectedFile, actual, sanitizer) { "Actual data differs from file content" }
     }
 
+    abstract fun doesEqualToFile(expectedFile: File, actual: String, sanitizer: (String) -> String = { it }): Boolean
+
     fun assertEqualsToFile(expectedFile: Path, actual: String, sanitizer: (String) -> String = { it }) {
         assertEqualsToFile(expectedFile.toFile(), actual, sanitizer)
     }
diff --git a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/services/JUnit5Assertions.kt b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/services/JUnit5Assertions.kt
index e11d1b5..f5f1d2a 100644
--- a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/services/JUnit5Assertions.kt
+++ b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/services/JUnit5Assertions.kt
@@ -15,6 +15,15 @@
 import org.junit.jupiter.api.Assertions as JUnit5PlatformAssertions
 
 object JUnit5Assertions : AssertionsService() {
+    override fun doesEqualToFile(expectedFile: File, actual: String, sanitizer: (String) -> String): Boolean {
+        return doesEqualToFile(
+            expectedFile,
+            actual,
+            sanitizer,
+            fileNotFoundMessageTeamCity = { "Expected data file did not exist `$expectedFile`" },
+            fileNotFoundMessageLocal = { "Expected data file did not exist. Generating: $expectedFile" }).first
+    }
+
     override fun assertEqualsToFile(expectedFile: File, actual: String, sanitizer: (String) -> String, message: () -> String) {
         assertEqualsToFile(
             expectedFile,
@@ -25,14 +34,13 @@
             fileNotFoundMessageLocal = { "Expected data file did not exist. Generating: $expectedFile" })
     }
 
-    fun assertEqualsToFile(
+    private fun doesEqualToFile(
         expectedFile: File,
         actual: String,
         sanitizer: (String) -> String,
-        differenceObtainedMessage: () -> String,
         fileNotFoundMessageTeamCity: (File) -> String,
         fileNotFoundMessageLocal: (File) -> String,
-    ) {
+    ): Pair<Boolean, String> {
         try {
             val actualText = actual.trim { it <= ' ' }.convertLineSeparators().trimTrailingWhitespacesAndAddNewlineAtEOF()
             if (!expectedFile.exists()) {
@@ -46,17 +54,30 @@
             }
             val expected = expectedFile.readText().convertLineSeparators()
             val expectedText = expected.trim { it <= ' ' }.trimTrailingWhitespacesAndAddNewlineAtEOF()
-            if (sanitizer.invoke(expectedText) != sanitizer.invoke(actualText)) {
-                throw FileComparisonFailure(
-                    "${differenceObtainedMessage()}: ${expectedFile.name}",
-                    expected, actual, expectedFile.absolutePath
-                )
-            }
+            return Pair(sanitizer.invoke(expectedText) == sanitizer.invoke(actualText), expected)
         } catch (e: IOException) {
             throw rethrow(e)
         }
     }
 
+    fun assertEqualsToFile(
+        expectedFile: File,
+        actual: String,
+        sanitizer: (String) -> String,
+        differenceObtainedMessage: () -> String,
+        fileNotFoundMessageTeamCity: (File) -> String,
+        fileNotFoundMessageLocal: (File) -> String,
+    ) {
+        val (equalsToFile, expected) =
+            doesEqualToFile(expectedFile, actual, sanitizer, fileNotFoundMessageTeamCity, fileNotFoundMessageLocal)
+        if (!equalsToFile) {
+            throw FileComparisonFailure(
+                "${differenceObtainedMessage()}: ${expectedFile.name}",
+                expected, actual, expectedFile.absolutePath
+            )
+        }
+    }
+
     override fun assertEquals(expected: Any?, actual: Any?, message: (() -> String)?) {
         JUnit5PlatformAssertions.assertEquals(expected, actual, message)
     }
diff --git a/compiler/tests-common/tests/org/jetbrains/kotlin/test/KotlinTestUtils.java b/compiler/tests-common/tests/org/jetbrains/kotlin/test/KotlinTestUtils.java
index f3756d0..bde4492 100644
--- a/compiler/tests-common/tests/org/jetbrains/kotlin/test/KotlinTestUtils.java
+++ b/compiler/tests-common/tests/org/jetbrains/kotlin/test/KotlinTestUtils.java
@@ -16,6 +16,7 @@
 import com.intellij.testFramework.TestDataFile;
 import com.intellij.util.lang.JavaVersion;
 import junit.framework.TestCase;
+import kotlin.Pair;
 import kotlin.Unit;
 import kotlin.collections.CollectionsKt;
 import kotlin.jvm.functions.Function0;
@@ -259,7 +260,7 @@
         assertEqualsToFile("Actual data differs from file content", expectedFile, actual, sanitizer);
     }
 
-    public static void assertEqualsToFile(@NotNull String message, @NotNull File expectedFile, @NotNull String actual, @NotNull Function1<String, String> sanitizer) {
+    public static Pair<Boolean, String> doesEqualToFile(@NotNull File expectedFile, @NotNull String actual, @NotNull Function1<String, String> sanitizer) {
         try {
             String actualText = StringUtilsKt.trimTrailingWhitespacesAndAddNewlineAtEOF(StringUtil.convertLineSeparators(actual.trim()));
 
@@ -275,16 +276,22 @@
 
             String expectedText = StringUtilsKt.trimTrailingWhitespacesAndAddNewlineAtEOF(StringUtil.convertLineSeparators(expected.trim()));
 
-            if (!Objects.equals(sanitizer.invoke(expectedText), sanitizer.invoke(actualText))) {
-                throw new FileComparisonFailure(message + ": " + expectedFile.getName(),
-                                                expected, actual, expectedFile.getAbsolutePath());
-            }
+            return new Pair<>(Objects.equals(sanitizer.invoke(expectedText), sanitizer.invoke(actualText)), expected);
         }
         catch (IOException e) {
             throw ExceptionUtilsKt.rethrow(e);
         }
     }
 
+    public static void assertEqualsToFile(@NotNull String message, @NotNull File expectedFile, @NotNull String actual, @NotNull Function1<String, String> sanitizer) {
+        Pair<Boolean, String> pair = doesEqualToFile(expectedFile, actual, sanitizer);
+        String expected = pair.getSecond();
+        if (!pair.getFirst()) {
+            throw new FileComparisonFailure(message + ": " + expectedFile.getName(),
+                                            expected, actual, expectedFile.getAbsolutePath());
+        }
+    }
+
     public static boolean compileKotlinWithJava(
             @NotNull List<File> javaFiles,
             @NotNull List<File> ktFiles,
diff --git a/compiler/tests-common/tests/org/jetbrains/kotlin/test/util/JUnit4Assertions.kt b/compiler/tests-common/tests/org/jetbrains/kotlin/test/util/JUnit4Assertions.kt
index 08bd361..6c6ed2e 100644
--- a/compiler/tests-common/tests/org/jetbrains/kotlin/test/util/JUnit4Assertions.kt
+++ b/compiler/tests-common/tests/org/jetbrains/kotlin/test/util/JUnit4Assertions.kt
@@ -12,6 +12,10 @@
 import java.io.File
 
 object JUnit4Assertions : Assertions() {
+    override fun doesEqualToFile(expectedFile: File, actual: String, sanitizer: (String) -> String): Boolean {
+        return KotlinTestUtils.doesEqualToFile(expectedFile, actual, sanitizer).first;
+    }
+
     override fun assertEqualsToFile(expectedFile: File, actual: String, sanitizer: (String) -> String, message: () -> String) {
         KotlinTestUtils.assertEqualsToFile(expectedFile, actual, sanitizer)
     }