2012-06-12 9 views
7

パーセルパーサーのテスト用のテストを作成したいと思います。ここで私はQuickCheckをテストしたいパーサの簡単な例です:だからQuickCheckで入力を生成してパーセルパーサーをテストする

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

は、理想的に、私はQuickCheckは、有効な識別子を生成し、私は戻って右の結果を得るだけでなく、無効な識別子を生成することを確認したいと思います彼らがParseErrorを返すことを確認してください。このようなことを楽にするユーティリティはありますか?そのような入力を生成するために、言い換えれば、私のパーサーを逆に実行する方法がありますか?

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

答えて

13

一般に、パーサの逆はかなりプリンタであり、パーサへのランダム入力の逆は、ASTの無作為な印刷です。

したがって、usual approachに従って、正常に整形された構文フラグメントを駆動するASTの任意のインスタンスを定義します。誤った文字をラッパーとしてミックスして、エラー処理をテストします。

参照:

+0

私が使いたい特定のプロパティは、parse = parseです。かなり。解析する。これは、パーサーによる情報の商のモデル化のためのまともな方法として役立ちます。理論的な観点からそれを駆動するための素敵な補助機能があります。 parseは恒等関数でなければ冪等である。 (通常、解析によって一部の情報が破棄されます) –

+2

最後の2つのリンクが死んでいます –

関連する問題