packages feed

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