2017-02-01 2 views
1

Ich brauche eine Liste von Objekten zu generieren. Jedes Objekt muss einen vorherbestimmten Wert und einen generierten Wert enthalten. Ich habe den Generator aber nicht sicher, dass dies der wahre Weg ist. Gibt es Möglichkeiten, um es lesbarer zu machen?Scalacheck Generator der Liste mit generierten Objekten

object Test { 
     case class A(myInt: Int, randomInt: Int) 
     val list = List(1, 2, 3, 4, 5) 
     val subListGen = Gen.someOf(list) 
     val randomIntGen = Gen.choose(0,10) 
     import scala.collection.JavaConverters._ 
     val seqAGen: Gen[Seq[A]] = for { 
     subsetMyInts <- subListGen 
     seqOfRandomIntsWithSizeEqualGenSubList <- Gen.sequence(subsetMyInts.map(x => randomIntGen)) 
     } yield { 
     subsetMyInts.zip(seqOfRandomIntsWithSizeEqualGenSubList.asScala.toList).map(x => A(x._1, x._2)) 
     } 
    } 
+0

Als Arseniy bemerkt: Wenn Sie eine Art von A haben, ist es idiomatische einen Generator für diesen Typen zugeschnitten zu haben. – ppopoff

Antwort

2

Erstens könnten wir einen Generator für eine einzelne Instanz implementieren möchten:

val aGen: Gen[A] = for { 
    myInt <- Gen.oneOf(list:_*) 
    randomInt <- Gen.choose(0, 10) 
} yield A(myInt, randomInt) 

Und dann - eine Liste dieser Objekte erzeugen:

val listOfAGen = Gen.listOf(aGen) 

Dies wird, wenn Sie arbeiten nicht die Einzigartigkeit von myInt s interessieren.

+0

val listOfAGen = Gen.listOfN (liste.size * 2, aGen) .map (_. GroupBy (_. MyInt) .flatMap (x => x._2.headOption)) – Ivan

0

Der Ansatz bei der Verwendung von .sample

object Test { 
    case class A(myInt: Int, randomInt: Int) 
    val list = List(1, 2, 3, 4, 5) 
    val randomIntGen = Gen.choose(0,10) 
    val seqAGen: Gen[Seq[A]] = Gen.someOf(list.flatMap(myInt => randomIntGen.sample.map(A(myInt, _)))) 
} 
+0

Es ist in Ordnung, ein Beispiel zu verwenden, wenn Sie sicher sind es wird einen nicht leeren Generator zurückgeben. – ppopoff

Verwandte Themen