content: {-# LANGUAGE FlexibleContexts    #-}
  {-# LANGUAGE MonoLocalBinds      #-}
  {-# LANGUAGE DataKinds           #-}
  {-# LANGUAGE ScopedTypeVariables #-}
  -- Generic tests for hash.
  
  module Tests.Digest
         ( digestsTo
         , incrementalVsFull
         ) where
  
  import Implementation
  import Interface
  
  import Tests.Core
  
  
  
  digestsTo :: ByteString
            -> Prim
            -> Spec
  digestsTo str h = it msg (digest str `shouldBe` h)
    where msg   = unwords [ "hashes"
                          , shortened $ show str
                          , "to"
                          , shortened $ show h
                          ]
  
  incrDigest :: ByteString
             -> IO Prim
  incrDigest bs = withMemory $ \ (cxt :: DigestCxt 1) ->
    do startDigest cxt
       updateDigest bs cxt
       finaliseDigest cxt
  
  incrDigestList :: [ByteString]
                 -> IO Prim
  incrDigestList bsL = withMemory $ \ (cxt :: DigestCxt 1) ->
    do startDigest cxt
       mapM_ (`updateDigest` cxt) bsL
       finaliseDigest cxt
  
  incrementalVsFull :: Spec
  incrementalVsFull = describe "Incremental vs Full digest" $ do
    prop "for single source" $
      \ bs -> incrDigest bs `shouldReturn` digest bs
  
    prop "for multiple source" $
      \ bsL -> incrDigestList bsL `shouldReturn` digest bsL
  