【问题标题】:Creating an Arbitrary of a class创建一个任意类
【发布时间】:2013-12-24 18:50:15
【问题描述】:

我有一个如下所示的课程:

class EpidemySimulator extends Simulator {
   ...
   class Person{
   // Implementation
   }
}

我想添加一个内部类 Persons 的 Arbitrary,以便我可以在 EpidemySimulator 类上定义一些属性。我认为伴随对象可以定义必要的隐式生成器,以便定义将生成 Person 类型对象的属性。

object EpidemySimulator
{
    implicit def arbPerson(implicit sim: EpidemySimulator ) = 
    Arbitrary(for(n <- Gen.choose(1, roomRows * roomColumns))yield{ new sim.Person(n) })

    def propertyOne(sim: EpidemySimulator ) = forAll { person: sim.Person =>
         person.row > 0 && person.row < roomRows && person.col > 0 && person.col < roomColumns  
    }
}

我的理解是,如果我在给定特定sim:EpidemySimulator(隐式提供)的情况下提供创建Arbitrary[sim.Person] 的隐式函数,那么我应该能够像propertyOne 那样创建一个属性。但是我在属性上得到一个编译器错误,上面写着

Multiple markers at this line
- identifier expected but ';' found.
- not enough arguments for method forAll: (implicit p: Boolean => org.scalacheck.Prop, implicit a1: org.scalacheck.Arbitrary[sim.Person], 
 implicit s1: org.scalacheck.Shrink[sim.Person], implicit pp1: sim.Person => org.scalacheck.Pretty)org.scalacheck.Prop. Unspecified value parameters 
 a1, s1, pp1.
- could not find implicit value for parameter a1: org.scalacheck.Arbitrary[sim.Person]
- type <error> is not a member of simulations.EpidemySimulator

任何想法我做错了什么。我希望能够最终:

class EpidemySuite extends FunSuite with Checkers {
    test("EpidemySimulator fulfills property one"){
        val es = new EpidemySimulator
        check( EpidemySimulator.propertyOne(sim) )
    }
}

【问题讨论】:

    标签: scala implicit scalacheck


    【解决方案1】:

    我认为问题如下:您提供了一个隐式来生成任意 EpidemySimulator#Person 给定 EpidemySimulator。

    implicit def arbPerson(implicit sim: EpidemySimulator ) = 
    Arbitrary(for(n <- Gen.choose(1, roomRows * roomColumns))yield{ new sim.Person(n) })
    

    但是在对 EpidemySimulator 的测试中,没有可用的 EpidemySimulator 类型的隐式值,因此不能使用上述对人的隐式值。使 sim 隐式或定义类型为 epidemySimulator 的本地隐式应该可以解决问题

    def propertyOne(implicit sim: EpidemySimulator ) = forAll { person: sim.Person =>
         person.row > 0 && person.row < roomRows && person.col > 0 && person.col < roomColumns  
    }
    

    鉴于您可能想要测试 EpidemySimulator 的各种属性,最好在对象的某处定义一个隐式 epidemySimulator val。

    请注意,我只使用这样的 scala 控制台会话检查了这些:

    import org.scalacheck._
    import org.scalacheck.Prop.forAll
    
    // define a class with an inner class
    class A { class B }
    // define an implicit that provides a A#B given an A
    implicit def arbAB(implicit a:A) : Arbitrary[a.B] = Arbitrary[a.B] { new a.B }
    // the non-working code
    def test(a:A) = forAll { x:a.B => true }
    <console>:25: error: could not find implicit value for parameter a1: org.scalacheck.Arbitrary[a.B]
       def test(a:A) = forAll { x:a.B => true }
                              ^ 
    // making a an implicit works
    def test(implicit a:A) = forAll { x:a.B => true }
    

    【讨论】:

      猜你喜欢
      • 2017-09-07
      • 1970-01-01
      • 2022-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-29
      相关资源
      最近更新 更多