{-# LANGUAGE TemplateHaskell #-}
module Main (main) where
import Control.Monad (unless)
import qualified Crypto.Hash as C
import System.Exit (exitFailure)
import System.IO (BufferMode(..), hSetBuffering, stderr, stdout)
import qualified Codec.Serialise as CBOR
import Codec.Serialise.Multihash (Multihashable)
import qualified Codec.Serialise.Multihash as Multihash
import Hedgehog
import qualified Hedgehog.Gen as Gen
import qualified Hedgehog.Range as Range
main :: IO ()
main = do
hSetBuffering stdout LineBuffering
hSetBuffering stderr LineBuffering
ok <- props
unless ok exitFailure
props :: IO Bool
props = checkParallel $$(discover)
newtype Digest' a = Digest' { unDigest' :: C.Digest a }
deriving (Eq, Show)
instance Multihashable a => CBOR.Serialise (Digest' a) where
encode = Multihash.encode . unDigest'
decode = Digest' <$> Multihash.decode
prop_roundtrip :: Property
prop_roundtrip = property $ do
bs <- forAll $ Gen.bytes (Range.singleton 128)
let digest = Digest' $ C.hashWith C.Blake2b_256 bs
tripping digest CBOR.serialise CBOR.deserialiseOrFail