Я хотел бы написать тесты для набора парсеров Parsec. Вот простой пример парсера, который я хочу протестировать с помощью QuickCheck:
identifier = do
c <- letter
cs <- many (alphaNum <|> oneOf identSymbols)
skipSpaces
return $ Ident $ c:cs
Итак, в идеале я бы хотел, чтобы QuickCheck генерировал действительные идентификаторы и гарантировал, что я получаю правильные результаты, а также генерировал недопустимые идентификаторы и удостоверялся, что они возвращают ParseError
. Есть ли какие-нибудь утилиты, которые упростили бы подобные вещи? Есть ли способ, которым я могу, так сказать, «запустить свой синтаксический анализатор в обратном порядке», чтобы генерировать такие входные данные?
В общем, как должен выглядеть хороший набор тестов QuickCheck для этого парсера? В какой-то степени кажется, что мне придется дублировать логику парсера в QuickCheck, чтобы провести тщательный тест. Это действительно хорошая идея, или, возможно, это ситуация, когда более традиционный инструмент, такой как HUnit, больше подходит, чем QuickCheck?