diff options
author | Li Haoyi <haoyi.sg@gmail.com> | 2018-01-20 03:49:17 -0800 |
---|---|---|
committer | Li Haoyi <haoyi.sg@gmail.com> | 2018-01-20 03:49:17 -0800 |
commit | d14f56a3fd881f809e58783c49866d1491a5f3fe (patch) | |
tree | 4a9f93d3d7f69211aa444ce15837fe6e79b9db7f /scalajslib/test | |
parent | aebd7a144fab5bdb95f6ee4f4bc170be65cd0549 (diff) | |
download | mill-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.scala | 3 | ||||
-rw-r--r-- | scalajslib/test/src/mill/scalajslib/HelloJSWorldTests.scala | 164 |
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) + } + +} |