summaryrefslogtreecommitdiff
path: root/scalajslib/test
diff options
context:
space:
mode:
authorLi Haoyi <haoyi.sg@gmail.com>2018-01-20 03:49:17 -0800
committerLi Haoyi <haoyi.sg@gmail.com>2018-01-20 03:49:17 -0800
commitd14f56a3fd881f809e58783c49866d1491a5f3fe (patch)
tree4a9f93d3d7f69211aa444ce15837fe6e79b9db7f /scalajslib/test
parentaebd7a144fab5bdb95f6ee4f4bc170be65cd0549 (diff)
downloadmill-d14f56a3fd881f809e58783c49866d1491a5f3fe.tar.gz
mill-d14f56a3fd881f809e58783c49866d1491a5f3fe.tar.bz2
mill-d14f56a3fd881f809e58783c49866d1491a5f3fe.zip
Swap over to simplified Mill module/source layout from SBT's
Removes a lot of useless folders and gives us a chance to exercise this simplified layout. Support for the SBT layout is still verified by our integration tests
Diffstat (limited to 'scalajslib/test')
-rw-r--r--scalajslib/test/resources/hello-js-world/src/Main.scala3
-rw-r--r--scalajslib/test/src/mill/scalajslib/HelloJSWorldTests.scala164
2 files changed, 167 insertions, 0 deletions
diff --git a/scalajslib/test/resources/hello-js-world/src/Main.scala b/scalajslib/test/resources/hello-js-world/src/Main.scala
new file mode 100644
index 00000000..60cef56d
--- /dev/null
+++ b/scalajslib/test/resources/hello-js-world/src/Main.scala
@@ -0,0 +1,3 @@
+object Main extends App {
+ println("Hello " + sys.props("java.vm.name"))
+}
diff --git a/scalajslib/test/src/mill/scalajslib/HelloJSWorldTests.scala b/scalajslib/test/src/mill/scalajslib/HelloJSWorldTests.scala
new file mode 100644
index 00000000..4f655912
--- /dev/null
+++ b/scalajslib/test/src/mill/scalajslib/HelloJSWorldTests.scala
@@ -0,0 +1,164 @@
+package mill.scalajslib
+
+import java.io.{FileReader, StringWriter}
+import java.util.jar.JarFile
+import javax.script.{ScriptContext, ScriptEngineManager}
+
+import ammonite.ops._
+import mill._
+import mill.scalalib.PublishModule
+import mill.scalalib.publish.{Developer, License, PomSettings, SCM}
+import mill.util.{TestEvaluator, TestUtil}
+import utest._
+
+import scala.collection.JavaConverters._
+
+
+object HelloJSWorldTests extends TestSuite {
+
+
+ trait HelloJSWorldModule extends ScalaJSModule with PublishModule {
+ override def basePath = HelloJSWorldTests.workspacePath
+ override def mainClass = Some("Main")
+ }
+
+ object HelloJSWorld extends TestUtil.BaseModule {
+ val matrix = for {
+ scala <- Seq("2.11.8", "2.12.3", "2.12.4")
+ scalaJS <- Seq("0.6.20", "0.6.21", "1.0.0-M2")
+ } yield (scala, scalaJS)
+
+ object build extends Cross[BuildModule](matrix:_*)
+
+ class BuildModule(scalaVersion0: String, sjsVersion0: String) extends HelloJSWorldModule {
+ def scalaVersion = scalaVersion0
+ def scalaJSVersion = sjsVersion0
+ def pomSettings = PomSettings(
+ organization = "com.lihaoyi",
+ description = "hello js world ready for real world publishing",
+ url = "https://github.com/lihaoyi/hello-world-publish",
+ licenses = Seq(
+ License("Apache License, Version 2.0",
+ "http://www.apache.org/licenses/LICENSE-2.0")),
+ scm = SCM(
+ "https://github.com/lihaoyi/hello-world-publish",
+ "scm:git:https://github.com/lihaoyi/hello-world-publish"
+ ),
+ developers =
+ Seq(Developer("lihaoyi", "Li Haoyi", "https://github.com/lihaoyi"))
+ )
+ }
+ }
+
+ val srcPath = pwd / 'scalajslib / 'test / 'resources / "hello-js-world"
+ val workspacePath = pwd / 'target / 'workspace / "hello-js-world"
+ val outputPath = workspacePath / 'out
+ val mainObject = workspacePath / 'src / "Main.scala"
+
+ val helloWorldEvaluator = new TestEvaluator(
+ HelloJSWorld,
+ workspacePath,
+ srcPath
+ )
+
+ class Console {
+ val out = new StringWriter()
+ def log(s: String): Unit = out.append(s)
+ }
+
+ def runJS(path: Path): String = {
+ val engineManager = new ScriptEngineManager
+ val engine = engineManager.getEngineByName("nashorn")
+ val console = new Console
+ engine.getBindings(ScriptContext.ENGINE_SCOPE).put("console", console)
+ engine.eval(new FileReader(path.toIO))
+ console.out.toString
+ }
+
+ def tests: Tests = Tests {
+ prepareWorkspace()
+ 'compile - {
+ def testCompileFromScratch(scalaVersion: String,
+ scalaJSVersion: String): Unit = {
+ val Right((result, evalCount)) =
+ helloWorldEvaluator(HelloJSWorld.build(scalaVersion, scalaJSVersion).compile)
+
+ val outPath = result.classes.path
+ val outputFiles = ls.rec(outPath)
+ val expectedClassfiles = compileClassfiles(outPath)
+ assert(
+ outputFiles.toSet == expectedClassfiles,
+ evalCount > 0
+ )
+
+ // don't recompile if nothing changed
+ val Right((_, unchangedEvalCount)) =
+ helloWorldEvaluator(HelloJSWorld.build(scalaVersion, scalaJSVersion).compile)
+ assert(unchangedEvalCount == 0)
+ }
+
+ 'fromScratch_2124_0621 - testCompileFromScratch("2.12.4", "0.6.21")
+ 'fromScratch_2123_0621 - testCompileFromScratch("2.12.3", "0.6.21")
+ 'fromScratch_2118_0621 - testCompileFromScratch("2.11.8", "0.6.21")
+ 'fromScratch_2124_100M2 - testCompileFromScratch("2.11.8", "1.0.0-M2")
+ }
+
+ def testRun(scalaVersion: String,
+ scalaJSVersion: String,
+ mode: OptimizeMode): Unit = {
+ val task = mode match {
+ case FullOpt => HelloJSWorld.build(scalaVersion, scalaJSVersion).fullOpt
+ case FastOpt => HelloJSWorld.build(scalaVersion, scalaJSVersion).fastOpt
+ }
+ val Right((result, evalCount)) = helloWorldEvaluator(task)
+ val output = runJS(result.path)
+ assert(output == "Hello Scala.js")
+ }
+
+ 'fullOpt - {
+ 'run_2124_0621 - testRun("2.12.4", "0.6.21", FullOpt)
+ 'run_2123_0621 - testRun("2.12.3", "0.6.21", FullOpt)
+ 'run_2118_0621 - testRun("2.11.8", "0.6.21", FullOpt)
+ 'run_2124_100M2 - testRun("2.11.8", "1.0.0-M2", FullOpt)
+ }
+ 'fastOpt - {
+ 'run_2124_0621 - testRun("2.12.4", "0.6.21", FastOpt)
+ 'run_2123_0621 - testRun("2.12.3", "0.6.21", FastOpt)
+ 'run_2118_0621 - testRun("2.11.8", "0.6.21", FastOpt)
+ 'run_2124_100M2 - testRun("2.11.8", "1.0.0-M2", FastOpt)
+ }
+ 'jar - {
+ 'containsSJSIRs - {
+ val Right((result, evalCount)) = helloWorldEvaluator(HelloJSWorld.build("2.12.4", "0.6.21").jar)
+ val jar = result.path
+ val entries = new JarFile(jar.toIO).entries().asScala.map(_.getName)
+ assert(entries.contains("Main$.sjsir"))
+ }
+ }
+ 'publish - {
+ def testArtifactId(scalaVersion: String,
+ scalaJSVersion: String,
+ artifactId: String): Unit = {
+ val Right((result, evalCount)) = helloWorldEvaluator(HelloJSWorld.build(scalaVersion, scalaJSVersion).artifact)
+ assert(result.id == artifactId)
+ }
+ 'artifactId_0621 - testArtifactId("2.12.4", "0.6.21", "hello-js-world_sjs0.6_2.12")
+ 'artifactId_0621 - testArtifactId("2.12.4", "1.0.0-M2", "hello-js-world_sjs1.0.0-M2_2.12")
+ }
+ }
+
+ def compileClassfiles(parentDir: Path) = Set(
+ parentDir / "Main.class",
+ parentDir / "Main$.class",
+ parentDir / "Main$delayedInit$body.class",
+ parentDir / "Main$.sjsir",
+ parentDir / "Main$delayedInit$body.sjsir"
+ )
+
+ def prepareWorkspace(): Unit = {
+ rm(workspacePath)
+ mkdir(workspacePath / up)
+ cp(srcPath, workspacePath)
+ }
+
+}