All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.scalajs.testinterface.internal.BridgeBase.scala Maven / Gradle / Ivy

There is a newer version: 1.0.0-M2
Show newest version
package org.scalajs.testinterface.internal

import scala.scalajs.js
import js.JSConverters._
import js.annotation.JSExport
import js.Dynamic.{literal => lit}

import scala.util.control.NonFatal
import scala.util.{Try, Success, Failure}

import sbt.testing._

abstract class BridgeBase(frameworkName: String) {

  protected[this] val framework = FrameworkLoader.loadFramework(frameworkName)

  @JSExport
  def init(): Unit = {
    Com.init(handleMsg _)
  }

  private def handleMsg(msg: String): Unit = {
    val pos = msg.indexOf(':')
    val cmd = if (pos == -1) msg else msg.substring(0, pos)

    def strArg = {
      if (pos == -1)
        throw new IllegalArgumentException(s"$cmd needs args")
      else
        msg.substring(pos + 1)
    }

    try {
      handleMsgImpl(cmd, strArg)
    } catch {
      case NonFatal(t) =>
        val data = js.JSON.stringify(ThrowableSerializer.serialize(t))
        Com.send("bad:" + data)
    }
  }

  protected def reply(result: Try[Any]): Unit = result match {
    case Success(()) =>
      Com.send("ok:")
    case Success(v) =>
      Com.send("ok:" + v)
    case Failure(e) =>
      val data = js.JSON.stringify(ThrowableSerializer.serialize(e))
      Com.send("fail:" + data)
  }

  protected def handleMsgImpl(cmd: String, strArg: => String): Unit

  protected def tasks2TaskInfos(tasks: Array[Task], runner: Runner): js.Any = {
    tasks.map { task =>
      val serTask = runner.serializeTask(task, taskDef =>
        js.JSON.stringify(TaskDefSerializer.serialize(taskDef)))

      lit(serializedTask = serTask,
          taskDef = TaskDefSerializer.serialize(task.taskDef),
          tags = task.tags.toJSArray)
    }.toJSArray
  }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy