[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)
}