2013-12-24 5 views
1

У меня есть класс, который выглядит следующим образом:Создания произвольного класса

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

Я хочу добавить Произвольный внутренний класс лиц, так что я могу определить некоторые свойства класса 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 
    } 
} 

Мое понимание было то, что, если я предоставил неявную функцию, которая создает 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)) 
    } 
} 

ответ

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 доступной, поэтому выше неявной для человека, не может быть использован. Создание сима неявных или определение локального неявного типа epidemySimulator должен устранить проблему

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

Учитывая, что вы, вероятно, хотите, чтобы проверить различные свойства EpidemySimulator, это, вероятно, хорошая идея, чтобы определить неявный epidemySimulator Вэла где в вашем объекте.

Обратите внимание, что я только проверил это с консольной сессии 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 } 
+0

Большое спасибо ... я понимаю, что я сделал не так ... –

Смежные вопросы