blob: ff3e13c12a81579eb2d19e974cb62eb987d1aa06 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
|
{-# OPTIONS -fno-warn-orphans #-}
module Data.ByteString.Base32Spec (spec) where
import Control.Applicative
import Control.Exception
import Data.ByteString as BS
import Data.ByteString.Internal as BS
import Data.ByteString.Base32 as Base32
import Test.Hspec
import Test.QuickCheck
instance Arbitrary ByteString where
arbitrary = BS.pack <$> arbitrary
spec :: Spec
spec = do
describe "encode" $ do
it "conform RFC examples" $ do
encode "" `shouldBe` ""
encode "f" `shouldBe` "MY======"
encode "fo" `shouldBe` "MZXQ===="
encode "foo" `shouldBe` "MZXW6==="
encode "foob" `shouldBe` "MZXW6YQ="
encode "fooba" `shouldBe` "MZXW6YTB"
encode "foobar" `shouldBe` "MZXW6YTBOI======"
it "size always multiple of 8 bytes" $ property $ \bs ->
(BS.length (encode bs) `rem` 8) `shouldBe` 0
it "padding less than" $ property $ \bs ->
count (c2w '=') bs `shouldSatisfy` (< 8)
describe "decode" $ do
it "conform RFC examples" $ do
decode "" `shouldBe` ""
decode "MY======" `shouldBe` "f"
decode "MZXQ====" `shouldBe` "fo"
decode "MZXW6===" `shouldBe` "foo"
decode "MZXW6YQ=" `shouldBe` "foob"
decode "MZXW6YTB" `shouldBe` "fooba"
decode "MZXW6YTBOI======" `shouldBe` "foobar"
it "inverse for encode" $ property $ \bs ->
decode (encode bs) == bs
it "fail gracefully if encoded data contains non alphabet chars" $ do
evaluate (decode "0=======") `shouldThrow` anyErrorCall
evaluate (decode "AAAAAAAA0=======") `shouldThrow` anyErrorCall
-- describe "decodeLenient" $ do
|