diff options
author | Nikolay Tatarinov <5min4eq.unity@gmail.com> | 2018-02-09 01:41:15 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-02-09 01:41:15 +0300 |
commit | 52f3e614181d158a82c166905f375924d2d6e046 (patch) | |
tree | a26bb94702d606340c664a6ee7096fb5eeb83f11 /scalajslib | |
parent | e381552b992a5ba4743fa54f5111db9a2e9d98e2 (diff) | |
download | mill-52f3e614181d158a82c166905f375924d2d6e046.tar.gz mill-52f3e614181d158a82c166905f375924d2d6e046.tar.bz2 mill-52f3e614181d158a82c166905f375924d2d6e046.zip |
scala.js run (#127)
scala.js run command
Diffstat (limited to 'scalajslib')
5 files changed, 111 insertions, 17 deletions
diff --git a/scalajslib/jsbridges/0.6/src/mill/scalajslib/bridge/ScalaJSBridge.scala b/scalajslib/jsbridges/0.6/src/mill/scalajslib/bridge/ScalaJSBridge.scala index 3525e69e..604df3f7 100644 --- a/scalajslib/jsbridges/0.6/src/mill/scalajslib/bridge/ScalaJSBridge.scala +++ b/scalajslib/jsbridges/0.6/src/mill/scalajslib/bridge/ScalaJSBridge.scala @@ -26,6 +26,12 @@ class ScalaJSBridge extends mill.scalajslib.ScalaJSBridge { linker.link(sourceSJSIRs ++ jarSJSIRs, initializer.toSeq, destFile, logger) } + def run(linkedFile: File): Unit = { + new NodeJSEnv() + .jsRunner(FileVirtualJSFile(linkedFile)) + .run(new ScalaConsoleLogger, ConsoleJSConsole) + } + def getFramework(frameworkName: String, linkedFile: File): sbt.testing.Framework = { val env = new NodeJSEnv().loadLibs( diff --git a/scalajslib/jsbridges/1.0/src/mill/scalajslib/bridge/ScalaJSBridge.scala b/scalajslib/jsbridges/1.0/src/mill/scalajslib/bridge/ScalaJSBridge.scala index 15a3d65b..03a4e9df 100644 --- a/scalajslib/jsbridges/1.0/src/mill/scalajslib/bridge/ScalaJSBridge.scala +++ b/scalajslib/jsbridges/1.0/src/mill/scalajslib/bridge/ScalaJSBridge.scala @@ -7,8 +7,9 @@ import java.io.File import org.scalajs.core.tools.io._ import org.scalajs.core.tools.linker.{ModuleInitializer, StandardLinker} import org.scalajs.core.tools.logging.ScalaConsoleLogger -import org.scalajs.testadapter.TestAdapter +import org.scalajs.jsenv.ConsoleJSConsole import org.scalajs.jsenv.nodejs._ +import org.scalajs.testadapter.TestAdapter class ScalaJSBridge extends mill.scalajslib.ScalaJSBridge { def link(sources: Array[File], libraries: Array[File], dest: File, main: String, fullOpt: Boolean): Unit = { @@ -24,6 +25,12 @@ class ScalaJSBridge extends mill.scalajslib.ScalaJSBridge { linker.link(sourceIRs ++ libraryIRs, initializer.toSeq, destFile, logger) } + def run(linkedFile: File): Unit = { + new NodeJSEnv() + .jsRunner(Seq(FileVirtualJSFile(linkedFile))) + .run(new ScalaConsoleLogger, ConsoleJSConsole) + } + def getFramework(frameworkName: String, linkedFile: File): sbt.testing.Framework = { val env = new NodeJSEnv() diff --git a/scalajslib/src/mill/scalajslib/ScalaJSBridge.scala b/scalajslib/src/mill/scalajslib/ScalaJSBridge.scala index 780fa09e..7c9834b0 100644 --- a/scalajslib/src/mill/scalajslib/ScalaJSBridge.scala +++ b/scalajslib/src/mill/scalajslib/ScalaJSBridge.scala @@ -50,6 +50,10 @@ class ScalaJSWorker { ) } + def run(toolsClasspath: Agg[Path], linkedFile: File): Unit = { + bridge(toolsClasspath).run(linkedFile) + } + def getFramework(toolsClasspath: Agg[Path], frameworkName: String, linkedFile: File): sbt.testing.Framework = { @@ -65,6 +69,8 @@ trait ScalaJSBridge { main: String, fullOpt: Boolean): Unit + def run(linkedFile: File): Unit + def getFramework(frameworkName: String, linkedFile: File): sbt.testing.Framework diff --git a/scalajslib/src/mill/scalajslib/ScalaJSModule.scala b/scalajslib/src/mill/scalajslib/ScalaJSModule.scala index 462fef5a..86ebd53d 100644 --- a/scalajslib/src/mill/scalajslib/ScalaJSModule.scala +++ b/scalajslib/src/mill/scalajslib/ScalaJSModule.scala @@ -89,6 +89,37 @@ trait ScalaJSModule extends scalalib.ScalaModule { outer => ) } + override def runLocal(args: String*) = T.command { run(args:_*) } + + override def run(args: String*) = T.command { + if(mainClass().isEmpty) { + throw new RuntimeException("No mainClass provided!") + } + + ScalaJSBridge.scalaJSBridge().run( + toolsClasspath().map(_.path), + fastOpt().path.toIO + ) + } + + override def runMainLocal(mainClass: String, args: String*) = T.command { runMain(mainClass, args:_*) } + + override def runMain(mainClass: String, args: String*) = T.command { + val linkedFile = link( + ScalaJSBridge.scalaJSBridge(), + toolsClasspath(), + Seq(compile()), + compileDepClasspath(), + Some(mainClass), + FastOpt + ) + + ScalaJSBridge.scalaJSBridge().run( + toolsClasspath().map(_.path), + linkedFile.path.toIO + ) + } + def link(worker: ScalaJSWorker, toolsClasspath: Agg[PathRef], input: Seq[CompilationResult], diff --git a/scalajslib/test/src/mill/scalajslib/HelloJSWorldTests.scala b/scalajslib/test/src/mill/scalajslib/HelloJSWorldTests.scala index 61e1671e..6738d7d3 100644 --- a/scalajslib/test/src/mill/scalajslib/HelloJSWorldTests.scala +++ b/scalajslib/test/src/mill/scalajslib/HelloJSWorldTests.scala @@ -6,8 +6,7 @@ import javax.script.{ScriptContext, ScriptEngineManager} import ammonite.ops._ import mill._ -import mill.define.Discover -import mill.eval.Result +import mill.eval.{Evaluator, Result} import mill.scalalib.{CrossScalaModule, DepSyntax, Lib, PublishModule, TestRunner} import mill.scalalib.publish.{Developer, License, PomSettings, SCM} import mill.util.{TestEvaluator, TestUtil} @@ -121,9 +120,9 @@ object HelloJSWorldTests extends TestSuite { assert(unchangedEvalCount == 0) } - 'fromScratch_2124_0621 - testCompileFromScratch("2.12.4", "0.6.22") - 'fromScratch_2123_0621 - testCompileFromScratch("2.12.3", "0.6.22") - 'fromScratch_2118_0621 - testCompileFromScratch("2.11.8", "0.6.22") + 'fromScratch_2124_0622 - testCompileFromScratch("2.12.4", "0.6.22") + 'fromScratch_2123_0622 - testCompileFromScratch("2.12.3", "0.6.22") + 'fromScratch_2118_0622 - testCompileFromScratch("2.11.8", "0.6.22") 'fromScratch_2124_100M2 - testCompileFromScratch("2.12.4", "1.0.0-M2") } @@ -140,15 +139,15 @@ object HelloJSWorldTests extends TestSuite { } 'fullOpt - { - 'run_2124_0621 - testRun("2.12.4", "0.6.22", FullOpt) - 'run_2123_0621 - testRun("2.12.3", "0.6.22", FullOpt) - 'run_2118_0621 - testRun("2.11.8", "0.6.22", FullOpt) + 'run_2124_0622 - testRun("2.12.4", "0.6.22", FullOpt) + 'run_2123_0622 - testRun("2.12.3", "0.6.22", FullOpt) + 'run_2118_0622 - testRun("2.11.8", "0.6.22", FullOpt) 'run_2124_100M2 - testRun("2.12.4", "1.0.0-M2", FullOpt) } 'fastOpt - { - 'run_2124_0621 - testRun("2.12.4", "0.6.22", FastOpt) - 'run_2123_0621 - testRun("2.12.3", "0.6.22", FastOpt) - 'run_2118_0621 - testRun("2.11.8", "0.6.22", FastOpt) + 'run_2124_0622 - testRun("2.12.4", "0.6.22", FastOpt) + 'run_2123_0622 - testRun("2.12.3", "0.6.22", FastOpt) + 'run_2118_0622 - testRun("2.11.8", "0.6.22", FastOpt) 'run_2124_100M2 - testRun("2.12.4", "1.0.0-M2", FastOpt) } 'jar - { @@ -166,7 +165,7 @@ object HelloJSWorldTests extends TestSuite { val Right((result, evalCount)) = helloWorldEvaluator(HelloJSWorld.helloJsWorld(scalaVersion, scalaJSVersion).artifactMetadata) assert(result.id == artifactId) } - 'artifactId_0621 - testArtifactId("2.12.4", "0.6.22", "hello-js-world_sjs0.6_2.12") + 'artifactId_0622 - testArtifactId("2.12.4", "0.6.22", "hello-js-world_sjs0.6_2.12") 'artifactId_100M2 - testArtifactId("2.12.4", "1.0.0-M2", "hello-js-world_sjs1.0.0-M2_2.12") } 'test - { @@ -213,17 +212,62 @@ object HelloJSWorldTests extends TestSuite { ) } - 'utest_2118_0621 - checkUtest("2.11.8", "0.6.22") - 'utest_2124_0621 - checkUtest("2.12.4", "0.6.22") + 'utest_2118_0622 - checkUtest("2.11.8", "0.6.22") + 'utest_2124_0622 - checkUtest("2.12.4", "0.6.22") 'utest_2118_100M2 - checkUtest("2.11.8", "1.0.0-M2") 'utest_2124_100M2 - checkUtest("2.12.4", "1.0.0-M2") - 'scalaTest_2118_0621 - checkScalaTest("2.11.8", "0.6.22") - 'scalaTest_2124_0621 - checkScalaTest("2.12.4", "0.6.22") + 'scalaTest_2118_0622 - checkScalaTest("2.11.8", "0.6.22") + 'scalaTest_2124_0622 - checkScalaTest("2.12.4", "0.6.22") // No scalatest artifact for scala.js 1.0.0-M2 published yet // 'scalaTest_2118_100M2 - checkScalaTest("2.11.8", "1.0.0-M2") // 'scalaTest_2124_100M2 - checkScalaTest("2.12.4", "1.0.0-M2") } + + def checkRun(scalaVersion: String, scalaJSVersion: String, mainClass: Option[String] = None): Unit = { + val task = mainClass match { + case Some(main) => HelloJSWorld.helloJsWorld(scalaVersion, scalaJSVersion).runMain(main) + case None => HelloJSWorld.helloJsWorld(scalaVersion, scalaJSVersion).run() + } + + val Right((_, evalCount)) = helloWorldEvaluator(task) + + val paths = Evaluator.resolveDestPaths( + helloWorldEvaluator.outPath, + task.ctx.segments + ) + val log = read(paths.log) + assert( + evalCount > 0, + log.contains("node"), + log.contains("Scala.js") + ) + } + + 'runMain - { + val mainClass = Some("Main") + 'run_2118_0622 - checkRun("2.11.8", "0.6.22", mainClass) + 'run_2124_0622 - checkRun("2.12.4", "0.6.22", mainClass) + 'run_2118_100M2 - checkRun("2.11.8", "1.0.0-M2", mainClass) + 'run_2124_100M2 - checkRun("2.12.4", "1.0.0-M2", mainClass) + + 'wrongMain - { + val wrongMainClass = "Foo" + val task = HelloJSWorld.helloJsWorld("2.12.4", "0.6.22").runMain(wrongMainClass) + + val Left(Result.Exception(ex, _)) = helloWorldEvaluator(task) + + assert( + ex.isInstanceOf[Exception] + ) + } + } + 'run - { + 'run_2118_0622 - checkRun("2.11.8", "0.6.22") + 'run_2124_0622 - checkRun("2.12.4", "0.6.22") + 'run_2118_100M2 - checkRun("2.11.8", "1.0.0-M2") + 'run_2124_100M2 - checkRun("2.12.4", "1.0.0-M2") + } } def compileClassfiles(parentDir: Path) = Set( |