Context
I have the following function:
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
I would like to do something like:
-- 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
That is, I would like to use explicit generators to generate arbitrary values for Blind a
and BS.ByteString
in the parameters of prop_SignAndVerify
.
The code above, however, doesn't work, because the function forAll
has type signature:
forAll :: (Show a, Testable prop) => Gen a -> (a -> prop) -> Property
This function runs the generator and apples the generated arbitrary value to (a -> prop)
, returning a Property
. This Property
however cannot be further partially applied; it hides the underlying function.
I think what we need for the above to work would be something like:
forAll' :: (Show a, Testable prop) => Gen a -> (a -> prop) -> prop
Question
So my question is, how can I use genRSA
and genRSAMessage
over the parameters of prop_SignAndVerify
, or is there an alternative approach?
Thanks