解码scalacheck和scalatest代码

时间:2014-10-02 15:20:54

标签: scala scala-2.10

我试图破译这实际意味着什么

check { (n: Int) =>
  n > 1 ==> n / 2 > 0
}

来自http://www.scalatest.org/user_guide/writing_scalacheck_style_properties

我首先想破译那个身体是否

((n: Int) => n > 1) ==> n/2 > 0

or

(n: Int) => (n > 1 ==> n/2 > 0)

它会是哪一个?我猜测后者,因为检查方法通过方法'==>'获取函数可能也会返回一个函数?

接下来,我查看https://searchcode.com/codesearch/view/12336175/

处的检查方法签名
def check[A1,P](f: A1 => P)
  (implicit
     p: P => Prop,
     a1: Arbitrary[A1], s1: Shrink[A1]
  ) {
    check(Prop.property(f)(p, a1, s1))
}

我相信A1会是Int,除非==>返回一个函数并更改返回类型(虽然我认为有点可疑)。我不知道如何找到隐函数P => scalacheck库中的Prop。

我注意到有一个ExtendedBoolean,它有一个函数==> https://github.com/rickynils/scalacheck/blob/master/src/main/scala/org/scalacheck/Prop.scala

或许(n> 1)被转换为ExtendedBoolean,假设函数是(n:Int)=> (n> 1 ==> n / 2> 0)然后我们得到

ExtendedBoolean( n > 1 ).==>( n / 2 > 0 ) is called then.

自执行==>对于ExtendedBoolean是Prop(b)==> p,我最终得到了

Prop( n > 1 ) ==> (n / 2 > 0)

我真的很困惑,因为在名字调用中,通常会捕获值,除非此时没有n值,因为它最初是一个函数。忽略了我的困惑一秒钟,执行==>因此,支柱是

def ==>(p: => Prop): Prop = flatMap { r1 =>
  if(r1.proved) p map { r2 => mergeRes(r1,r2,r2.status) }
  else if(!r1.success) Prop(r1.copy(status = Undecided))
  else p map { r2 => provedToTrue(mergeRes(r1,r2,r2.status)) }
}

所以,我们这样称呼这个,所以我想另一个隐含版本来支持这里

Prop( n > 1 ) ==> Prop(n / 2 > 0)

好的,flatmap是

Prop(prms => f(this(prms))(prms))
嗯,肯定有另一次转换为Prop。我开始追踪prms然后看看对象的Prop apply方法是什么

def apply(b: Boolean): Prop = if(b) proved else falsified

但我无法将b解析为true或false,因为尚未评估这些函数。这一切如何协同工作?我想我在这里几乎没有遗漏一些概念。有人可以解释一下这个吗?

1 个答案:

答案 0 :(得分:0)

你的确是一个ScalaCheck问题,但避免整个问题的一种方法是使用ScalaTest的PropertyChecks语法而不是ScalaCheck(Checkers在ScalaTest中支持):

import org.scalatest.prop.Checkers._

check { (n: Int) =>
  n > 1 ==> n / 2 > 0
}

变为:

import org.scalatest.MustMatchers._
import org.scalatest.prop.PropertyChecks._

forAll { (n: Int) =>
  whenever (n > 1) {
    n / 2 must be > 0
  }
}