Gen.sequence игнорирует размер заданного Traversable - PullRequest
2 голосов
/ 29 июня 2019

Gen.sequence, кажется, игнорирует размер заданного Traversable. Это по замыслу? Я использую версию 1.14.0 с Scala 2.13. Следующий генератор

Gen.sequence[List[Int], Int](List.fill(3)(Gen.const(5)))

иногда генерирует список размера 1. Чего мне не хватает?

Образец теста

import org.scalacheck.Gen
import org.scalatest.concurrent.ScalaFutures
import org.scalatest.{Assertions, FlatSpec, Inside, Inspectors, Matchers, OptionValues}
import org.scalatestplus.scalacheck.ScalaCheckPropertyChecks

class RuleSpec extends FlatSpec with Matchers with Assertions with OptionValues with Inside with Inspectors with ScalaFutures with ScalaCheckPropertyChecks {

  val filterGen = Gen.listOfN(3, Gen.const(5))
  val inputGen = Gen.pick(10, 5 to 15).map(_.toList).filter(_.nonEmpty)

  "A HasAny rule with partially matching filter" should "validate input" in {
    forAll(filterGen, inputGen) { case (filter, input) =>
      val result = HasAny(filter: _*).valid(input)
      println(s"$result: $filter   ${input}\n")
      result should be(true)
    }
  }
}

1 Ответ

2 голосов
/ 01 июля 2019

Это может быть связано с Минимизация тестового набора

Одна интересная особенность ScalaCheck в том, что если он находит аргумент который фальсифицирует свойство, он пытается минимизировать этот аргумент, прежде чем сообщается. Это делается автоматически при использовании Prop.property и Prop.forAll методы для создания свойств, но не если вы используете Prop.forAllNoShrink.

Поэтому попробуйте использовать Prop.forAllNoShrink примерно так

Prop.forAllNoShrink(filterGen, inputGen) { case (filter, input) => ...

Если вы используете ScalaTest forAll, попробуйте предложение в Добавьте поддержку не сжимающихся значений в GeneratorDrivenPropertyChecks # 584 , создав следующую черту

trait NoShrink {
  implicit def noShrink[A]: Shrink[A] = Shrink(_ => Stream.empty)
}

и смешайте в спецификации вот так

class RuleSpec extends FlatSpec ... with ScalaCheckPropertyChecks with NoShrink {
  ...
    forAll(filterGen, inputGen) { case (filter, input) => ...
...