Testing scalacheck中正则类的生成器

Testing scalacheck中正则类的生成器,testing,scala,scalacheck,Testing,Scala,Scalacheck,在scalacheck的“生成案例类”一段中。我修改了其中的示例,使用常规类而不是case类: import org.scalacheck._ import Gen._ import Arbitrary._ sealed abstract class Tree object Leaf extends Tree class Node(left:Tree, rigth:Tree, v:Int) extends Tree object Main { val genLeaf = value(L

在scalacheck的“生成案例类”一段中。我修改了其中的示例,使用常规类而不是case类:

import org.scalacheck._
import Gen._
import Arbitrary._

sealed abstract class Tree
object Leaf extends Tree
class Node(left:Tree, rigth:Tree, v:Int) extends Tree

object Main {

  val genLeaf = value(Leaf)
  val genNode = for{
    v <- Arbitrary.arbitrary[Int]
    left <- genTree
    rigth <- genTree
  } yield new  Node(left, rigth, v)

  val genTree:Gen[Tree] = oneOf(genLeaf, genNode)


  def main(args:Array[String]){    
    println(genTree.sample)
  }
}
import org.scalacheck_
进口发电机_
任意导入_
密封抽象类树
对象叶扩展树
类节点(左:树,右:树,v:Int)扩展树
对象主体{
val genLeaf=值(叶)
val genNode=for{

v我看这里没有问题。在该示例中使用case类的原因是所示的
是一种代数数据类型,可以使用case类。对于普通类,您无法在树上进行模式匹配,事实上,如果没有decl,您甚至无法获得
v
将它们命名为
val

这应该可以很好地工作。就ScalaCheck而言,case类并没有什么特别神奇的地方。任何旧类都可以获得生成器,甚至可以转换为任意类型

就测试而言,一个区别是,您生成的每一个非案例类树都是唯一的,因此对于您生成的任何两个树,都不会有tree1==tree2。这与案例类的情况不同,案例类基于值而不是身份来测试相等性。您可能需要更多的测试来处理可能出现的别名问题e当您具有基于身份而非基于价值的平等性时