packages feed

http2-0.1.0: test/HuffmanRequestSpec.hs

module HuffmanRequestSpec where

import Control.Applicative ((<$>))
import Data.Char
import Network.HPACK.Huffman.Request
import Network.HPACK.Types
import Test.Hspec
import Test.Hspec.QuickCheck

import HexString

shouldBeEncoded :: String -> String -> Expectation
shouldBeEncoded inp out = enc inp `shouldBe` out
  where
    enc = toHexString . huffmanEncodeInRequest . toW
    toW = map (fromIntegral . ord)

shouldBeDecoded :: String -> Either DecodeError String -> Expectation
shouldBeDecoded inp out = dec inp `shouldBe` out
  where
    dec x = toS <$> huffmanDecodeInRequest (fromHexString x)
    toS = map (chr . fromIntegral)

spec :: Spec
spec = do
    describe "huffmanEncodeInRequest and huffmanDecodeInRequest" $ do
        prop "duality" $ \ns ->
            let is = map ((`mod` 255) . abs) ns
            in huffmanDecodeInRequest (huffmanEncodeInRequest is) == Right is
    describe "huffmanEncodeInRequest" $ do
        it "encodes in request" $ do
            "www.example.com" `shouldBeEncoded` "db6d883e68d1cb1225ba7f"
            "no-cache" `shouldBeEncoded` "63654a1398ff"
            "custom-key" `shouldBeEncoded` "4eb08b749790fa7f"
            "custom-value" `shouldBeEncoded` "4eb08b74979a17a8ff"
            "" `shouldBeEncoded` ""
    describe "huffmanDecodeInRequest" $ do
        it "decodes in request" $ do
            "db6d883e68d1cb1225ba7f" `shouldBeDecoded` Right "www.example.com"
            "63654a1398ff" `shouldBeDecoded` Right "no-cache"
            "4eb08b749790fa7f" `shouldBeDecoded` Right "custom-key"
            "4eb08b74979a17a8ff" `shouldBeDecoded` Right "custom-value"
            "ff" `shouldBeDecoded` Left TooLongEos
            "fffff77f" `shouldBeDecoded` Right "\1"
            "fffff77fff" `shouldBeDecoded` Left TooLongEos