首页 > 解决方案 > 如何在 ScalaCheck 中表达“暗示”,例如“如果整数 n * n = 0 则 n = 0”?

问题描述

我想用Scala的基于属性的测试工具ScalaCheck来表达一个属性

if an integer n * n = 0 then n = 0 

如何在 ScalaCheck 中编写此属性?例如我知道

val myprop = forAll {(n: Int) => n + 1 - 1 = n}

但我不知道如何在 ScalaCheck 中表达“A 暗示 B”(没有将其简化为 Not-A 或 B,这看起来很笨拙)。

标签: scalasyntaxscalacheck

解决方案


使用==>(隐含运算符)

val prop = forAll { n: Int =>
  (n * n == 0) ==> n == 0
}

(请参阅他们的用户指南)问题是:在这个特定示例中,条件很难满足,因此 ScalaCheck 将在多次尝试后放弃(但至少它确实告诉您,否则您会得到误报,因为您的必要条件是从未检查过)。在这种情况下,您可以提供一个自定义生成器,以便它生成满足您条件的值。


推荐阅读