gpt4 book ai didi

javascript - 您将如何测试 Scala.js 库的 JVM 和 JS 实现是否等效?

转载 作者:行者123 更新时间:2023-11-29 21:44:49 25 4
gpt4 key购买 nike

我正在使用 Scala.js,并编写了一个为 JVM 和 JS 实现的特征。我正在使用第三方 JVM 和 JS 库在两侧实现它,应该在 JVM 和浏览器中提供功能等效的结果。但是,我需要编写一个测试来验证这一点!

如果我只是测试两个普通的 Scala 实现,我会知道该怎么做。我会编写特征输入的生成器,并从中驱动每个函数,比较每个函数的结果。 (我可以假设函数结果是 bool 值、整数、长整数、字符串、相同的集合,或者可以是 toString()'d。)

有人在做这种测试吗?

如果一个实现是在 Javascript 中,我将如何做到这一点?幻影? (我可以将生成的 JS 文件传递​​给它,而不是简单的 JS-as-strings 吗?)还有别的吗?

最佳答案

您可以使用 Scala 的 reflective toolbox在编译时(在 JVM 上)执行测试代码的宏中。然后,您可以使用结果并生成用于比较该值的代码。

所以我们想写一个宏,给定以下代码:

FuncTest.test { (1.0).toString }

可以生成这样的东西:

assert("1.0" == (1.0).toString)

这实际上听起来比实际更难。让我们从 FuncTest 的宏框架开始:

import scala.language.experimental.macros
import scala.reflect.macros.blackbox.Context

object FuncTest {
def test[T](x: => T): Unit = macro FuncTestImpl.impl[T]
}

class FuncTestImpl(val c: Context) {
import c.universe._

def impl[T : WeakTypeTag](x: Tree): Tree = ???
}

impl 中,我们希望在 x 中运行代码,然后生成断言(或任何适合您使用的测试框架的断言):

import scala.reflect.runtime.{universe => ru}
import scala.tools.reflect.ToolBox

def impl[T : WeakTypeTag](x: Tree): Tree = {
// Make a tool box (runtime compiler and evaluater)
val mirror = ru.runtimeMirror(getClass.getClassLoader)
val toolBox = mirror.mkToolBox()

// Import trees from compile time to runtime universe
val importer = ru.mkImporter(c.universe)
val tree = toolBox.untypecheck(importer.importTree(x))

// Evaluate expression and make a literal tree
val result = toolBox.eval(tree)
val resultTree = reifyLiteral(result)

// Emit assertion
q"assert($x == $resultTree)"
}

我们唯一的问题是reifyLiteral。它基本上应该采用任意值并从中创建文字。这通常很难/不可能。但是,对于一些基本值(基元、字符串等)来说非常容易:

/** Creates a literal tree out of a value (if possible) */
private def reifyLiteral(x: Any): Tree = x match {
case x: Int => q"$x"
case x: String => q"$x"

// Example for Seq
case x: Seq[_] =>
val elems = x.map(reifyLiteral)
q"Seq(..$elems)"

case _ =>
c.abort(c.enclosingPosition, s"Cannot reify $x of type ${x.getClass}")
}

就是这样。你现在可以写:

FuncTest.test { /* your code */ }

为计算库自动生成测试。

警告 工具箱目前没有注入(inject)正确的类路径。因此,如果您使用外部库(我假设您这样做),您也需要对其进行调整。如果您需要帮助,请告诉我。

关于javascript - 您将如何测试 Scala.js 库的 JVM 和 JS 实现是否等效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31590361/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com