summaryrefslogtreecommitdiff
path: root/examples/scala-js/sbt-plugin/src/test/scala/scala
diff options
context:
space:
mode:
Diffstat (limited to 'examples/scala-js/sbt-plugin/src/test/scala/scala')
-rw-r--r--examples/scala-js/sbt-plugin/src/test/scala/scala/scalajs/sbtplugin/test/env/AsyncTests.scala37
-rw-r--r--examples/scala-js/sbt-plugin/src/test/scala/scala/scalajs/sbtplugin/test/env/ComTests.scala206
-rw-r--r--examples/scala-js/sbt-plugin/src/test/scala/scala/scalajs/sbtplugin/test/env/JSEnvTest.scala44
-rw-r--r--examples/scala-js/sbt-plugin/src/test/scala/scala/scalajs/sbtplugin/test/env/NodeJSTest.scala54
-rw-r--r--examples/scala-js/sbt-plugin/src/test/scala/scala/scalajs/sbtplugin/test/env/PhantomJSTest.scala21
-rw-r--r--examples/scala-js/sbt-plugin/src/test/scala/scala/scalajs/sbtplugin/test/env/RhinoJSEnvTest.scala9
-rw-r--r--examples/scala-js/sbt-plugin/src/test/scala/scala/scalajs/sbtplugin/test/env/StoreJSConsole.scala14
-rw-r--r--examples/scala-js/sbt-plugin/src/test/scala/scala/scalajs/sbtplugin/test/env/StoreLogger.scala29
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
+
+}