Created
October 18, 2010 00:57
-
-
Save NicolasT/631521 to your computer and use it in GitHub Desktop.
A demonstration of using QuickCheck to test C code
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
-- This is a snippet cut-and-paste from a larger code body, might not compile or | |
-- work as expected as such | |
import Prelude hiding (pi) | |
import Data.Bits | |
import Data.Word (Word32) | |
import Foreign.C.Types (CSize) | |
import Foreign.Marshal.Array (withArrayLen) | |
import Foreign.Marshal.Utils (with) | |
import Foreign.Ptr (Ptr) | |
import Foreign.Storable (peek) | |
import Test.QuickCheck | |
foreign import ccall unsafe "hashword" fHashWord | |
:: Ptr Word32 -> CSize -> Word32 -> IO Word32 | |
-- | A wrapper for native 'hashword' | |
hashWord :: [Word32] -- ^ Input values to hash | |
-> Word32 -- ^ Initial salt | |
-> IO Word32 -- ^ Hash result | |
hashWord as i = withArrayLen as $ \l p -> fHashWord p (fromIntegral l) i | |
foreign import ccall unsafe "hashword2" fHashWord2 | |
:: Ptr Word32 -> CSize -> Ptr Word32 -> Ptr Word32 -> IO () | |
-- | A wrapper for native 'hashword2' | |
hashWord2 :: [Word32] -- ^ Input values to hash | |
-> Word32 -- ^ First salt | |
-> Word32 -- ^ Second salt | |
-> IO (Word32, Word32) -- ^ Hashes | |
hashWord2 as i j = withArrayLen as $ \las pas -> | |
with i $ \pi -> do | |
j' <- with j $ \pj -> do | |
fHashWord2 pas (fromIntegral las) pi pj | |
peek pj | |
i' <- peek pi | |
return (i', j') | |
prop_hashword_fst_hashword2 :: [Word32] -> Word32 -> IO Bool | |
prop_hashword_fst_hashword2 a i = do | |
h <- hashWord a i | |
h' <- fst `fmap` hashWord2 a i 0 | |
return $ h == h' | |
main = quickCheck (prop_hashword_fst_hashword2 :: [Word32] -> Word32 -> IO Bool) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment