{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeApplications #-}
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 Data.Multihash as Strict
import qualified Data.Multihash.Lazy as Lazy
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)
prop_roundtripStrict :: Property
prop_roundtripStrict = property $ do
bs <- forAll $ Gen.bytes (Range.singleton 128)
let
hashed = Strict.multihash C.Blake2b_256 bs
bytes = Strict.encodedBytes hashed
decoded = Strict.fromDigest @C.Blake2b_256 <$> Strict.decodeDigest bytes
in
assert $ decoded == Right hashed
prop_roundtripBytesStrict :: Property
prop_roundtripBytesStrict = property $ do
bs <- forAll $ Gen.bytes (Range.singleton 128)
let
hashed = Strict.multihash C.Blake2b_256 bs
bytes = Strict.encodedBytes hashed
decoded = Strict.decode bytes
in
assert $ decoded == Right hashed
prop_roundtripLazy :: Property
prop_roundtripLazy = property $ do
bs <- forAll $ Gen.bytes (Range.singleton 128)
let
hashed = Lazy.multihash C.Blake2b_256 bs
bytes = Lazy.encodedBytes hashed
decoded = Lazy.fromDigest @C.Blake2b_256 <$> Lazy.decodeDigest bytes
in
assert $ decoded == Right hashed
prop_roundtripBytesLazy :: Property
prop_roundtripBytesLazy = property $ do
bs <- forAll $ Gen.bytes (Range.singleton 128)
let
hashed = Lazy.multihash C.Blake2b_256 bs
bytes = Lazy.encodedBytes hashed
decoded = Lazy.decode bytes
in
assert $ decoded == Right hashed
prop_algorithmMismatchStrict :: Property
prop_algorithmMismatchStrict = property $ do
bs <- forAll $ Gen.bytes (Range.singleton 128)
let
hashed = Strict.multihash C.Blake2b_256 bs
bytes = Strict.encodedBytes hashed
decoded = Strict.fromDigest @C.SHA256 <$> Strict.decodeDigest bytes
in do
annotate (render decoded)
assert $ decoded == Left "Algorithm mismatch"
prop_algorithmMismatchLazy :: Property
prop_algorithmMismatchLazy = property $ do
bs <- forAll $ Gen.bytes (Range.singleton 128)
let
hashed = Lazy.multihash C.Blake2b_256 bs
bytes = Lazy.encodedBytes hashed
decoded = Lazy.fromDigest @C.SHA256 <$> Lazy.decodeDigest bytes
in do
annotate (render decoded)
assert $ decoded == Left "Algorithm mismatch"
render :: Either String a -> String
render (Left s) = "Left " <> s
render (Right _) = "Right <multihash>"