attoparsec-varword-0.1.0.0: test/Data/Attoparsec/VarWordSpec.hs
module Data.Attoparsec.VarWordSpec where
import Test.Hspec
import Test.QuickCheck
import Data.Attoparsec.ByteString (Parser, parseOnly)
import qualified Data.ByteString as BS
import qualified Data.ByteString.Lazy as LBS
import Data.Word
import Data.ByteString.Builder (Builder)
import qualified Data.ByteString.Builder as Builder
import qualified Data.ByteString.Builder.VarWord as Builder
import Data.Attoparsec.VarWord (varWordBe, denseVarWordBe, varWordLe)
spec :: Spec
spec = do
varWordSpec "Big-endian chunked number parser"
varWordBe Builder.varWordBe 18464
varWordSpec "Big-endian dense chunked number parser"
denseVarWordBe Builder.denseVarWordBe 34976
varWordSpec "Little-endian chunked number parser"
varWordLe Builder.varWordLe 526337
varWordSpec :: String -> Parser Word32 -> (Word32 -> Builder) -> Word32 -> Spec
varWordSpec s p b expected = describe s $ do
it "should parse a known bytestring" $ do
parseOnly p (BS.pack [0b10000001, 0b10010000, 0b00100000])
`shouldBe` Right expected
it "should parse any valid single byte" $ forAll (choose (0, 127)) $ \word8 ->
parseOnly p (BS.singleton word8) `shouldBe` Right (fromIntegral word8)
it "should roundtrip any valid bytestring" $ property $ \word32 ->
let
encoded = LBS.toStrict $ Builder.toLazyByteString $ b word32
in
parseOnly p encoded `shouldBe` Right word32