2017-02-01 7 views
1

Мне нужно создать список объектов. Каждый объект должен содержать предопределенное значение и сгенерированное значение. Я создал генератор, но не уверен, что это истинный способ. Есть ли способы сделать его более читаемым?Генератор списков Scalacheck с сгенерированными объектами

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

Как Арсений заметил: если у вас есть тип А, это идиоматическое иметь генератор специально для этого типа. – ppopoff

ответ

2

Во-первых, мы могли бы реализовать генератор для одного экземпляра:

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

А потом - создать список этих объектов:

val listOfAGen = Gen.listOf(aGen) 

Это будет работать, если вы не заботятся о уникальности myInt s.

+0

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

0

Подход с использованием .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

Можно использовать образец, если вы уверены, что он вернет непустой генератор. – ppopoff

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

  • Нет связанных вопросов^_^