15

I'm trying to generate random data with Scalacheck. I have a hierarchy of case classes with many properties. The only way I've found so far to populate the case classes is like this :

case class Data(a: String,
                b: String,
                c: String)

val genLigneDecompte: Gen[Data] = for {
  ag <- Gen.alphaStr
  bg <- Gen.alphaStr
  cg <- Gen.alphaStr
} yield Data(
    a = ag,
    b = bg,
    c = cg
  )

For a case class with 10-20 properties it's pretty tedious. I was wondering if there was a way to automate it somehow...

KaC
  • 501
  • 5
  • 13

3 Answers3

15

I am sure somebody will come up with a solution that abstracts over arity using shapeless. But there are some helper methods to generate Gen[T] instances from functions of varying arity, which can be used with the apply method of the case class companion object

case class Data(a: String, b: String, c: String)

val dataArb = Arbitrary(Gen.resultOf(Data))
// equivalent to
// val f: (String, String, String) => Data = Data.apply
// val gen: Gen[Data] = Gen.resultOf(f)
// val arb: Arbitrary[Data] = Arbitrary(gen)
Rüdiger Klaehn
  • 11,945
  • 2
  • 36
  • 55
  • Thanks, that's what I was looking for! – KaC Oct 27 '15 at 17:27
  • There is, as in the answer https://stackoverflow.com/a/33375918/333643 (https://github.com/alexarchambault/scalacheck-shapeless) – nafg Jul 15 '19 at 08:13
11

There is a shapeless based Scalacheck library https://github.com/alexarchambault/scalacheck-shapeless what you might be looking for

Vikas Pandya
  • 1,908
  • 14
  • 28
4

Another approach would be DanielaSfregola/random-data-generator, A library to generate random data for test purposes, using ScalaCheck and scalacheck-shapeless.

For Scala 2.11.8 or more, it can generate for you the initialization sequence for a case class with many field.

VonC
  • 1,042,979
  • 435
  • 3,649
  • 4,283