diff --git a/metals/src/main/scala/scala/meta/internal/metals/debug/DebugDiscovery.scala b/metals/src/main/scala/scala/meta/internal/metals/debug/DebugDiscovery.scala index 9599e26a86f..9da5efaf0ce 100644 --- a/metals/src/main/scala/scala/meta/internal/metals/debug/DebugDiscovery.scala +++ b/metals/src/main/scala/scala/meta/internal/metals/debug/DebugDiscovery.scala @@ -12,6 +12,7 @@ import scala.meta.internal.metals.BuildTargets import scala.meta.internal.metals.DebugDiscoveryParams import scala.meta.internal.metals.JavaBinary import scala.meta.internal.metals.JsonParser._ +import scala.meta.internal.metals.JvmOpts import scala.meta.internal.metals.Messages import scala.meta.internal.metals.MetalsBuildClient import scala.meta.internal.metals.MetalsEnrichments._ @@ -273,13 +274,37 @@ class DebugDiscovery( if (mains.nonEmpty) { findMainToRun(Map(buildTarget -> mains.toList), params) } else if (tests.nonEmpty) { - Future { - val params = new b.DebugSessionParams(singletonList(buildTarget)) - params.setDataKind(b.TestParamsDataKind.SCALA_TEST_SUITES) - params.setData(tests.asJava.toJson) - params + DebugProvider.envFromFile(workspace, Option(params.envFile)).map { + envFromFile => + val env = + Option(params.env).toList.flatMap(DebugProvider.createEnvList) + + val jvmOpts = + JvmOpts.fromWorkspaceOrEnvForTest(workspace).getOrElse(Nil) + val scalaTestSuite = new b.ScalaTestSuites( + tests + .map( + new b.ScalaTestSuiteSelection( + _, + Nil.asJava, + ) + ) + .asJava, + Option(params.jvmOptions) + .map(jvmOpts ++ _.asScala) + .getOrElse(jvmOpts) + .asJava, + (envFromFile ::: env).asJava, + ) + val debugParams = new b.DebugSessionParams( + singletonList(buildTarget) + ) + debugParams.setDataKind( + b.TestParamsDataKind.SCALA_TEST_SUITES_SELECTION + ) + debugParams.setData(scalaTestSuite.toJson) + debugParams } - } else { Future.failed(NoRunOptionException) } diff --git a/tests/unit/src/test/scala/tests/DebugDiscoverySuite.scala b/tests/unit/src/test/scala/tests/DebugDiscoverySuite.scala index 54a1e9c6b82..3f13dde9f99 100644 --- a/tests/unit/src/test/scala/tests/DebugDiscoverySuite.scala +++ b/tests/unit/src/test/scala/tests/DebugDiscoverySuite.scala @@ -1,7 +1,12 @@ package tests +import java.nio.file.Files +import java.nio.file.Path import java.util.concurrent.TimeUnit +import scala.jdk.CollectionConverters.MapHasAsJava +import scala.util.Random + import scala.meta.internal.metals.DebugDiscoveryParams import scala.meta.internal.metals.JsonParser._ import scala.meta.internal.metals.ServerCommands @@ -136,6 +141,13 @@ class DebugDiscoverySuite } test("run-file-test") { + val envFile: Path = + Files.write( + workspace + .resolve(Random.alphanumeric.take(10).mkString.toLowerCase + ".env") + .toNIO, + "BAR=BAZ".getBytes(), + ) for { _ <- initialize( s"""/metals.json @@ -147,7 +159,11 @@ class DebugDiscoverySuite |/${fooPath} |package a |class Foo extends org.scalatest.funsuite.AnyFunSuite { - | test("foo") {} + | test("foo") { + | val foo = sys.env("FOO") + | val bar = sys.env("BAR") + | print(s"$$foo $$bar") + |} |} |""".stripMargin ) @@ -158,6 +174,8 @@ class DebugDiscoverySuite new DebugDiscoveryParams( server.toPath(fooPath).toURI.toString, "runOrTestFile", + env = Map("FOO" -> "BAR").asJava, + envFile = envFile.getFileName.toString, ).toJson ) _ <- debugger.initialize @@ -165,7 +183,14 @@ class DebugDiscoverySuite _ <- debugger.configurationDone _ <- debugger.shutdown output <- debugger.allOutput - } yield assert(output.contains("All tests in a.Foo passed")) + } yield assert( + output.contains( + """|All tests in a.Foo passed + | + |BAR BAZ + |""".stripMargin + ) + ) } test("no-run-or-test") {