2017-08-05 8 views
2

コンテキスト私は、次の機能を持たせて与えられた機能のために複数の任意のパラメータ

を生成するQuickCheckを使用した:

-- instance PrivKey RSA.PrivateKey RSA.PublicKey where... 
genRSA :: Gen RSA.PrivateKey 
genRSAMessage :: Gen BS.ByteString 

main = do 
    quickCheck . verbose 
    $ forAll genRSA 
    $ forAll genRSAMessage prop_SignAndVerify 

それ:私のような何かをしたいと思います

prop_SignAndVerify :: (PrivKey a b) => Blind a -> BS.ByteString -> Bool 
prop_SignAndVerify bsk msg = case verify pk msg sig of 
          Left e -> error e 
          Right b -> b 
    where 
    sk = getBlind bsk 
    pk = toPublic sk 
    sig = case sign sk msg of 
       Left e -> error e 
       Right s -> s 

を私は、明示的なジェネレータを使用して、Blind aBS.ByteStringの任意の値を生成したいと考えていますprop_SignAndVerifyのメートル。

上記のコードは、しかし、動作しない、機能forAllが署名を入力したため:

forAll :: (Show a, Testable prop) => Gen a -> (a -> prop) -> Property 

この機能はPropertyを返す、(a -> prop)に発電機及びリンゴ生成された任意の値を実行します。このPropertyは部分的に適用することはできません。基本的な機能を隠します。だから私の質問は、私はprop_SignAndVerifyのパラメータよりgenRSAgenRSAMessageをどのように使用できるか、である

forAll' :: (Show a, Testable prop) => Gen a -> (a -> prop) -> prop 

質問

私のようなものになるだろう私たちが仕事をする上でのために必要なものだと思います、あるいは別の方法がありますか?

おかげ

答えて

5

あなたはprop_SignAndVerify key messageのためのすべての多くkey sおよびmessageのを確認したいです。だから我々は固定keyを持っていた場合、私たちのテストはそのようになります。

main = do 
    quickCheck . verbose $ 
    let key = someGeneratedKey 
    in forAll genRSAMessage $ \message -> 
     prop_SignAndVerify key message 

我々は、固定messageを持っていた場合、私たちのテストは次のようになります。

main = do 
    quickCheck . verbose $ 
    forAll genRSAMessage $ \key -> 
     let message = someMessage 
     in prop_SignAndVerify key message 

を私たちがしなければならないのです両方のバリアントを組み合わせる:

main = do 
    quickCheck . verbose $ 
    forAll genRSA  $ \key -> 
    forAll genRSAMessage $ \message -> 
     prop_SignAndVerify key message 

あなたが原因ETAへの変換messageを取り除くことができますが、私の意見でテストが読みやすいはずです。

1

あなたはあなたの財産から、より複雑なGen値を構成するGenのモナドな性質を利用することができます:

ここ
main = 
    let g = do 
      key <- genRSA 
      message <- genRSAMessage 
      return $ prop_SignAndVerify (Blind key) message 
    in quickCheck . verbose $ forAll g id 

は、gGen Bool値です。

また、あなたはGenの応用的な性質を利用し、<*>を使用してgを構成することができます

main = 
    let g = 
     return (\key message -> prop_SignAndVerify (Blind key) message) 
     <*> genRSA 
     <*> genRSAMessage 
    in quickCheck . verbose $ forAll g id 

gは、同様にまだここGen Bool値です。

関連する問題