1

次のようなクラスがあります。

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

EpidemySimulator クラスでいくつかのプロパティを定義できるように、内部クラス Persons の Arbitrary を追加したいと考えています。コンパニオン オブジェクトは、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  
    }
}

Arbitrary[sim.Person]私の理解では、(暗黙的に提供される)特定のものを作成する暗黙的な関数を提供した場合、のsim:EpidemySimulatorようにプロパティを作成できるはず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) )
    }
}
4

1 に答える 1

1

問題は次のとおりだと思います。EpidemySimulator を指定して、任意の EpidemySimulator#Person を生成するための暗黙的なものを提供しました。

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 }
于 2013-12-24T09:16:10.357 に答える