Как убедиться, что alphaStr не генерирует пустые строки?

Я использую генератор ScalaCheck alphaStr для генерации строк, но они всегда возвращаются пустыми. Например. следующий тест не проходит на первой строке.

class GenSpec extends FunSuite with GeneratorDrivenPropertyChecks with Matchers {
  implicit val noShrink: Shrink[List[Char]] = Shrink.shrinkAny
  test("alphaStr") {
    forAll(Gen.alphaStr) { case str =>
      println(str)
      str.isEmpty shouldBe false
    }
  }
}

Выход:

TestFailedException was thrown during property evaluation.
  Message: true was not equal to false
  Location: (GenSpec.scala:12)
  Occurred when passed generated values (
    arg0 = ""
  )
ScalaTestFailureLocation: org.scalatest.prop.GeneratorDrivenPropertyChecks$class at (GeneratorDrivenPropertyChecks.scala:914)
org.scalatest.exceptions.GeneratorDrivenPropertyCheckFailedException: TestFailedException was thrown during property evaluation.
  Message: true was not equal to false
  Location: (GenSpec.scala:12)
  Occurred when passed generated values (
    arg0 = ""
  )

Я добавил noShrink, чтобы убедиться, что базовый список символов не сокращается. Но все равно не получается. Кто-нибудь знает, почему?


person Saket    schedule 25.08.2016    source источник


Ответы (2)


Не уверен, что в этом случае сжатие сработает, и alphaStr не касается пустых значений, но в качестве альтернативы вы можете использовать filter и длину строки:

Gen.alphaStr.filter(_.trim.length > 0)
person Ende Neu    schedule 25.08.2016
comment
Альтернативой является Gen.alphaStr.suchThat(_.nonEmpty), но мне было интересно, почему он генерирует пустую строку в качестве первого значения. - person Saket; 25.08.2016

Gen.alphaStr.suchThat(_.nonEmpty) отлично работает, но иногда его sample может генерировать None (действительно, когда исходный генератор alphaStr был пустой строкой). Иногда это нежелательно.

Альтернативой является объединение результатов Gen.alphaChar и Gen.alphaStr, например:

Gen.zip(Gen.alphaChar, Gen.alphaStr).map(t => t._1 + t._2)
person juanmirocks    schedule 25.02.2021