{-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE TypeApplications #-} {-# OPTIONS_GHC -fno-warn-deprecations #-} module Data.Word7Spec ( spec ) where import Prelude import Data.Binary.Get ( runGet ) import Data.Binary.Put ( runPut ) import Data.Word ( Word8 ) import Data.Word7 ( getVariableLengthNat , putVariableLengthNat , toNatural , toWord7 , toWord7s , toWord8 ) import Numeric.Natural ( Natural ) import Test.Hspec ( Spec, describe ) import Test.Hspec.QuickCheck ( prop ) import Test.QuickCheck ( Property, choose, forAll, (===) ) import Test.Arbitrary () spec :: Spec spec = do describe "Word7 roundtrips" $ do prop "toWord7 . toWord8 - Word8" prop_roundtripConversionWord8 prop "toWord7s . toNatural - Natural" prop_roundtripConversionNatural describe "encode / decode roundtrip" $ do prop "{get,put}VariableLengthNat" prop_roundtripVariableLengthNat prop_roundtripConversionWord8 :: Word8 -> Property prop_roundtripConversionWord8 number = (number `mod` 128 === toWord8 (toWord7 number)) prop_roundtripConversionNatural :: Natural -> Property prop_roundtripConversionNatural number = (number === toNatural (toWord7s number)) prop_roundtripVariableLengthNat :: Property prop_roundtripVariableLengthNat = forAll genNatural $ \n -> runGet getVariableLengthNat (runPut $ putVariableLengthNat n) === n where genNatural = fromIntegral @Integer <$> choose (0, 500)