是否有任何方法可以编写类似"单元测试"的东西来确保某些代码无法编译?
我为什么要这样的东西?两个原因.
1)检查我的API的类型安全性.我想要一种方法来确保是否有人传入错误值,您会收到编译器错误,而不仅仅是运行时错误.显然,我可以运行编译器并检查错误,但在单元测试中将其正式化有利于避免回归和文档.
例如,考虑这个测试.有一些注释掉的代码我用来检查类型安全:https: //github.com/squito/boxwood/blob/master/core/src/test/scala/com/quantifind/boxwood/EnumUnionTest.scala# L42 (第42和48行 - 第34行我调用了一个不同的API,它有一个运行时异常,我可以检查)
实际上我需要一段时间才能获得类型安全权,所以这些都是重要的检查.现在,如果我去修改底层实现,我不能只运行我的测试套件 - 我还必须记住取消注释这些行并检查编译器错误.
2)测试宏的错误处理.如果宏有一些错误的输入,它应该导致编译器错误.同样的问题,同样希望在易于运行的测试套件中使用它.
我使用ScalaTest,但我很高兴在这里找到任何单元测试框架的解决方案.
我想在Scala中以递归方式反转列表列表.
我在Python中编写了深度列表反转,如下所示:
def deepReverse(items):
if type(items) == list:
return [deepReverse(item) for item in reversed(items)]
else:
return items
Run Code Online (Sandbox Code Playgroud)
我如何在Scala中完成相同的操作?问题不在于算法 - 它是类型的东西,我是新的.
我需要函数将[T]或List [List [T]]的列表,或T的列表和Ts列表,任意深度.我尝试根据我在其他地方看到的一个例子来创建一个案例类.我不想要一个只返回Any并接受Any的函数; 感觉像是作弊.
case class NL[+T](val v : Either[List[NL[T]],T])
Run Code Online (Sandbox Code Playgroud)
尽管如此,我还是无法让我的类型得到平衡.我是Scala的新手,但我认为这是一个混乱递归和打字的绝佳机会.
在scala宏上执行测试的建议方法是什么?
我意识到由于需要单独编译,需要两个项目.如有必要,此步骤可以接受并且大部分都是清楚的.
但是,如何断言宏扩展失败呢?如果没有一些特殊功能,测试用例将无法编译,因此整个测试项目将无法编译.
我认为这个断言需要另一个形式的宏
errors(code: => _): List[CompileError]
Run Code Online (Sandbox Code Playgroud)
它返回内部宏的编译错误.如果他们应该发出警告,那么测试警告也是必需的......等等......
Scala宏是否有一些现有的测试工具?
测试运行时行为已有很好的文档记录,但随着强大的类型系统和宏系统的出现,人们可能会对测试编译时行为感兴趣.
例如,在编写提供编译时保证的库时.假设我正在构建一组测试匹配器,并且我想确保匹配器类型安全,就像我声称的那样.
List(1,2) must beEqualTo(Set(1,2)) // should fail at compile-time
Run Code Online (Sandbox Code Playgroud)
我可以在scala编译器项目中看到,大多数测试都是功能测试,其中编译器输出通过将其与参考文件进行比较来断言.这样的测试是否有约定?一个SBT插件?
谢谢