packages feed

multihash-serialise-0.1.0.0: test/properties/Main.hs

{-# 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