Тестирование парсеров Parsec путем генерации входных данных с помощью QuickCheck

Я хочу написать тесты для набора парсеров Parsec Вот простой пример синтаксического анализатора, который я хочу протестировать с помощью QuickCheck:

identifier = do
  c <- letter
  cs <- many (alphaNum <|> oneOf identSymbols)
  skipSpaces
  return $ Ident $ c:cs

Итак, в идеале я хотел бы, чтобы QuickCheck генерировал действительные идентификаторы и гарантировал, что я получаю правильные результаты, а также генерировал недопустимые идентификаторы и удостоверялся, что они возвращают ParseError. Существуют ли какие-либо утилиты, которые упростили бы подобные вещи? Есть ли способ, которым я могу, так сказать, «запустить свой синтаксический анализатор в обратном порядке», чтобы генерировать такие входные данные?

В В общем, как бы выглядел хороший набор тестов QuickCheck для этого синтаксического анализатора? В какой-то степени кажется, что мне в основном придется дублировать логику синтаксического анализатора в QuickCheck, чтобы получить тщательный тест. Это действительно хорошая идея, или это, возможно, ситуация, когда более традиционный инструмент, такой как HUnit, больше подходит, чем QuickCheck?

7
задан Don Stewart 12 June 2012 в 16:12
поделиться