{-# OPTIONS -fno-warn-orphans #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE UndecidableInstances #-} -- for Reifies instances module QuickCheck.Trustee where import Test.Tasty.QuickCheck import qualified Data.Text as Text import Voting.Protocol import Utils import QuickCheck.Election () quickcheck :: Reifies v Version => Proxy v -> TestTree quickcheck v = testGroup "Trustee" $ [ testGroup "verifyIndispensableTrusteePublicKey" $ [ testIndispensableTrusteePublicKey v weakFFC , testIndispensableTrusteePublicKey v beleniosFFC ] ] testIndispensableTrusteePublicKey :: ReifyCrypto crypto => Reifies v Version => Proxy v -> crypto -> TestTree testIndispensableTrusteePublicKey (_v::Proxy v) crypto = reifyCrypto crypto $ \(Proxy::Proxy c) -> testGroup (Text.unpack $ cryptoName crypto) [ testProperty "Right" $ \seed -> isRight $ runExcept $ (`evalStateT` mkStdGen seed) $ do trusteeSecKey :: SecretKey crypto c <- randomSecretKey trusteePubKey :: TrusteePublicKey crypto v c <- proveIndispensableTrusteePublicKey trusteeSecKey lift $ verifyIndispensableTrusteePublicKey trusteePubKey ] instance ( Reifies v Version , Reifies c crypto , Group crypto , Multiplicative (FieldElement crypto c) ) => Arbitrary (TrusteePublicKey crypto v c) where arbitrary = do trustee_PublicKey <- arbitrary trustee_SecretKeyProof <- arbitrary return TrusteePublicKey{..}