可以测试宏生成类型的匹配的穷举性

时间:2016-02-11 01:10:26

标签: scala specs2 shapeless

我已经编写了一个生成ADT的宏,并且希望能够编写一个测试证明我已经以允许穷举检查工作的方式完成了这项工作。两个specs2(通过typecheck)和Shapeless(通过illTyped)允许用户测试代码是否输入良好,但是这似乎无法让我在任何地方检测到非详尽的模式匹配(即使使用-Xfatal-warnings进行编译)。

有没有办法检测我在测试中可以使用的非详尽模式匹配?

1 个答案:

答案 0 :(得分:2)

据我了解,穷举检查并不是类型系统的真正特征,即如果你看一下打字规则,它不是它们的一部分,而是在经过类型检查的程序之上完成的。< / p>

我想你可以做的是使用宏来生成代码作为测试用例的一部分。在测试套装的编译过程中,您的测试将失败。或者您在测试执行期间使用编译器api编译代码。应该可以在那里得到那些警告。

我发现您可以使用工具箱API执行此操作:

import scala.reflect.runtime.currentMirror
import scala.tools.reflect.ToolBox
import scala.reflect.runtime.universe._

val code = q"""
  val s: Option[Int] = Some(1)
  s match{case Some(x)=>}
"""

val toolbox = currentMirror.mkToolBox(new tools.reflect.FrontEnd {
  override def display(info: Info) = println(info)
  override def interactive() {}
})
toolbox.eval(code)

这会打印以下警告

  

信息(NoPosition,匹配可能并非详尽无遗。   它将在以下输入上失败:无,警告)

你也可以从一些字符串中解析你想要测试编译的代码,或者将AST拼接部分构建成quasiquotes或其他适合你的东西。