Вы, вероятно, видите это поведение из-за способа реализации listOf
.Внутри он основан на buildableOf
, который, в свою очередь, основан на buildableOfN
, который имеет следующий комментарий:
... Если данный генератор не может сгенерировать значение, полный генератор контейнера также завершится с ошибкой.
Ваша структура данных, по сути, представляет собой список списков, поэтому даже одно плохое поколение будет проклинать всю структуру данных, которая будет отброшена.И, очевидно, большинство сбоев происходит на нижнем уровне.Вот почему удаление фильтра для shadeName
помогает.Таким образом, чтобы это работало, вы должны генерировать больше допустимых строк.Вы можете изменить Gen.alphaStr
на какой-то специальный генератор на основе nonEmptyListOf
, такой как:
def nonemptyAlphaStr:Gen[String] = Gen.nonEmptyListOf(alphaChar).map(_.mkString)
Другой простой способ обойти это - использовать retryUntil
вместо suchThat
, например, в:
implicit def shadesGen: Gen[Shade] =
for {
//shadeName <- Gen.alphaStr.suchThat(_.length > 0) //**Note this**
shadeName <- Gen.alphaStr.retryUntil(_.length > 0)
value <- Gen.choose(1, Int.MaxValue)
} yield Shade(shadeName, value)