Чтобы добавлять сообщения и комментарии, .

@ndtimofeev:
ndtimofeev

Можно уговорить QuickCheck генерировать один из аргументов функции-свойства не каждый тест, а раз в 10-100 циклов?

@ndtimofeev:
ndtimofeev

Написал таки тупой генератор случайных локальных изменений в случайном дереве: генерирую набор Word8, при помощи них перемещаюсь по дереву до случайного узла, а затем переписываю этот узел на случайный узел того же типа сгенерированный из пары Int'ов (из одного генерируем QCGen, из другого — size для Gen'а). До этого проделывал тоже самое при помоще unsafePerformIO $ generate arbitrary и долго удивлялся почему тесты валятся.

@ndtimofeev:
ndtimofeev

Довольно забавно, но вот такой тест:

quickCheck $ frequency [(0, pure True)]

Очень плохо воспроизводится.

@ndtimofeev:
ndtimofeev

В догонку к #2862204

isDiscard :: AnException -> Bool
(discard, isDiscard) = (E.throw (E.ErrorCall msg), isDiscard)
 where
  msg = "DISCARD. " ++
        "You should not see this exception, it is internal to QuickCheck."
  isDiscard e =
    case E.fromException e of
      Just (E.ErrorCall msg') -> msg' == msg
      _ -> False

Ну вот примерно так всё там внутри и выглядит.

@ndtimofeev:
ndtimofeev

QuickCheck инструмент невероятно полезный (чуть не сказал удобный). И тем не менее каждый раз когда я влезаю внутрь там всегда какие-то костыли, заборы, коровники... Мама, мы в аду, мама. Пробовал я как-то тестировать им робота (в основном генерировать серии беспорядочных перемещений). Мне тогда казались жутко кривыми манипуляции с заворачиванием стейта генератора случайных значений и прочими прыжками. Сейчас заглядываю в код самого QuickCheck'а, а там примерно тоже самое. Это я к чему: а пионеры не напионерили свой quickcheck с generic'ами и отсутствием совместимости с nhc?

@ndtimofeev:
ndtimofeev

А вот как бы мне нагенерить… типов. Положим у меня есть полиморфная сумма типов, полиморфное произведение типов и несколько штук листов. Всё это соединённое в произвольном порядке должно порождать некий тип удовлетворяющий определённому набору классов. Вопрос в том как бы мне случайным образом генерировать генераторы таких типов, чтобы сгенерированные ими значения пускать в тесты. Задача в том, чтобы потестировать Generic-код.

@ndtimofeev:
ndtimofeev

Я правильно понимаю, что generic arbitrary ещё не завезли в QuickCheck? Доколе? И где взять реализацию того шумно обсуждаемого алгоритма?

@segfault:
segfault

А не припомнит ли кто, как там пакет назывался с готовыми пропертями для проверки категорных законов инстансов Functor, Applicative, Monoid, Monad ?

@PineappleZombie:
PineappleZombie

Написал простенький набор тестов. Узнал много нового

@Dema:
Dema

Подскажите, не так давно видел библиотечку генератор properties для QuickCheck'а. Ей даёшь на вход функцию, она возвращает список properties. Типа даёшь f a b -> a+b, оно возвращает f a b == f b a, f 0 a == f a 0 и т.д. Вроде где-то на hackage, а найти не могу

@segfault:
segfault

github.com
такие дела

@trapdoor:
trapdoor

quickCheck (\a b c -> a + (b + c) == (a + b) + (c :: Float))

@qnikst:
qnikst

а что разве quickcheck генерирует "возрастающие" вектора если делать тест вида
quickCheck (foo :: [Int] -> Bool) ?

Если да, то это не круто как-то.

@qnikst:
qnikst

хочу сделать тест для quickchek check x = q1_rev12312 == q1_current идеи? Плагины могут помочь, это вообще реально? ну и тоже самое для criterion, но это уже не обязательно.

@segfault:
segfault

А что такое shrink в тайплассе Arbitrary ? Какая то магия с генерацией тестовых значений на основе обратной связи от теста, типа если где-то фейлится то значения в этой области значений будут генерироваться плотнее, только как он работает я не понял.

@qnikst:
qnikst

как нагенерировать байтстринги с заданными свойствами такими как длина (это в общем-то понятно) и процентное соотношение определённого символа

@qnikst:
qnikst

вот у меня возник вопрос по использованию quickcheck, как правильно строить тесты и какие тесты нужны. Например есть BinarySearchTree (собственно на этом примере и хотелось бы рассмотреть), тут явно видно инвариант в структуре, и можно его проверять после каждого изменения, но очевидно, что этого теста не достаточно.