From 6d49fb9f609c2218568fb5ef92d8e8d94e6698f6 Mon Sep 17 00:00:00 2001 From: Rikito Taniguchi Date: Tue, 19 Jul 2022 17:06:34 +0900 Subject: [PATCH] tests: test import missing extension method code action edit --- .../ImportMissingSymbolCrossLspSuite.scala | 148 ++++++++---------- .../codeactions/BaseCodeActionLspSuite.scala | 62 ++++++-- 2 files changed, 120 insertions(+), 90 deletions(-) diff --git a/tests/slow/src/test/scala/tests/feature/ImportMissingSymbolCrossLspSuite.scala b/tests/slow/src/test/scala/tests/feature/ImportMissingSymbolCrossLspSuite.scala index 9d676842a40..54a1aa3b919 100644 --- a/tests/slow/src/test/scala/tests/feature/ImportMissingSymbolCrossLspSuite.scala +++ b/tests/slow/src/test/scala/tests/feature/ImportMissingSymbolCrossLspSuite.scala @@ -44,86 +44,72 @@ class ImportMissingSymbolCrossLspSuite } yield () } - test("scala3-extension-import-from-deps") { - val path = "b/src/main/scala/x/B.scala" - for { - _ <- initialize( - s"""|/metals.json - |{ - | "a":{"scalaVersion" : "${V.scala3}"}, - | "b":{ - | "scalaVersion" : "${V.scala3}", - | "dependsOn": ["a"] - | } - |} - |/a/src/main/scala/example/A.scala - |package example - |object IntEnrichment: - | extension (num: Int) - | def incr = num + 1 - |/$path - |package x - |def main = - | println(1.incr) - |""".stripMargin - ) - _ <- server.didOpen(path) - _ <- server.assertCodeAction( - path, - s"""|package x - |def main = - | println(1.<>) - |""".stripMargin, - s"""|${ImportMissingSymbol.title("incr", "example.IntEnrichment")} - |${ExtractValueCodeAction.title("1.incr")} - |${ConvertToNamedArguments.title("println(...)")} - |""".stripMargin, - Nil, - ) - } yield () - } - - test("scala3-toplevel-extension-import-from-deps") { - val path = "b/src/main/scala/x/B.scala" - for { - _ <- initialize( - s"""|/metals.json - |{ - | "a":{"scalaVersion" : "${V.scala3}"}, - | "b":{ - | "scalaVersion" : "${V.scala3}", - | "dependsOn": ["a"] - | } - |} - |/a/src/main/scala/example/A.scala - |package example - | - |extension (str: String) - | def identity = str - | - |extension (num: Int) - | def incr = num + 1 - | - |/$path - |package x - |def main = - | println(1.incr) - |""".stripMargin - ) - _ <- server.didOpen(path) - _ <- server.assertCodeAction( - path, - s"""|package x - |def main = - | println(1.<>) - |""".stripMargin, - s"""|${ImportMissingSymbol.title("incr", "example.A$package")} - |${ExtractValueCodeAction.title("1.incr")} - |${ConvertToNamedArguments.title("println(...)")} - |""".stripMargin, - Nil, - ) - } yield () - } + checkEdit( + "extension-import", + s"""|/metals.json + |{ + | "a":{"scalaVersion" : "${V.scala3}"}, + | "b":{ + | "scalaVersion" : "${V.scala3}", + | "dependsOn": ["a"] + | } + |} + |/a/src/main/scala/example/A.scala + |package example + |object IntEnrichment: + | extension (num: Int) + | def incr = num + 1 + | + |/b/src/main/scala/x/B.scala + |package x + |def main = + | println(1.<>) + |""".stripMargin, + s"""|${ImportMissingSymbol.title("incr", "example.IntEnrichment")} + |${ExtractValueCodeAction.title("1.incr")} + |${ConvertToNamedArguments.title("println(...)")} + |""".stripMargin, + s"""|package x + | + |import example.IntEnrichment.incr + |def main = + | println(1.incr) + |""".stripMargin, + ) + checkEdit( + "toplevel-extension-import", + s"""|/metals.json + |{ + | "a":{"scalaVersion" : "${V.scala3}"}, + | "b":{ + | "scalaVersion" : "${V.scala3}", + | "dependsOn": ["a"] + | } + |} + |/a/src/main/scala/example/A.scala + |package example + | + |extension (str: String) + | def identity = str + | + |extension (num: Int) + | def incr = num + 1 + | + |/b/src/main/scala/x/B.scala + |package x + |def main = + | println(1.<>) + |""".stripMargin, + s"""|${ImportMissingSymbol.title("incr", "example.A$package")} + |${ExtractValueCodeAction.title("1.incr")} + |${ConvertToNamedArguments.title("println(...)")} + |""".stripMargin, + s"""|package x + | + |import example.incr + |def main = + | println(1.incr) + |""".stripMargin, + ) } diff --git a/tests/unit/src/main/scala/tests/codeactions/BaseCodeActionLspSuite.scala b/tests/unit/src/main/scala/tests/codeactions/BaseCodeActionLspSuite.scala index 0fe5247e87e..4227259537a 100644 --- a/tests/unit/src/main/scala/tests/codeactions/BaseCodeActionLspSuite.scala +++ b/tests/unit/src/main/scala/tests/codeactions/BaseCodeActionLspSuite.scala @@ -9,6 +9,7 @@ import munit.Location import munit.TestOptions import org.eclipse.lsp4j.CodeAction import tests.BaseLspSuite +import tests.FileLayout abstract class BaseCodeActionLspSuite( suiteName: String @@ -59,21 +60,64 @@ abstract class BaseCodeActionLspSuite( s""""scalacOptions": ["${scalacOptions.mkString("\",\"")}"],""" else "" val path = s"a/src/main/scala/a/$fileName" + + val layout = + s"""/metals.json + |{"a":{$scalacOptionsJson "scalaVersion" : "$scalaVersion"}} + |$scalafixConf + |/$path + |$input""".stripMargin + + checkEdit( + name, + layout, + expectedActions, + expectedCode, + selectedActionIndex, + expectNoDiagnostics, + kind, + configuration, + renamePath, + extraOperations, + changeFile, + expectError, + filterAction, + ) + } + + def checkEdit( + name: TestOptions, + layout: String, + expectedActions: String, + expectedCode: String, + selectedActionIndex: Int = 0, + expectNoDiagnostics: Boolean = true, + kind: List[String] = Nil, + configuration: => Option[String] = None, + renamePath: Option[String] = None, + extraOperations: => Unit = (), + changeFile: String => String = identity, + expectError: Boolean = false, + filterAction: CodeAction => Boolean = _ => true, + )(implicit loc: Location): Unit = { + val files = FileLayout.mapFromString(layout) + val (path, input) = files + .find(f => f._2.contains("<<") && f._2.contains(">>")) + .getOrElse { + throw new IllegalArgumentException( + "No `<< >>` was defined that specifies cursor position" + ) + } val newPath = renamePath.getOrElse(path) - val fileContent = input.replace("<<", "").replace(">>", "") + val fullInput = layout.replace("<<", "").replace(">>", "") val actualExpectedCode = - if (renamePath.nonEmpty) fileContent else expectedCode + if (renamePath.nonEmpty) input.replace("<<", "").replace(">>", "") + else expectedCode test(name) { cleanWorkspace() for { - _ <- initialize( - s"""/metals.json - |{"a":{$scalacOptionsJson "scalaVersion" : "$scalaVersion"}} - |$scalafixConf - |/$path - |$fileContent""".stripMargin - ) + _ <- initialize(fullInput) _ <- server.didOpen(path) _ <- { configuration match {