Skip to content

Commit 58a5ea4

Browse files
committed
Fix & refactor script wrapper tests
1 parent 68ce528 commit 58a5ea4

File tree

11 files changed

+184
-243
lines changed

11 files changed

+184
-243
lines changed

modules/integration/src/main/scala/scala/cli/integration/TestInputs.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ final case class TestInputs(maybeCharset: Option[Charset], files: (os.RelPath, S
3434
writeIn(tmpDir)
3535
f(tmpDir)
3636
}
37+
def fileNames: Seq[String] = files.flatMap(_._1.lastOpt)
3738
}
3839

3940
object TestInputs {

modules/integration/src/test/scala/scala/cli/integration/BspTestDefinitions.scala

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,10 @@ import scala.jdk.CollectionConverters.*
2222
import scala.util.control.NonFatal
2323
import scala.util.{Failure, Properties, Success, Try}
2424

25-
abstract class BspTestDefinitions extends ScalaCliSuite with TestScalaVersionArgs {
25+
abstract class BspTestDefinitions extends ScalaCliSuite with TestScalaVersionArgs
26+
with ScriptWrapperTestDefinitions {
2627
_: TestScalaVersion =>
27-
private lazy val extraOptions = scalaVersionArgs ++ TestUtil.extraOptions
28+
protected lazy val extraOptions: Seq[String] = scalaVersionArgs ++ TestUtil.extraOptions
2829

2930
import BspTestDefinitions.*
3031

@@ -61,12 +62,12 @@ abstract class BspTestDefinitions extends ScalaCliSuite with TestScalaVersionArg
6162
pool.shutdown()
6263
}
6364

64-
private def extractMainTargets(targets: Seq[BuildTargetIdentifier]): BuildTargetIdentifier =
65+
protected def extractMainTargets(targets: Seq[BuildTargetIdentifier]): BuildTargetIdentifier =
6566
targets.collectFirst {
6667
case t if !t.getUri.contains("-test") => t
6768
}.get
6869

69-
private def extractTestTargets(targets: Seq[BuildTargetIdentifier]): BuildTargetIdentifier =
70+
protected def extractTestTargets(targets: Seq[BuildTargetIdentifier]): BuildTargetIdentifier =
7071
targets.collectFirst {
7172
case t if t.getUri.contains("-test") => t
7273
}.get
@@ -78,7 +79,8 @@ abstract class BspTestDefinitions extends ScalaCliSuite with TestScalaVersionArg
7879
pauseDuration: FiniteDuration = 5.seconds,
7980
bspOptions: List[String] = List.empty,
8081
reuseRoot: Option[os.Path] = None,
81-
stdErrOpt: Option[os.RelPath] = None
82+
stdErrOpt: Option[os.RelPath] = None,
83+
extraOptionsOverride: Seq[String] = extraOptions
8284
)(
8385
f: (
8486
os.Path,
@@ -93,7 +95,7 @@ abstract class BspTestDefinitions extends ScalaCliSuite with TestScalaVersionArg
9395
val stdErrPathOpt: Option[os.ProcessOutput] = stdErrOpt.map(path => inputsRoot / path)
9496
val stderr: os.ProcessOutput = stdErrPathOpt.getOrElse(os.Inherit)
9597

96-
val proc = os.proc(TestUtil.cli, "bsp", bspOptions ++ extraOptions, args)
98+
val proc = os.proc(TestUtil.cli, "bsp", bspOptions ++ extraOptionsOverride, args)
9799
.spawn(cwd = root, stderr = stderr)
98100
var remoteServer: b.BuildServer & b.ScalaBuildServer & b.JavaBuildServer & b.JvmBuildServer =
99101
null
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
package scala.cli.integration
22

3-
class BspTests212 extends BspTestDefinitions with Test212
3+
class BspTests212 extends BspTestDefinitions with BspTests2Definitions with Test212

modules/integration/src/test/scala/scala/cli/integration/BspTests213.scala

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,7 @@ import scala.async.Async.{async, await}
88
import scala.concurrent.ExecutionContext.Implicits.global
99
import scala.jdk.CollectionConverters.*
1010

11-
class BspTests213 extends BspTestDefinitions with Test213 {
12-
11+
class BspTests213 extends BspTestDefinitions with BspTests2Definitions with Test213 {
1312
List(".sc", ".scala").foreach { filetype =>
1413
test(s"bsp should report actionable diagnostic from bloop for $filetype files (Scala 2.13)") {
1514
val fileName = s"Hello$filetype"
@@ -73,5 +72,4 @@ class BspTests213 extends BspTestDefinitions with Test213 {
7372
}
7473
}
7574
}
76-
7775
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package scala.cli.integration
2+
3+
import scala.concurrent.ExecutionContext.Implicits.global
4+
5+
trait BspTests2Definitions { _: BspTestDefinitions =>
6+
for {
7+
useDirectives <- Seq(true, false)
8+
(directive, options) <- Seq(
9+
(s"//> using scala $actualScalaVersion", Seq("--scala", actualScalaVersion))
10+
)
11+
extraOptionsOverride =
12+
if (useDirectives) TestUtil.extraOptions else TestUtil.extraOptions ++ options
13+
testNameSuffix = if (useDirectives) directive else options.mkString(" ")
14+
} test(s"BSP App object wrapper forced with $testNameSuffix") {
15+
val (script1, script2) = "script1.sc" -> "script2.sc"
16+
val directiveString = if (useDirectives) directive else ""
17+
val inputs = TestInputs(
18+
os.rel / script1 ->
19+
s"""//> using platform js
20+
|$directiveString
21+
|
22+
|def main(args: String*): Unit = println("Hello")
23+
|main()
24+
|""".stripMargin,
25+
os.rel / script2 ->
26+
"""println("Hello")
27+
|""".stripMargin
28+
)
29+
testScriptWrappers(inputs, extraOptionsOverride = extraOptionsOverride)(expectAppWrapper)
30+
}
31+
}
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package scala.cli.integration
2+
3+
import scala.concurrent.ExecutionContext.Implicits.global
4+
5+
trait BspTests3Definitions { _: BspTestDefinitions =>
6+
test("BSP class wrapper for Scala 3") {
7+
val (script1, script2) = "script1.sc" -> "script2.sc"
8+
val inputs = TestInputs(
9+
os.rel / script1 ->
10+
s"""def main(args: String*): Unit = println("Hello")
11+
|main()
12+
|""".stripMargin,
13+
os.rel / script2 ->
14+
s"""//> using dep "org.scalatest::scalatest:3.2.15"
15+
|
16+
|import org.scalatest.*, flatspec.*, matchers.*
17+
|
18+
|class PiTest extends AnyFlatSpec with should.Matchers {
19+
| "pi calculus" should "return a precise enough pi value" in {
20+
| math.Pi shouldBe 3.14158d +- 0.001d
21+
| }
22+
|}
23+
|org.scalatest.tools.Runner.main(Array("-oDF", "-s", classOf[PiTest].getName))""".stripMargin
24+
)
25+
testScriptWrappers(inputs)(expectClassWrapper)
26+
}
27+
28+
for {
29+
useDirectives <- Seq(true, false)
30+
(directive, options) <- Seq(
31+
("//> using object.wrapper", Seq("--object-wrapper")),
32+
("//> using platform js", Seq("--js"))
33+
)
34+
wrapperOptions = if (useDirectives) Nil else options
35+
testNameSuffix = if (useDirectives) directive else options.mkString(" ")
36+
} test(s"BSP object wrapper forced with $testNameSuffix") {
37+
val (script1, script2) = "script1.sc" -> "script2.sc"
38+
val directiveString = if (useDirectives) directive else ""
39+
val inputs = TestInputs(
40+
os.rel / script1 ->
41+
s"""$directiveString
42+
|
43+
|def main(args: String*): Unit = println("Hello")
44+
|main()
45+
|""".stripMargin,
46+
os.rel / script2 ->
47+
"""println("Hello")
48+
|""".stripMargin
49+
)
50+
testScriptWrappers(inputs, bspOptions = wrapperOptions)(expectObjectWrapper)
51+
}
52+
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
package scala.cli.integration
22

3-
class BspTests3Lts extends BspTestDefinitions with Test3Lts
3+
class BspTests3Lts extends BspTestDefinitions with BspTests3Definitions with Test3Lts
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
package scala.cli.integration
22

3-
class BspTests3NextRc extends BspTestDefinitions with Test3NextRc
3+
class BspTests3NextRc extends BspTestDefinitions with BspTests3Definitions with Test3NextRc
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
package scala.cli.integration
22

3-
class BspTestsDefault extends BspTestDefinitions with TestDefault
3+
class BspTestsDefault extends BspTestDefinitions with BspTests3Definitions with TestDefault
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
package scala.cli.integration
2+
3+
import ch.epfl.scala.bsp4j as b
4+
import com.eed3si9n.expecty.Expecty.expect
5+
6+
import scala.async.Async.{async, await}
7+
import scala.concurrent.ExecutionContext
8+
import scala.jdk.CollectionConverters.*
9+
10+
trait ScriptWrapperTestDefinitions extends ScalaCliSuite { _: BspTestDefinitions =>
11+
private def appWrapperSnippet(wrapperName: String) = s"object $wrapperName extends App {"
12+
private def classWrapperSnippet(wrapperName: String) = s"final class $wrapperName$$_"
13+
private def objectWrapperSnippet(wrapperName: String) = s"object $wrapperName {"
14+
def expectScriptWrapper(
15+
path: os.Path,
16+
containsCheck: String => Boolean,
17+
doesNotContainCheck: String => Boolean
18+
): Unit = {
19+
val generatedFileContent = os.read(path)
20+
assert(
21+
containsCheck(generatedFileContent),
22+
clue(s"Generated file content: $generatedFileContent")
23+
)
24+
assert(
25+
doesNotContainCheck(generatedFileContent),
26+
clue(s"Generated file content: $generatedFileContent")
27+
)
28+
}
29+
def expectAppWrapper(wrapperName: String, path: os.Path): Unit =
30+
expectScriptWrapper(
31+
path,
32+
_.contains(appWrapperSnippet(wrapperName)),
33+
content =>
34+
!content.contains(classWrapperSnippet(wrapperName)) &&
35+
!content.contains(objectWrapperSnippet(wrapperName))
36+
)
37+
38+
def expectObjectWrapper(wrapperName: String, path: os.Path): Unit =
39+
expectScriptWrapper(
40+
path,
41+
_.contains(objectWrapperSnippet(wrapperName)),
42+
content =>
43+
!content.contains(classWrapperSnippet(wrapperName)) &&
44+
!content.contains(appWrapperSnippet(wrapperName))
45+
)
46+
47+
def expectClassWrapper(wrapperName: String, path: os.Path): Unit =
48+
expectScriptWrapper(
49+
path,
50+
_.contains(classWrapperSnippet(wrapperName)),
51+
content =>
52+
!content.contains(appWrapperSnippet(wrapperName)) &&
53+
!content.contains(objectWrapperSnippet(wrapperName))
54+
)
55+
56+
def testScriptWrappers(
57+
inputs: TestInputs,
58+
bspOptions: Seq[String] = Nil,
59+
extraOptionsOverride: Seq[String] = extraOptions
60+
)(expectWrapperFunction: (String, os.Path) => Unit)(implicit ec: ExecutionContext): Unit = {
61+
withBsp(
62+
inputs,
63+
inputs.fileNames ++ Seq("--power") ++ bspOptions,
64+
extraOptionsOverride = extraOptionsOverride
65+
) {
66+
(root, _, remoteServer) =>
67+
async {
68+
val buildTargetsResp = await(remoteServer.workspaceBuildTargets().asScala)
69+
val targets = buildTargetsResp.getTargets.asScala.map(_.getId).asJava
70+
val compileParams = new b.CompileParams(targets)
71+
val buildResp = await(remoteServer.buildTargetCompile(compileParams).asScala)
72+
expect(buildResp.getStatusCode == b.StatusCode.OK)
73+
val projectDir = os.list(root / Constants.workspaceDirName).filter(
74+
_.baseName.startsWith(root.baseName + "_")
75+
)
76+
expect(projectDir.size == 1)
77+
inputs.fileNames.map(_.stripSuffix(".sc")).foreach {
78+
scriptName =>
79+
expectWrapperFunction(
80+
scriptName,
81+
projectDir.head / "src_generated" / "main" / s"$scriptName.scala"
82+
)
83+
}
84+
}
85+
}
86+
}
87+
}

0 commit comments

Comments
 (0)