Skip to content

Commit fe5a47f

Browse files
committed
Run test suite with all supported input kinds
1 parent 0a1995f commit fe5a47f

File tree

8 files changed

+96
-28
lines changed

8 files changed

+96
-28
lines changed

js-envs-test-kit/src/main/scala/org/scalajs/jsenv/test/ComTests.scala

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,9 @@ import org.junit.Assume._
1818
import org.scalajs.jsenv._
1919
import org.scalajs.jsenv.test.kit.TestKit
2020

21-
private[test] class ComTests(config: JSEnvSuiteConfig) {
22-
private val kit = new TestKit(config.jsEnv, config.awaitTimeout)
21+
private[test] class ComTests(config: JSEnvSuiteConfig,
22+
defaultInputKind: TestKit.InputKind) {
23+
private val kit = new TestKit(config.jsEnv, config.awaitTimeout, defaultInputKind)
2324

2425
@Test
2526
def basicTest: Unit = {

js-envs-test-kit/src/main/scala/org/scalajs/jsenv/test/JSEnvSuite.scala

Lines changed: 37 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
package org.scalajs.jsenv.test
1414

1515
import org.scalajs.jsenv.JSEnv
16+
import org.scalajs.jsenv.test.kit.TestKit
1617

1718
import scala.reflect.ClassTag
1819

@@ -73,19 +74,47 @@ private object JSEnvSuiteRunner {
7374
if (config.supportsCom) List(TRUE, FALSE)
7475
else List(TRUE, FALSE)
7576

76-
for (withCom <- withComValues)
77-
runners.add(r[RunTests](config, "withCom" -> withCom))
77+
val inputKindValues = {
78+
import TestKit.InputKind
79+
80+
val b = List.newBuilder[InputKind]
81+
82+
b += InputKind.Script
83+
84+
if (config.supportsCommonJSModules)
85+
b += InputKind.CommonJSModule
86+
87+
if (config.supportsESModules)
88+
b += InputKind.ESModule
89+
90+
b.result
91+
}
92+
93+
for {
94+
withCom <- withComValues
95+
inputKind <- inputKindValues
96+
} {
97+
runners.add(r[RunTests](config, "withCom" -> withCom, "inputKind" -> inputKind))
98+
}
7899

79100
if (config.supportsTimeout) {
80-
for (withCom <- withComValues)
81-
runners.add(r[TimeoutRunTests](config, "withCom" -> withCom))
101+
for {
102+
withCom <- withComValues
103+
inputKind <- inputKindValues
104+
} {
105+
runners.add(r[TimeoutRunTests](config, "withCom" -> withCom, "inputKind" -> inputKind))
106+
}
82107
}
83108

84-
if (config.supportsCom)
85-
runners.add(r[ComTests](config))
109+
if (config.supportsCom) {
110+
for (inputKind <- inputKindValues)
111+
runners.add(r[ComTests](config, "inputKind" -> inputKind))
112+
}
86113

87-
if (config.supportsTimeout)
88-
runners.add(r[TimeoutComTests](config))
114+
if (config.supportsTimeout) {
115+
for (inputKind <- inputKindValues)
116+
runners.add(r[TimeoutComTests](config, "inputKind" -> inputKind))
117+
}
89118

90119
runners
91120
}

js-envs-test-kit/src/main/scala/org/scalajs/jsenv/test/JSEnvSuiteConfig.scala

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@ final class JSEnvSuiteConfig private (
4040
val jsEnv: JSEnv,
4141
val supportsCom: Boolean,
4242
val supportsTimeout: Boolean,
43+
val supportsCommonJSModules: Boolean,
44+
val supportsESModules: Boolean,
4345
val exitJSStatement: Option[String],
4446
val awaitTimeout: FiniteDuration,
4547
val description: String
@@ -48,6 +50,8 @@ final class JSEnvSuiteConfig private (
4850
jsEnv = jsEnv,
4951
supportsCom = true,
5052
supportsTimeout = true,
53+
supportsCommonJSModules = true,
54+
supportsESModules = true,
5155
exitJSStatement = None,
5256
awaitTimeout = 1.minute,
5357
description = jsEnv.name
@@ -59,6 +63,12 @@ final class JSEnvSuiteConfig private (
5963
def withSupportsTimeout(supportsTimeout: Boolean): JSEnvSuiteConfig =
6064
copy(supportsTimeout = supportsTimeout)
6165

66+
def withSupportsCommonJSModules(supportsCommonJSModules: Boolean): JSEnvSuiteConfig =
67+
copy(supportsCommonJSModules = supportsCommonJSModules)
68+
69+
def withSupportsESModules(supportsESModules: Boolean): JSEnvSuiteConfig =
70+
copy(supportsESModules = supportsESModules)
71+
6272
def withExitJSStatement(code: String): JSEnvSuiteConfig =
6373
copy(exitJSStatement = Some(code))
6474

@@ -71,10 +81,13 @@ final class JSEnvSuiteConfig private (
7181
private def copy(
7282
supportsCom: Boolean = supportsCom,
7383
supportsTimeout: Boolean = supportsTimeout,
84+
supportsCommonJSModules: Boolean = supportsCommonJSModules,
85+
supportsESModules: Boolean = supportsESModules,
7486
exitJSStatement: Option[String] = exitJSStatement,
7587
awaitTimeout: FiniteDuration = awaitTimeout,
7688
description: String = description) = {
7789
new JSEnvSuiteConfig(jsEnv, supportsCom, supportsTimeout,
90+
supportsCommonJSModules, supportsESModules,
7891
exitJSStatement, awaitTimeout, description)
7992
}
8093
}

js-envs-test-kit/src/main/scala/org/scalajs/jsenv/test/RunTests.scala

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,9 @@ import org.junit.{Test, AssumptionViolatedException}
2424
import org.scalajs.jsenv._
2525
import org.scalajs.jsenv.test.kit.{TestKit, Run}
2626

27-
private[test] class RunTests(config: JSEnvSuiteConfig, withCom: Boolean) {
28-
private val kit = new TestKit(config.jsEnv, config.awaitTimeout)
27+
private[test] class RunTests(config: JSEnvSuiteConfig, withCom: Boolean,
28+
defaultInputKind: TestKit.InputKind) {
29+
private val kit = new TestKit(config.jsEnv, config.awaitTimeout, defaultInputKind)
2930

3031
private def withRun(input: Seq[Input])(body: Run => Unit) = {
3132
if (withCom) kit.withComRun(input)(body)
@@ -141,7 +142,7 @@ private[test] class RunTests(config: JSEnvSuiteConfig, withCom: Boolean) {
141142
val badFile = Jimfs.newFileSystem().getPath("nonexistent")
142143

143144
// `start` may not throw but must fail asynchronously
144-
withRun(Input.Script(badFile) :: Nil) {
145+
withRun(kit.pathToInput(badFile) :: Nil) {
145146
_.fails()
146147
}
147148
}
@@ -155,7 +156,7 @@ private[test] class RunTests(config: JSEnvSuiteConfig, withCom: Boolean) {
155156
val tmpPath = tmpFile.toPath
156157
Files.write(tmpPath, "console.log(\"test\");".getBytes(StandardCharsets.UTF_8))
157158

158-
withRun(Input.Script(tmpPath) :: Nil) {
159+
withRun(kit.pathToInput(tmpPath) :: Nil) {
159160
_.expectOut("test\n")
160161
.closeRun()
161162
}

js-envs-test-kit/src/main/scala/org/scalajs/jsenv/test/TimeoutComTests.scala

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,9 @@ import org.junit.Assume._
2121
import org.scalajs.jsenv._
2222
import org.scalajs.jsenv.test.kit.TestKit
2323

24-
private[test] class TimeoutComTests(config: JSEnvSuiteConfig) {
25-
private val kit = new TestKit(config.jsEnv, config.awaitTimeout)
24+
private[test] class TimeoutComTests(config: JSEnvSuiteConfig,
25+
defaultInputKind: TestKit.InputKind) {
26+
private val kit = new TestKit(config.jsEnv, config.awaitTimeout, defaultInputKind)
2627

2728
/** Slack for timeout tests (see #3457)
2829
*

js-envs-test-kit/src/main/scala/org/scalajs/jsenv/test/TimeoutRunTests.scala

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,9 @@ import org.junit.Assume._
2121
import org.scalajs.jsenv._
2222
import org.scalajs.jsenv.test.kit.{TestKit, Run}
2323

24-
private[test] class TimeoutRunTests(config: JSEnvSuiteConfig, withCom: Boolean) {
25-
private val kit = new TestKit(config.jsEnv, config.awaitTimeout)
24+
private[test] class TimeoutRunTests(config: JSEnvSuiteConfig, withCom: Boolean,
25+
defaultInputKind: TestKit.InputKind) {
26+
private val kit = new TestKit(config.jsEnv, config.awaitTimeout, defaultInputKind)
2627

2728
private def withRun(input: String)(body: Run => Unit) = {
2829
if (withCom) kit.withComRun(input)(body)

js-envs-test-kit/src/main/scala/org/scalajs/jsenv/test/kit/TestKit.scala

Lines changed: 31 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -41,15 +41,17 @@ import org.scalajs.jsenv._
4141
* }}}
4242
*
4343
* @note Methods in [[TestKit]] allow to take a string instead of an [[Input]].
44-
* The string is converted into an input form supported by the [[JSEnv]] to
45-
* execute the code therein.
44+
* The string is converted into an input via `defaultInput`.
4645
*
4746
* @constructor Create a new [[TestKit]] for the given [[JSEnv]] and timeout.
4847
* @param jsEnv The [[JSEnv]] to be tested.
4948
* @param timeout Timeout for all `expect*` methods on [[Run]] / [[ComRun]].
5049
*/
51-
final class TestKit(jsEnv: JSEnv, timeout: FiniteDuration) {
52-
import TestKit.codeToInput
50+
final class TestKit(jsEnv: JSEnv, timeout: FiniteDuration,
51+
defaultInputKind: TestKit.InputKind) {
52+
53+
def this(jsEnv: JSEnv, timeout: FiniteDuration) =
54+
this(jsEnv, timeout, TestKit.InputKind.Script)
5355

5456
/** Starts a [[Run]] for testing. */
5557
def start(code: String): Run =
@@ -126,6 +128,17 @@ final class TestKit(jsEnv: JSEnv, timeout: FiniteDuration) {
126128
finally run.close()
127129
}
128130

131+
/** Converts a Path to an Input based on this Kit's defaultInputKind */
132+
def pathToInput(path: Path): Input = {
133+
import TestKit.InputKind._
134+
135+
defaultInputKind match {
136+
case Script => Input.Script(path)
137+
case CommonJSModule => Input.CommonJSModule(path)
138+
case ESModule => Input.ESModule(path)
139+
}
140+
}
141+
129142
private def io[T <: JSRun](config: RunConfig)(start: RunConfig => T): (T, IOReader, IOReader) = {
130143
val out = new IOReader
131144
val err = new IOReader
@@ -147,17 +160,25 @@ final class TestKit(jsEnv: JSEnv, timeout: FiniteDuration) {
147160

148161
(run, out, err)
149162
}
163+
164+
private def codeToInput(code: String): Seq[Input] = {
165+
val p = Files.write(
166+
Jimfs.newFileSystem().getPath("testScript.js"),
167+
code.getBytes(StandardCharsets.UTF_8))
168+
List(pathToInput(p))
169+
}
150170
}
151171

152-
private object TestKit {
172+
object TestKit {
153173
/** Execution context to run completion callbacks from runs under test. */
154174
private val completer =
155175
ExecutionContext.fromExecutor(Executors.newSingleThreadExecutor())
156176

157-
private def codeToInput(code: String): Seq[Input] = {
158-
val p = Files.write(
159-
Jimfs.newFileSystem().getPath("testScript.js"),
160-
code.getBytes(StandardCharsets.UTF_8))
161-
List(Input.Script(p))
177+
sealed trait InputKind
178+
179+
object InputKind {
180+
case object Script extends InputKind
181+
case object CommonJSModule extends InputKind
182+
case object ESModule extends InputKind
162183
}
163184
}

nodejs-env/src/test/scala/org/scalajs/jsenv/nodejs/NodeJSSuite.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,5 +19,6 @@ import org.junit.runner.RunWith
1919
@RunWith(classOf[JSEnvSuiteRunner])
2020
class NodeJSSuite extends JSEnvSuite(
2121
JSEnvSuiteConfig(new NodeJSEnv)
22+
.withSupportsESModules(false) // #17
2223
.withExitJSStatement("process.exit(0);")
2324
)

0 commit comments

Comments
 (0)