Skip to content

Commit

Permalink
tests: test import missing extension method code action edit
Browse files Browse the repository at this point in the history
  • Loading branch information
tanishiking committed Jul 19, 2022
1 parent 91a3903 commit 6d49fb9
Show file tree
Hide file tree
Showing 2 changed files with 120 additions and 90 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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.<<incr>>)
|""".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.<<incr>>)
|""".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.<<incr>>)
|""".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.<<incr>>)
|""".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,
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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 {
Expand Down

0 comments on commit 6d49fb9

Please sign in to comment.