9

私は一連の Parsec パーサーのテストを書きたいと思っています。QuickCheck でテストしたいパーサーの簡単な例を次に示します。

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

したがって、理想的には、QuickCheck が有効な識別子を生成し、正しい結果が返されるようにし、無効な識別子を生成してParseError. この種のことを簡単にするユーティリティはありますか? そのような入力を生成するために、いわば「パーサーを逆に実行する」方法はありますか?

一般に、このパーサーの QuickCheck テストの適切なスイートはどのようなものでしょうか? ある程度、徹底的なテストを行うには、QuickCheck のパーサーのロジックを基本的に複製する必要があるように思えます。それは本当に良い考えですか、それとも、これはおそらく HUnit のような従来のツールが QuickCheck よりも適している状況ですか?

4

1 に答える 1

13

一般に、パーサーの逆はプリティ プリンターであり、パーサーへのランダム入力の逆は、AST のランダム プリティ プリントです。

したがって、通常のアプローチに従って、ランダムな整形式の構文フラグメントを駆動する AST の Arbitrary インスタンスを定義します。エラー処理をテストするために、いくつかのエラー文字をラッパーとして混ぜます。

以下も参照してください。

于 2012-06-12T16:12:13.170 に答える