Skip to content

Commit eab6373

Browse files
authored
Merge pull request #18 from gzm0/fix-es-module-errors
Fix #17: Fail run in NodeJSEnv if ESModule fails
2 parents 01b0e95 + 5ea4d40 commit eab6373

File tree

10 files changed

+124
-52
lines changed

10 files changed

+124
-52
lines changed

build.sbt

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
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

46
inThisBuild(Def.settings(
5-
version := "1.2.2-SNAPSHOT",
7+
version := "1.3.0-SNAPSHOT",
68
organization := "org.scala-js",
79
scalaVersion := "2.12.11",
810
crossScalaVersions := Seq("2.11.12", "2.12.11", "2.13.2"),
@@ -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

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,19 +12,15 @@
1212

1313
package org.scalajs.jsenv.test
1414

15-
import org.junit.{Before, Test, AssumptionViolatedException}
15+
import org.junit.{Test, AssumptionViolatedException}
1616
import org.junit.Assume._
1717

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)
23-
24-
@Before
25-
def before: Unit = {
26-
assumeTrue("JSEnv needs com support", config.supportsCom)
27-
}
21+
private[test] class ComTests(config: JSEnvSuiteConfig,
22+
defaultInputKind: TestKit.InputKind) {
23+
private val kit = new TestKit(config.jsEnv, config.awaitTimeout, defaultInputKind)
2824

2925
@Test
3026
def basicTest: Unit = {

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

Lines changed: 41 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

@@ -67,13 +68,45 @@ private object JSEnvSuiteRunner {
6768
private def getRunners(config: JSEnvSuiteConfig): java.util.List[Runner] = {
6869
import java.lang.Boolean.{TRUE, FALSE}
6970

70-
java.util.Arrays.asList(
71-
r[RunTests](config, "withCom" -> FALSE),
72-
r[RunTests](config, "withCom" -> TRUE),
73-
r[TimeoutRunTests](config, "withCom" -> FALSE),
74-
r[TimeoutRunTests](config, "withCom" -> TRUE),
75-
r[ComTests](config),
76-
r[TimeoutComTests](config)
77-
)
71+
val runners = new java.util.ArrayList[Runner]
72+
73+
val withComValues =
74+
if (config.supportsCom) List(TRUE, FALSE)
75+
else List(FALSE)
76+
77+
val inputKindValues = {
78+
import TestKit.InputKind
79+
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
92+
}
93+
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+
}
102+
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+
}
109+
110+
runners
78111
}
79112
}

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

Lines changed: 23 additions & 1 deletion
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

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,14 @@ import java.nio.file.Files
1919
import com.google.common.jimfs.Jimfs
2020

2121
import org.junit.Assume._
22-
import org.junit.{Test, Before, AssumptionViolatedException}
22+
import org.junit.{Test, AssumptionViolatedException}
2323

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: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,21 +14,16 @@ package org.scalajs.jsenv.test
1414

1515
import scala.concurrent.duration._
1616

17-
import org.junit.{Before, Test}
17+
import org.junit.Test
1818
import org.junit.Assert._
1919
import org.junit.Assume._
2020

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)
26-
27-
@Before
28-
def before: Unit = {
29-
assumeTrue("JSEnv needs timeout support", config.supportsTimeout)
30-
assumeTrue("JSEnv needs com support", config.supportsCom)
31-
}
24+
private[test] class TimeoutComTests(config: JSEnvSuiteConfig,
25+
defaultInputKind: TestKit.InputKind) {
26+
private val kit = new TestKit(config.jsEnv, config.awaitTimeout, defaultInputKind)
3227

3328
/** Slack for timeout tests (see #3457)
3429
*

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

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,26 +14,22 @@ package org.scalajs.jsenv.test
1414

1515
import scala.concurrent.duration._
1616

17-
import org.junit.{Before, Test}
17+
import org.junit.Test
1818
import org.junit.Assert._
1919
import org.junit.Assume._
2020

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)
2930
else kit.withRun(input)(body)
3031
}
3132

32-
@Before
33-
def before: Unit = {
34-
assumeTrue("JSEnv needs timeout support", config.supportsTimeout)
35-
}
36-
3733
/** Slack for timeout tests (see #3457)
3834
*
3935
* Empirically we can observe that timing can be off by ~0.1ms. By cutting

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 `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

Lines changed: 0 additions & 1 deletion
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/main/scala/org/scalajs/jsenv/nodejs/NodeJSEnv.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ object NodeJSEnv {
146146
* `import()` cannot be used from the standard input).
147147
*/
148148
val importChain = input.foldLeft("Promise.resolve()") { (prev, item) =>
149-
s"$prev.\n then(${execInputExpr(item)})"
149+
s"$prev.\n then(() => ${execInputExpr(item)})"
150150
}
151151
val importerFileContent = {
152152
s"""

0 commit comments

Comments
 (0)