Как мне просто сгенерировать данные с помощью fscheck?

Можно ли генерировать данные, в частности список, с помощью fscheck для использования вне fscheck? Я не могу отладить ситуацию при тестировании fscheck, когда кажется, что результаты сравнения равны, но fscheck говорит, что это не так.

У меня есть этот генератор для списка объектов. Как мне создать список, который я могу использовать из этого генератора?

let genListObj min max  = Gen.listOf Arb.generate<obj> |> Gen.suchThat (fun l -> (l.Length >= min) && (l.Length <= max))

person Jack Fox    schedule 15.10.2012    source источник
comment
Используйте Gen.eval, см. fscheck.codeplex.com/SourceControl/ набор изменений/представление/ . Однако FsCheck выводит сгенерированные данные для случая сбоя, поэтому в этом обычно нет необходимости.   -  person Mauricio Scheffer    schedule 15.10.2012
comment
Я думал, что попробовал Gen.eval. Я посмотрю еще раз. Для меня не очевидно, где fsCheck выводит эти данные в тесте свойств. Отправляю кое-что интересное в свою публичную ветку и длинное сообщение для выпуска #98 прямо сейчас.   -  person Jack Fox    schedule 16.10.2012
comment
Кстати, избегайте Gen.such That. В основном он генерирует случайные значения, пока некоторые из них не пройдут фильтр, поэтому это может занять много времени. Для вашего примера было бы лучше сначала создать случайную длину (используя, например, Gen.choose), а затем создать список этой длины (используя Gen.listOfLength).   -  person Kurt Schelfthout    schedule 16.10.2012
comment
Спасибо за совет по Gen.listOfLength. Не знаю, как я это проглядел.   -  person Jack Fox    schedule 19.10.2012
comment
Gen.eval ожидает Random.StdGen. Я хочу сгенерировать данные из сконструированного Gen I (который работает в FsCheck с помощью Arb.fromGen) и иметь доступ к фактическим данным для дальнейшей обработки.   -  person Jack Fox    schedule 19.10.2012
comment
FsCheck по умолчанию не настроен для этого, но написать функцию достаточно просто. Я думаю, что мог бы помочь вам лучше, если бы вы опубликовали фактическое свойство, с которым у вас возникли проблемы - в частности, я не понимаю, что fscheck говорит, что это не так - у fscheck нет особых идей о равенстве.   -  person Kurt Schelfthout    schedule 19.10.2012


Ответы (1)


Изменить: эта функция теперь является частью FsCheck API (Gen.sample), поэтому вам больше не нужно следующее...

Вот пример функции для генерации n образцов из заданного генератора:

let sample n gn  = 
   let rec sample i seed samples =
       if i = 0 then samples
       else sample (i-1) (Random.stdSplit seed |> snd) (Gen.eval 1000 seed gn :: samples)
   sample n (Random.newSeed()) []

Изменить: магическое число 1000 представляет собой размер сгенерированных значений. 1000 довольно большой - например. последовательности будут иметь длину от 0 до 1000 элементов, как и строки, например. Если генерация занимает много времени, вы можете настроить это значение (или взять его в качестве параметра функции).

person Kurt Schelfthout    schedule 19.10.2012
comment
Ух ты! До сих пор работает безупречно, даже на генераторе, который возвращает кортеж моей пользовательской структуры данных и список. Большое спасибо. - person Jack Fox; 19.10.2012