diff options
Diffstat (limited to 'examples/scala-js/sbt-plugin/src/test')
8 files changed, 414 insertions, 0 deletions
diff --git a/examples/scala-js/sbt-plugin/src/test/scala/scala/scalajs/sbtplugin/test/env/AsyncTests.scala b/examples/scala-js/sbt-plugin/src/test/scala/scala/scalajs/sbtplugin/test/env/AsyncTests.scala new file mode 100644 index 0000000..422c17b --- /dev/null +++ b/examples/scala-js/sbt-plugin/src/test/scala/scala/scalajs/sbtplugin/test/env/AsyncTests.scala @@ -0,0 +1,37 @@ +package scala.scalajs.sbtplugin.test.env + +import scala.scalajs.tools.env._ +import scala.scalajs.tools.io._ +import scala.scalajs.tools.classpath.PartialClasspath +import scala.scalajs.tools.logging._ + +import org.junit.Test +import org.junit.Assert._ + +import scala.concurrent.Await +import scala.concurrent.duration.Duration + +/** A couple of tests that test communication for mix-in into a test suite */ +trait AsyncTests { + + protected def newJSEnv: AsyncJSEnv + + private def emptyCP = PartialClasspath.empty.resolve() + + private def asyncRunner(code: String) = { + val codeVF = new MemVirtualJSFile("testScript.js").withContent(code) + newJSEnv.asyncRunner(emptyCP, codeVF, + new ScalaConsoleLogger(Level.Warn), ConsoleJSConsole) + } + + @Test + def futureTest = { + val runner = asyncRunner("") + val fut = runner.start() + + Await.result(fut, Duration.Inf) + + assertFalse("VM should be terminated", runner.isRunning) + } + +} diff --git a/examples/scala-js/sbt-plugin/src/test/scala/scala/scalajs/sbtplugin/test/env/ComTests.scala b/examples/scala-js/sbt-plugin/src/test/scala/scala/scalajs/sbtplugin/test/env/ComTests.scala new file mode 100644 index 0000000..c16decd --- /dev/null +++ b/examples/scala-js/sbt-plugin/src/test/scala/scala/scalajs/sbtplugin/test/env/ComTests.scala @@ -0,0 +1,206 @@ +package scala.scalajs.sbtplugin.test.env + +import scala.scalajs.tools.env._ +import scala.scalajs.tools.io._ +import scala.scalajs.tools.classpath.PartialClasspath +import scala.scalajs.tools.logging._ + +import org.junit.Test +import org.junit.Assert._ + +/** A couple of tests that test communication for mix-in into a test suite */ +trait ComTests extends AsyncTests { + + protected def newJSEnv: ComJSEnv + + private def emptyCP = PartialClasspath.empty.resolve() + + private def comRunner(code: String) = { + val codeVF = new MemVirtualJSFile("testScript.js").withContent(code) + newJSEnv.comRunner(emptyCP, codeVF, + new ScalaConsoleLogger(Level.Warn), ConsoleJSConsole) + } + + private def assertThrowClosed(msg: String, body: => Unit): Unit = { + val thrown = try { + body + false + } catch { + case _: ComJSEnv.ComClosedException => + true + } + + assertTrue(msg, thrown) + } + + @Test + def comCloseJVMTest = { + val com = comRunner(s""" + scalajsCom.init(function(msg) { scalajsCom.send("received: " + msg); }); + scalajsCom.send("Hello World"); + """) + + com.start() + + assertEquals("Hello World", com.receive()) + + for (i <- 0 to 10) { + com.send(i.toString) + assertEquals(s"received: $i", com.receive()) + } + + com.close() + com.await() + } + + def comCloseJSTestCommon(timeout: Long) = { + val com = comRunner(s""" + scalajsCom.init(function(msg) {}); + for (var i = 0; i < 10; ++i) + scalajsCom.send("msg: " + i); + scalajsCom.close(); + """) + + com.start() + + Thread.sleep(timeout) + + for (i <- 0 until 10) + assertEquals(s"msg: $i", com.receive()) + + assertThrowClosed("Expect receive to throw after closing of channel", + com.receive()) + + com.close() + com.await() + } + + @Test + def comCloseJSTest = comCloseJSTestCommon(0) + + @Test + def comCloseJSTestDelayed = comCloseJSTestCommon(1000) + + @Test + def doubleCloseTest = { + val n = 10 + val com = pingPongRunner(n) + + com.start() + + for (i <- 0 until n) { + com.send("ping") + assertEquals("pong", com.receive()) + } + + com.close() + com.await() + } + + @Test + def multiEnvTest = { + val n = 10 + val envs = List.fill(5)(pingPongRunner(10)) + + envs.foreach(_.start()) + + val ops = List[ComJSRunner => Unit]( + _.send("ping"), + com => assertEquals("pong", com.receive()) + ) + + for { + i <- 0 until n + env <- envs + op <- ops + } op(env) + + envs.foreach(_.close()) + envs.foreach(_.await()) + } + + private def pingPongRunner(count: Int) = { + comRunner(s""" + var seen = 0; + scalajsCom.init(function(msg) { + scalajsCom.send("pong"); + if (++seen >= $count) + scalajsCom.close(); + }); + """) + } + + @Test + def largeMessageTest = { + // 1KB data + val baseMsg = new String(Array.tabulate(512)(_.toChar)) + val baseLen = baseMsg.length + + // Max message size: 1KB * 2^(2*iters+1) = 1MB + val iters = 4 + + val com = comRunner(""" + scalajsCom.init(function(msg) { + scalajsCom.send(msg + msg); + }); + """) + + com.start() + + com.send(baseMsg) + + def resultFactor(iters: Int) = Math.pow(2, 2 * iters + 1).toInt + + for (i <- 0 until iters) { + val reply = com.receive() + + val factor = resultFactor(i) + + assertEquals(baseLen * factor, reply.length) + + for (j <- 0 until factor) + assertEquals(baseMsg, reply.substring(j * baseLen, (j + 1) * baseLen)) + + com.send(reply + reply) + } + + val lastLen = com.receive().length + assertEquals(baseLen * resultFactor(iters), lastLen) + + com.close() + com.await() + } + + @Test + def noInitTest = { + val com = comRunner("") + + com.start() + com.send("Dummy") + com.close() + com.await() + } + + @Test + def stopTest = { + val com = comRunner(s"""scalajsCom.init(function(msg) {});""") + + com.start() + + // Make sure the VM doesn't terminate. + Thread.sleep(1000) + + assertTrue("VM should still be running", com.isRunning) + + // Stop VM instead of closing channel + com.stop() + + try { + com.await() + fail("Stopped VM should be in failure state") + } catch { + case _: Throwable => + } + } + +} diff --git a/examples/scala-js/sbt-plugin/src/test/scala/scala/scalajs/sbtplugin/test/env/JSEnvTest.scala b/examples/scala-js/sbt-plugin/src/test/scala/scala/scalajs/sbtplugin/test/env/JSEnvTest.scala new file mode 100644 index 0000000..2a44c80 --- /dev/null +++ b/examples/scala-js/sbt-plugin/src/test/scala/scala/scalajs/sbtplugin/test/env/JSEnvTest.scala @@ -0,0 +1,44 @@ +package scala.scalajs.sbtplugin.test.env + +import scala.scalajs.tools.env.JSEnv +import scala.scalajs.tools.io.MemVirtualJSFile +import scala.scalajs.tools.classpath.PartialClasspath +import scala.scalajs.tools.logging.NullLogger +import scala.scalajs.tools.env.NullJSConsole + +import org.junit.Assert._ + +abstract class JSEnvTest { + + protected def newJSEnv: JSEnv + + implicit class RunMatcher(codeStr: String) { + + val emptyCP = PartialClasspath.empty.resolve() + val code = new MemVirtualJSFile("testScript.js").withContent(codeStr) + + def hasOutput(expectedOut: String): Unit = { + + val console = new StoreJSConsole() + val logger = new StoreLogger() + + newJSEnv.jsRunner(emptyCP, code, logger, console).run() + + val log = logger.getLog + + assertTrue("VM shouldn't produce log. Log:\n" + + log.mkString("\n"), log.isEmpty) + assertEquals("Output should match", expectedOut, console.getLog) + } + + def fails(): Unit = { + try { + newJSEnv.jsRunner(emptyCP, code, NullLogger, NullJSConsole).run() + assertTrue("Code snipped should fail", false) + } catch { + case e: Exception => + } + } + } + +} diff --git a/examples/scala-js/sbt-plugin/src/test/scala/scala/scalajs/sbtplugin/test/env/NodeJSTest.scala b/examples/scala-js/sbt-plugin/src/test/scala/scala/scalajs/sbtplugin/test/env/NodeJSTest.scala new file mode 100644 index 0000000..9a58b5c --- /dev/null +++ b/examples/scala-js/sbt-plugin/src/test/scala/scala/scalajs/sbtplugin/test/env/NodeJSTest.scala @@ -0,0 +1,54 @@ +package scala.scalajs.sbtplugin.test.env + +import scala.scalajs.sbtplugin.env.nodejs.NodeJSEnv + +import org.junit.Test + +class NodeJSTest extends JSEnvTest with ComTests { + + protected def newJSEnv = new NodeJSEnv + + /** Node.js strips double percentage signs - #500 */ + @Test + def percentageTest = { + val counts = 1 to 15 + val argcs = 1 to 3 + val strings = counts.map("%" * _) + + val strlists = for { + count <- argcs + string <- strings + } yield List.fill(count)(string) + + val codes = for { + strlist <- strlists + } yield { + val args = strlist.map(s => s""""$s"""").mkString(", ") + s"console.log($args);\n" + } + + val result = strlists.map(_.mkString(" ") + "\n").mkString("") + + codes.mkString("").hasOutput(result) + } + + /** Node.js console.log hack didn't allow to log non-Strings - #561 */ + @Test + def nonStringTest = { + + """ + console.log(1); + console.log(undefined); + console.log(null); + console.log({}); + console.log([1,2]); + """ hasOutput + """|1 + |undefined + |null + |[object Object] + |1,2 + |""".stripMargin + } + +} diff --git a/examples/scala-js/sbt-plugin/src/test/scala/scala/scalajs/sbtplugin/test/env/PhantomJSTest.scala b/examples/scala-js/sbt-plugin/src/test/scala/scala/scalajs/sbtplugin/test/env/PhantomJSTest.scala new file mode 100644 index 0000000..23e240d --- /dev/null +++ b/examples/scala-js/sbt-plugin/src/test/scala/scala/scalajs/sbtplugin/test/env/PhantomJSTest.scala @@ -0,0 +1,21 @@ +package scala.scalajs.sbtplugin.test.env + +import scala.scalajs.sbtplugin.env.phantomjs.PhantomJSEnv + +import org.junit.Test + +class PhantomJSTest extends JSEnvTest with ComTests { + + protected def newJSEnv = new PhantomJSEnv + + @Test + def failureTest = { + + """ + var a = {}; + a.foo(); + """.fails() + + } + +} diff --git a/examples/scala-js/sbt-plugin/src/test/scala/scala/scalajs/sbtplugin/test/env/RhinoJSEnvTest.scala b/examples/scala-js/sbt-plugin/src/test/scala/scala/scalajs/sbtplugin/test/env/RhinoJSEnvTest.scala new file mode 100644 index 0000000..4066c41 --- /dev/null +++ b/examples/scala-js/sbt-plugin/src/test/scala/scala/scalajs/sbtplugin/test/env/RhinoJSEnvTest.scala @@ -0,0 +1,9 @@ +package scala.scalajs.sbtplugin.test.env + +import scala.scalajs.sbtplugin.env.rhino._ + +import scala.scalajs.tools.sem._ + +class RhinoJSEnvTest extends ComTests { + protected def newJSEnv = new RhinoJSEnv(Semantics.Defaults) +} diff --git a/examples/scala-js/sbt-plugin/src/test/scala/scala/scalajs/sbtplugin/test/env/StoreJSConsole.scala b/examples/scala-js/sbt-plugin/src/test/scala/scala/scalajs/sbtplugin/test/env/StoreJSConsole.scala new file mode 100644 index 0000000..9c7a84a --- /dev/null +++ b/examples/scala-js/sbt-plugin/src/test/scala/scala/scalajs/sbtplugin/test/env/StoreJSConsole.scala @@ -0,0 +1,14 @@ +package scala.scalajs.sbtplugin.test.env + +import scala.scalajs.tools.env._ + +class StoreJSConsole extends JSConsole { + private[this] val buf = new StringBuilder() + + def log(msg: Any): Unit = { + buf.append(msg.toString) + buf.append('\n') + } + + def getLog: String = buf.toString +} diff --git a/examples/scala-js/sbt-plugin/src/test/scala/scala/scalajs/sbtplugin/test/env/StoreLogger.scala b/examples/scala-js/sbt-plugin/src/test/scala/scala/scalajs/sbtplugin/test/env/StoreLogger.scala new file mode 100644 index 0000000..985b149 --- /dev/null +++ b/examples/scala-js/sbt-plugin/src/test/scala/scala/scalajs/sbtplugin/test/env/StoreLogger.scala @@ -0,0 +1,29 @@ +package scala.scalajs.sbtplugin.test.env + +import scala.scalajs.tools.logging._ + +import scala.collection.mutable.ListBuffer + +class StoreLogger extends Logger { + import StoreLogger._ + + private[this] val buf = new ListBuffer[LogElem] + + def log(level: Level, message: => String): Unit = + buf += Log(level, message) + def success(message: => String): Unit = + buf += Success(message) + def trace(t: => Throwable): Unit = + buf += Trace(t) + + def getLog: List[LogElem] = buf.toList +} + +object StoreLogger { + + abstract class LogElem + case class Log(level: Level, message: String) extends LogElem + case class Success(message: String) extends LogElem + case class Trace(t: Throwable) extends LogElem + +} |