diff --git a/platform/testFramework/extensions/src/com/intellij/testFramework/assertions/Assertions.java b/platform/testFramework/extensions/src/com/intellij/testFramework/assertions/Assertions.java index 012156a6a645..390aa695693f 100644 --- a/platform/testFramework/extensions/src/com/intellij/testFramework/assertions/Assertions.java +++ b/platform/testFramework/extensions/src/com/intellij/testFramework/assertions/Assertions.java @@ -20,6 +20,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.nio.file.Path; +import java.util.List; @SuppressWarnings("MethodOverridesStaticMethodOfSuperclass") public final class Assertions extends org.assertj.core.api.Assertions { @@ -37,4 +38,9 @@ public final class Assertions extends org.assertj.core.api.Assertions { public static StringAssertEx assertThat(@Nullable String actual) { return new StringAssertEx(actual); } + + @NotNull + public static ListAssertEx assertThat(@Nullable List actual) { + return new ListAssertEx<>(actual); + } } \ No newline at end of file diff --git a/platform/testFramework/extensions/src/com/intellij/testFramework/assertions/PathAssertEx.kt b/platform/testFramework/extensions/src/com/intellij/testFramework/assertions/PathAssertEx.kt index 1ba5a5235f5c..317055b92919 100644 --- a/platform/testFramework/extensions/src/com/intellij/testFramework/assertions/PathAssertEx.kt +++ b/platform/testFramework/extensions/src/com/intellij/testFramework/assertions/PathAssertEx.kt @@ -15,7 +15,6 @@ */ package com.intellij.testFramework.assertions -import com.intellij.rt.execution.junit.FileComparisonFailure import com.intellij.util.io.readText import com.intellij.util.io.size import org.assertj.core.api.AbstractCharSequenceAssert @@ -67,9 +66,6 @@ class StringAssertEx(actual: String?) : AbstractCharSequenceAssert(actual: List) : ListAssert(actual) { + fun toMatchSnapshot(snapshotFile: Path) { + isNotNull + + compareFileContent(actual, snapshotFile) + } +} + +private fun dumpData(data: Any): String { + val dumperOptions = DumperOptions() + dumperOptions.isAllowReadOnlyProperties = true + dumperOptions.lineBreak = DumperOptions.LineBreak.UNIX + val yaml = Yaml(DumpRepresenter(), dumperOptions) + val writer = StringWriter() + yaml.dump(data, writer) + return writer.toString() +} + +private class DumpRepresenter : Representer() { + init { + representers.put(Pattern::class.java, RepresentDump()) + } + + private inner class RepresentDump : Represent { + override fun representData(data: Any): Node = representScalar(Tag.STR, data.toString()) + } +} + +internal fun compareFileContent(actual: Any, snapshotFile: Path) { + val expectedContent = StringUtilRt.convertLineSeparators(snapshotFile.readText()) + val actualContent = dumpData(actual) + if (actualContent != expectedContent) { + throw FileComparisonFailure(null, expectedContent, actualContent, snapshotFile.toString()) + } +} \ No newline at end of file diff --git a/platform/testFramework/extensions/testExtensions.iml b/platform/testFramework/extensions/testExtensions.iml index 24ad722d8d08..d70b422abc1f 100644 --- a/platform/testFramework/extensions/testExtensions.iml +++ b/platform/testFramework/extensions/testExtensions.iml @@ -13,5 +13,6 @@ + \ No newline at end of file