Skip to content

Commit cc6610b

Browse files
authored
Merge pull request #2974 from sjrd/remove-jsdependencies-in-build
Remove the JSDependencies plugin from our own build.
2 parents bf0b6f4 + 8051a9c commit cc6610b

File tree

7 files changed

+151
-98
lines changed

7 files changed

+151
-98
lines changed

ci/matrix.xml

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515

1616
<task id="main"><![CDATA[
1717
setJavaVersion $java
18+
npm install &&
1819
sbtretry ++$scala helloworld/run &&
1920
sbtretry 'set scalaJSStage in Global := FullOptStage' \
2021
++$scala helloworld/run \
@@ -58,6 +59,7 @@
5859

5960
<task id="test-suite-ecma-script5"><![CDATA[
6061
setJavaVersion $java
62+
npm install &&
6163
sbtretry ++$scala jUnitTestOutputsJVM/test jUnitTestOutputsJS/test \
6264
'set scalaJSStage in Global := FullOptStage' jUnitTestOutputsJS/test &&
6365
sbtretry ++$scala $testSuite/test &&
@@ -97,6 +99,7 @@
9799

98100
<task id="test-suite-ecma-script6"><![CDATA[
99101
setJavaVersion $java
102+
npm install &&
100103
sbtretry 'set scalaJSOutputMode in $testSuite := org.scalajs.core.tools.linker.backend.OutputMode.ECMAScript6' \
101104
'set jsEnv in $testSuite := new org.scalajs.jsenv.nodejs.NodeJSEnv().withSourceMap(false)' \
102105
++$scala $testSuite/test \
@@ -141,15 +144,15 @@
141144

142145
<task id="bootstrap"><![CDATA[
143146
setJavaVersion $java
144-
sbt 'set jsEnv in toolsJS := new org.scalajs.jsenv.nodejs.NodeJSEnv(args = Seq("--max_old_space_size=3072")).withSourceMap(false)' \
145-
++$scala irJS/test toolsJS/test &&
146-
sbt 'set jsEnv in toolsJS := new org.scalajs.jsenv.nodejs.NodeJSEnv(args = Seq("--max_old_space_size=3072")).withSourceMap(false)' \
147-
'set scalaJSStage in Global := FullOptStage' \
147+
npm install &&
148+
sbt ++$scala irJS/test toolsJS/test &&
149+
sbt 'set scalaJSStage in Global := FullOptStage' \
148150
++$scala irJS/test toolsJS/test
149151
]]></task>
150152

151153
<task id="tools-cli-stubs"><![CDATA[
152154
setJavaVersion $java
155+
npm install &&
153156
sbt ++$scala tools/package ir/test tools/test cli/package cli/assembly \
154157
stubs/package jsEnvsTestSuite/test jsDependenciesCore/test \
155158
ir/mimaReportBinaryIssues tools/mimaReportBinaryIssues \
@@ -163,6 +166,7 @@
163166

164167
<task id="tools-cli-stubs-sbtplugin"><![CDATA[
165168
setJavaVersion $java
169+
npm install &&
166170
sbt ++$scala tools/package ir/test tools/test cli/package cli/assembly \
167171
stubs/package jsEnvsTestSuite/test jsDependenciesCore/test \
168172
sbtPlugin/package jsDependenciesPlugin/package \
@@ -193,12 +197,14 @@
193197

194198
<task id="partestc"><![CDATA[
195199
setJavaVersion $java
200+
npm install &&
196201
sbt ++$scala partest/compile
197202
]]></task>
198203

199204
<task id="sbtplugin-test"><![CDATA[
200205
# Publish Scala.js artifacts locally
201206
# Then go into standalone project and test
207+
npm install &&
202208
sbt ++2.11.11 compiler/publishLocal library/publishLocal \
203209
testInterface/publishLocal stubs/publishLocal \
204210
jUnitPlugin/publishLocal jUnitRuntime/publishLocal &&
@@ -220,16 +226,19 @@
220226

221227
<task id="partest-noopt"><![CDATA[
222228
setJavaVersion $java
229+
npm install &&
223230
sbt ++$scala package "partestSuite/testOnly -- --showDiff"
224231
]]></task>
225232

226233
<task id="partest-fastopt"><![CDATA[
227234
setJavaVersion $java
235+
npm install &&
228236
sbt ++$scala package "partestSuite/testOnly -- --fastOpt --showDiff"
229237
]]></task>
230238

231239
<task id="partest-fullopt"><![CDATA[
232240
setJavaVersion $java
241+
npm install &&
233242
sbt ++$scala package "partestSuite/testOnly -- --fullOpt --showDiff"
234243
]]></task>
235244

package.json

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
{
2+
"private": true,
3+
"devDependencies": {
4+
"source-map-support": "0.4.15",
5+
"jszip": "2.4.0",
6+
"jsdom": "9.12.0"
7+
}
8+
}

project/Build.scala

Lines changed: 51 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -23,14 +23,11 @@ import org.scalajs.sbtplugin._
2323
import org.scalajs.jsenv.JSEnv
2424
import org.scalajs.jsenv.nodejs.{NodeJSEnv, JSDOMNodeJSEnv}
2525

26-
import org.scalajs.jsdependencies.sbtplugin.JSDependenciesPlugin
27-
import org.scalajs.jsdependencies.sbtplugin.JSDependenciesPlugin.autoImport._
28-
2926
import ScalaJSPlugin.autoImport._
3027
import ExternalCompile.scalaJSExternalCompileSettings
3128
import Loggers._
3229

33-
import org.scalajs.core.tools.io.MemVirtualJSFile
30+
import org.scalajs.core.tools.io.{FileVirtualJSFile, MemVirtualJSFile}
3431
import org.scalajs.core.tools.sem._
3532
import org.scalajs.core.tools.json._
3633
import org.scalajs.core.tools.linker.ModuleInitializer
@@ -619,41 +616,52 @@ object Build {
619616
).dependsOn(irProject)
620617

621618
lazy val toolsJS: Project = (project in file("tools/js")).enablePlugins(
622-
MyScalaJSPlugin,
623-
JSDependenciesPlugin
619+
MyScalaJSPlugin
624620
).settings(
625621
commonToolsSettings,
626622
crossVersion := ScalaJSCrossVersion.binary,
627-
resourceGenerators in Test += Def.task {
628-
val base = (resourceManaged in Compile).value
629-
IO.createDirectory(base)
630-
val outFile = base / "js-test-definitions.js"
631623

624+
scalaJSModuleKind in Test :=
625+
org.scalajs.core.tools.linker.backend.ModuleKind.CommonJSModule,
626+
627+
jsExecutionFiles in Test := {
632628
val testDefinitions = {
633629
org.scalajs.build.HTMLRunnerTemplateAccess.renderTestDefinitions(
634630
(loadedTestFrameworks in testSuite in Test).value,
635631
(definedTests in testSuite in Test).value)
636632
}
637633

638-
IO.write(outFile, testDefinitions)
639-
Seq(outFile)
640-
}.taskValue,
634+
val testDefinitionsFile = {
635+
new MemVirtualJSFile("js-test-definitions.js")
636+
.withContent(testDefinitions)
637+
}
638+
639+
testDefinitionsFile +: (jsExecutionFiles in Test).value
640+
},
641641

642-
jsDependencies += ProvidedJS / "js-test-definitions.js" % "test",
643-
jsDependencies +=
644-
"org.webjars" % "jszip" % "2.4.0" % "test" / "jszip.min.js" commonJSName "JSZip",
642+
testSuiteJSExecutionFilesSetting,
643+
644+
// Give more memory to Node.js, and deactivate source maps
645+
jsEnv := new NodeJSEnv(args = Seq("--max_old_space_size=3072")).withSourceMap(false),
645646

646647
inConfig(Test) {
647-
// Redefine test to run Node.js and link HelloWorld
648+
// Redefine test to perform the bootstrap test
648649
test := {
649650
if (!jsEnv.value.isInstanceOf[NodeJSEnv])
650651
throw new MessageOnlyException("toolsJS/test must be run with Node.js")
651652

652-
/* Collect IR relevant files from the classpath
653+
/* We'll explicitly `require` our linked file. Find its module, and
654+
* remove it from the `jsExecutionFiles` to give to the runner.
655+
*/
656+
val toolsTestModule = scalaJSLinkedFile.value
657+
val executionFiles =
658+
jsExecutionFiles.value.filter(_ ne toolsTestModule)
659+
660+
/* Collect relevant IR files from the classpath of the test suite.
653661
* We assume here that the classpath is valid. This is checked by the
654662
* the scalaJSIR task.
655663
*/
656-
val cp = Attributed.data(fullClasspath.value)
664+
val cp = Attributed.data((fullClasspath in (testSuite, Test)).value)
657665

658666
// Files must be Jars, non-files must be dirs
659667
val (jars, dirs) = cp.filter(_.exists).partition(_.isFile)
@@ -681,38 +689,43 @@ object Build {
681689
seqOfStringsToJSArrayCode(unescapedMainMethods)
682690
}
683691

684-
val scalaJSEnv = {
692+
val scalaJSEnvForTestSuite = {
685693
s"""
686694
{"javaSystemProperties": {
687-
"scalajs.scalaVersion": "${scalaVersion.value}"
695+
"scalajs.scalaVersion": "${scalaVersion.value}",
696+
"scalajs.testsuite.testtag": "testtag.value",
697+
"scalajs.nodejs": "true",
698+
"scalajs.typedarray": "true",
699+
"scalajs.fastopt-stage": "true",
700+
"scalajs.modulekind-nomodule": "true"
688701
}}
689702
"""
690703
}
691704

692705
val code = {
693706
s"""
694-
var linker = scalajs.QuickLinker;
707+
var toolsTestModule = require("${escapeJS(toolsTestModule.path)}");
708+
var linker = toolsTestModule.scalajs.QuickLinker;
695709
var lib = linker.linkTestSuiteNode($irPaths, $mainMethods);
696710

697-
var __ScalaJSEnv = $scalaJSEnv;
698-
711+
var __ScalaJSEnv = $scalaJSEnvForTestSuite;
699712
eval("(function() { 'use strict'; " +
700713
lib + ";" +
701-
"scalajs.TestRunner.runTests();" +
714+
"scalajs.ConsoleTestRunner.runTests();" +
702715
"}).call(this);");
703716
"""
704717
}
705718

706719
val launcher = new MemVirtualJSFile("Generated launcher file")
707720
.withContent(code)
708721

709-
val runner = jsEnv.value.jsRunner(jsExecutionFiles.value :+ launcher)
722+
val runner = jsEnv.value.jsRunner(executionFiles :+ launcher)
710723

711724
runner.run(sbtLogger2ToolsLogger(streams.value.log), scalaJSConsole.value)
712725
}
713726
}
714727
).withScalaJSCompiler.dependsOn(
715-
library, irProjectJS, testSuite % "test->test"
728+
library, irProjectJS, jUnitRuntime % "test"
716729
)
717730

718731
lazy val jsEnvs: Project = (project in file("js-envs")).settings(
@@ -1435,9 +1448,17 @@ object Build {
14351448
}).value
14361449
)
14371450

1451+
def testSuiteJSExecutionFilesSetting: Setting[_] = {
1452+
jsExecutionFiles in Test := {
1453+
val resourceDir =
1454+
(resourceDirectory in (LocalProject("testSuite"), Test)).value
1455+
val f = FileVirtualJSFile(resourceDir / "ScalaJSDefinedTestNatives.js")
1456+
f +: (jsExecutionFiles in Test).value
1457+
}
1458+
}
1459+
14381460
lazy val testSuite: Project = (project in file("test-suite/js")).enablePlugins(
1439-
MyScalaJSPlugin,
1440-
JSDependenciesPlugin
1461+
MyScalaJSPlugin
14411462
).settings(
14421463
commonSettings,
14431464
testTagSettings,
@@ -1453,8 +1474,7 @@ object Build {
14531474
scalaJSModuleKind.value != ModuleKind.NoModule)
14541475
},
14551476

1456-
jsDependencies += ProvidedJS / "ScalaJSDefinedTestNatives.js" % "test",
1457-
skip in packageJSDependencies in Test := false,
1477+
testSuiteJSExecutionFilesSetting,
14581478

14591479
scalaJSSemantics ~= (_.withRuntimeClassName(_.fullName match {
14601480
case "org.scalajs.testsuite.compiler.ReflectionTest$RenamedTestClass" =>
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
package org.scalajs.testsuite.utils
2+
3+
import scala.collection.mutable
4+
5+
import scala.scalajs.js
6+
import scala.scalajs.js.annotation._
7+
8+
import org.scalajs.testinterface.{ScalaJSClassLoader, TestDetector}
9+
10+
import sbt.testing._
11+
12+
@JSExportTopLevel("scalajs.ConsoleTestRunner")
13+
object ConsoleTestRunner {
14+
15+
@JSExport
16+
def runTests(): Unit = {
17+
try {
18+
val eventHandler = new SimpleEventHandler
19+
val loggers = Array[Logger](new SimpleLogger)
20+
21+
def taskLoop(tasks: Iterable[Task]): Unit = {
22+
if (tasks.nonEmpty)
23+
tasks.head.execute(eventHandler, loggers,
24+
newTasks => taskLoop(tasks.tail ++ newTasks))
25+
}
26+
27+
for {
28+
(framework, taskDefs) <- TestDetector.detectTests()
29+
} {
30+
val runner = framework.runner(Array(), Array(), new ScalaJSClassLoader())
31+
val tasks = runner.tasks(taskDefs.toArray)
32+
taskLoop(tasks)
33+
}
34+
35+
val failedEvents = eventHandler.failedEvents
36+
if (failedEvents.nonEmpty) {
37+
System.err.println("The following tests failed:")
38+
for (event <- failedEvents) {
39+
System.err.println("* " + event.fullyQualifiedName())
40+
if (event.throwable().isDefined())
41+
event.throwable().get().printStackTrace()
42+
}
43+
throw new AssertionError("Some tests have failed")
44+
}
45+
} catch {
46+
case th: Throwable =>
47+
th.printStackTrace()
48+
throw th
49+
}
50+
}
51+
52+
private class SimpleEventHandler extends EventHandler {
53+
private[this] val _failedEvents = new mutable.ListBuffer[Event]
54+
55+
def failedEvents: List[Event] = _failedEvents.toList
56+
57+
def handle(ev: Event) = {
58+
if (ev.status == Status.Error || ev.status == Status.Failure)
59+
_failedEvents += ev
60+
}
61+
}
62+
63+
private class SimpleLogger extends Logger {
64+
def ansiCodesSupported(): Boolean = false
65+
def error(msg: String): Unit = println(msg)
66+
def warn(msg: String): Unit = println(msg)
67+
def info(msg: String): Unit = println(msg)
68+
def debug(msg: String): Unit = println(msg)
69+
def trace(t: Throwable): Unit = t.printStackTrace
70+
}
71+
72+
}

tools/js/src/test/scala/org/scalajs/core/tools/test/js/QuickLinker.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ object QuickLinker {
118118
}
119119

120120
@js.native
121-
@JSGlobal("JSZip")
121+
@JSImport("jszip", JSImport.Default)
122122
private class JSZip(data: Uint8Array) extends js.Object {
123123
def files: js.Dictionary[JSZipEntry] = js.native
124124
}

0 commit comments

Comments
 (0)