packages feed

digest-pure-0.0.1: test/TestSuiteDigestPure.hs

{-# LANGUAGE DoAndIfThenElse #-}

module Main where

import qualified Data.ByteString.Lazy as B
import qualified Data.Digest.Adler32 as A
import qualified Data.Digest.CRC32 as C
import qualified Data.Digest.Pure.Adler32 as AP
import qualified Data.Digest.Pure.CRC32 as CP
import System.Exit
import Test.QuickCheck
import Text.Printf

instance Arbitrary B.ByteString where
  arbitrary = do
    n <- choose (1, 1000000)
    l <- vector n
    return $ B.pack l

main = do
  results <- mapM (\(s, a) -> printf "%-25s: " s >> a) tests
  if all succesful results then
    exitSuccess
  else
    exitFailure

succesful :: Result -> Bool
succesful (Success _ _ _) = True
succesful _               = False

tests = [
  ("adler32CompareZlib", quickCheckResult adler32CompareZlib),
  ("adler32Update",      quickCheckResult adler32Update),
  ("crc32CompareZlib",   quickCheckResult crc32CompareZlib),
  ("crc32Update",        quickCheckResult crc32Update) ]

adler32CompareZlib :: B.ByteString -> Bool
adler32CompareZlib str =
  AP.adler32 str == A.adler32 str

adler32Update :: B.ByteString -> B.ByteString -> Bool
adler32Update str1 str2 =
  AP.adler32 strConcat == AP.adler32Update (AP.adler32 str1) str2
  where
    strConcat = B.append str1 str2

crc32CompareZlib :: B.ByteString -> Bool
crc32CompareZlib str =
  CP.crc32 str == C.crc32 str

crc32Update :: B.ByteString -> B.ByteString -> Bool
crc32Update str1 str2 =
  CP.crc32 strConcat == CP.crc32Update (CP.crc32 str1) str2
  where
    strConcat = B.append str1 str2