Skip to content

Commit daa52a0

Browse files
committed
Run test suite with all supported input kinds
1 parent 12c7fe7 commit daa52a0

File tree

10 files changed

+107
-31
lines changed

10 files changed

+107
-31
lines changed

build.sbt

+9
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import com.typesafe.tools.mima.core.{Problem, ProblemFilters}
2+
13
val previousVersion: Option[String] = Some("1.2.1")
24
val newScalaBinaryVersionsInThisRelease: Set[String] = Set()
35

@@ -130,6 +132,13 @@ lazy val `scalajs-js-envs-test-kit` = project
130132
"junit" % "junit" % "4.12",
131133
"com.novocode" % "junit-interface" % "0.11" % "test"
132134
),
135+
mimaBinaryIssueFilters ++= Seq(
136+
// private[test], not an issue
137+
ProblemFilters.exclude[Problem]("org.scalajs.jsenv.test.RunTests.*"),
138+
ProblemFilters.exclude[Problem]("org.scalajs.jsenv.test.TimeoutRunTests.*"),
139+
ProblemFilters.exclude[Problem]("org.scalajs.jsenv.test.ComTests.*"),
140+
ProblemFilters.exclude[Problem]("org.scalajs.jsenv.test.TimeoutComTests.*"),
141+
)
133142
)
134143
.dependsOn(`scalajs-js-envs`)
135144

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

+3-2
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

+29-9
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,38 @@ private object JSEnvSuiteRunner {
7374
if (config.supportsCom) List(TRUE, FALSE)
7475
else List(FALSE)
7576

76-
for (withCom <- withComValues)
77-
runners.add(r[RunTests](config, "withCom" -> withCom))
77+
val inputKindValues = {
78+
import TestKit.InputKind
7879

79-
if (config.supportsTimeout) {
80-
for (withCom <- withComValues)
81-
runners.add(r[TimeoutRunTests](config, "withCom" -> withCom))
80+
val b = List.newBuilder[InputKind]
81+
82+
if (config.supportsScripts)
83+
b += InputKind.Script
84+
85+
if (config.supportsCommonJSModules)
86+
b += InputKind.CommonJSModule
87+
88+
if (config.supportsESModules)
89+
b += InputKind.ESModule
90+
91+
b.result
8292
}
8393

84-
if (config.supportsCom)
85-
runners.add(r[ComTests](config))
94+
for (inputKind <- inputKindValues) {
95+
for (withCom <- withComValues)
96+
runners.add(r[RunTests](config, "withCom" -> withCom, "inputKind" -> inputKind))
97+
98+
if (config.supportsTimeout) {
99+
for (withCom <- withComValues)
100+
runners.add(r[TimeoutRunTests](config, "withCom" -> withCom, "inputKind" -> inputKind))
101+
}
86102

87-
if (config.supportsCom && config.supportsTimeout)
88-
runners.add(r[TimeoutComTests](config))
103+
if (config.supportsCom)
104+
runners.add(r[ComTests](config, "inputKind" -> inputKind))
105+
106+
if (config.supportsCom && config.supportsTimeout)
107+
runners.add(r[TimeoutComTests](config, "inputKind" -> inputKind))
108+
}
89109

90110
runners
91111
}

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

+23-1
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,9 @@ import scala.concurrent.duration._
2828
* @param supportsTimeout Whether the [[JSEnv]] under test supports the
2929
* JavaScript timeout methods (as defined in
3030
* [[http://www.scala-js.org/api/scalajs-library/latest/#scala.scalajs.js.timers.RawTimers$ RawTimers]]).
31+
* @param supportsScripts Whether the [[JSEnv]] under test supports [[JSEnv.Input.Script]].
32+
* @param supportsCommonJSModules Whether the [[JSEnv]] under test supports [[JSEnv.Input.CommonJSModule]].
33+
* @param supportsESModules Whether the [[JSEnv]] under test supports [[JSEnv.Input.ESModule]].
3134
* @param awaitTimeout Amount of time test cases wait for "things". This is
3235
* deliberately not very well specified. Leave this as the default and
3336
* increase it if your tests fail spuriously due to timeouts.
@@ -40,6 +43,9 @@ final class JSEnvSuiteConfig private (
4043
val jsEnv: JSEnv,
4144
val supportsCom: Boolean,
4245
val supportsTimeout: Boolean,
46+
val supportsScripts: Boolean,
47+
val supportsCommonJSModules: Boolean,
48+
val supportsESModules: Boolean,
4349
val exitJSStatement: Option[String],
4450
val awaitTimeout: FiniteDuration,
4551
val description: String
@@ -48,6 +54,9 @@ final class JSEnvSuiteConfig private (
4854
jsEnv = jsEnv,
4955
supportsCom = true,
5056
supportsTimeout = true,
57+
supportsScripts = true,
58+
supportsCommonJSModules = true,
59+
supportsESModules = true,
5160
exitJSStatement = None,
5261
awaitTimeout = 1.minute,
5362
description = jsEnv.name
@@ -59,6 +68,15 @@ final class JSEnvSuiteConfig private (
5968
def withSupportsTimeout(supportsTimeout: Boolean): JSEnvSuiteConfig =
6069
copy(supportsTimeout = supportsTimeout)
6170

71+
def withSupportsScripts(supportsScripts: Boolean): JSEnvSuiteConfig =
72+
copy(supportsScripts = supportsScripts)
73+
74+
def withSupportsCommonJSModules(supportsCommonJSModules: Boolean): JSEnvSuiteConfig =
75+
copy(supportsCommonJSModules = supportsCommonJSModules)
76+
77+
def withSupportsESModules(supportsESModules: Boolean): JSEnvSuiteConfig =
78+
copy(supportsESModules = supportsESModules)
79+
6280
def withExitJSStatement(code: String): JSEnvSuiteConfig =
6381
copy(exitJSStatement = Some(code))
6482

@@ -71,10 +89,14 @@ final class JSEnvSuiteConfig private (
7189
private def copy(
7290
supportsCom: Boolean = supportsCom,
7391
supportsTimeout: Boolean = supportsTimeout,
92+
supportsScripts: Boolean = supportsScripts,
93+
supportsCommonJSModules: Boolean = supportsCommonJSModules,
94+
supportsESModules: Boolean = supportsESModules,
7495
exitJSStatement: Option[String] = exitJSStatement,
7596
awaitTimeout: FiniteDuration = awaitTimeout,
7697
description: String = description) = {
77-
new JSEnvSuiteConfig(jsEnv, supportsCom, supportsTimeout,
98+
new JSEnvSuiteConfig(jsEnv, supportsCom, supportsTimeout, supportsScripts,
99+
supportsCommonJSModules, supportsESModules,
78100
exitJSStatement, awaitTimeout, description)
79101
}
80102
}

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

+5-4
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

+3-2
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

+3-2
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

+31-10
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 `defaultInputKind`.
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("test.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
}

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

-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ import org.junit.Test
2222
import org.scalajs.jsenv._
2323

2424
class TestKitTest {
25-
import TestKit.codeToInput
2625
import TestKitTest._
2726

2827
private def noHangTest(env: TestEnv, msg: String)(body: TestKit => Unit) = {

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

+1
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)