Проверка ForAll в scala пропускает часть ввода и не учитывает размер контейнеров

Я новичок в проверке scala и хочу протестировать следующую часть своего приложения. Я хочу сгенерировать 30 и 20 случайных событий и проверить, правильно ли мой код приложения вычисляет результат.

// generate 30 random events
val eventGenerator: Gen[Event] = for {
  d <- Gen.oneOf[String](Seq("es1", "es2", "es3"))
  t <- Gen.choose[Long](minEvent.getTime, maxEvent.getTime)
  s <- Gen.oneOf[String](Seq("s1", "s2", "s3", "s4", "s5", "s6", "s7"))} yield Event(d, t, s)
val eventsGenerator: Gen[List[VpSearchLog]] = Gen.containerOfN[List, VpSearchLog](30, eventGenerator)

// generate 20 random instances
val instanceGenerator: Gen[Instance] = for {
  d <- Gen.oneOf[String](Seq("es1", "es2", "es3"))
  t <- Gen.choose[Long](minInstance.getTime, maxInstance.getTime)} yield Instance(d, new Timestamp(t))
val instancesGenerator: Gen[List[Instance]] = Gen.containerOfN[List, Instance](20, instanceGenerator)

val p: Prop = forAll(instancesGenerator, eventsGenerator) { (i, e) =>

  println(i.size)
  println(e.size)
  println()
  val instancesWithFeature = computeExpected(instance)

  isEqual(transform(instance), instanceWithFeature)
}

Почему-то я вижу это в стандартном выводе

  20
  15

  20
  7

  20
  3

  20
  1

  20
  0
  starting to compute expected:

По сути, похоже, что forAll генерирует пару входных данных определенного размера, а затем пропускает их. По какой-то причине он начинает вычислять вещи, когда один из входных данных имеет размер 0, а затем начинает правильную проверку. Мои вопросы:

  • почему, если я использую containerofN или listOfN, я не получаю точно ввод этого конкретного размера? Как я могу генерировать ввод, подобный этому?
  • нормально ли, что forAll начинает исследовать пространство возможных входных данных и пропускает некоторые из них? Я что-то упустил здесь? Такое поведение довольно нелогично для меня.

person alexlipa    schedule 30.03.2019    source источник


Ответы (1)


Возможно, вам придется использовать forAllNoShrink, чтобы избежать известного дефекта в ScalaCheck, когда сжатие не соблюдает генераторы

val thirtyInts: Gen[List[Int]] =
  Gen.listOfN[Int](30, Gen.const(99))

val twentyLongs: Gen[List[Long]] =
  Gen.listOfN[Long](20, Gen.const(44L))

property("listOfN") = {
  Prop.forAllNoShrink(thirtyInts, twentyLongs) { (ii, ll) =>
    ii.size == 30 && ll.size == 20
  }
}
person ashawley    schedule 31.03.2019