From 2534b8aff490a9e38e927ffc77d0a2e37c17db77 Mon Sep 17 00:00:00 2001 From: Sam Truzjan Date: Fri, 4 Oct 2013 13:15:57 +0400 Subject: Add spec for lenient decoding --- src/Data/ByteString/Base32.hs | 2 +- src/Data/ByteString/Base32/Hex.hs | 2 +- tests/Data/ByteString/Base32/HexSpec.hs | 20 ++++++++++++++++++++ tests/Data/ByteString/Base32Spec.hs | 20 +++++++++++++++++++- 4 files changed, 41 insertions(+), 3 deletions(-) diff --git a/src/Data/ByteString/Base32.hs b/src/Data/ByteString/Base32.hs index fa15cdd..e9ac3ee 100644 --- a/src/Data/ByteString/Base32.hs +++ b/src/Data/ByteString/Base32.hs @@ -17,7 +17,7 @@ module Data.ByteString.Base32 ( Base32 , encode , decode --- , decodeLenient + , decodeLenient ) where import Data.ByteString as BS diff --git a/src/Data/ByteString/Base32/Hex.hs b/src/Data/ByteString/Base32/Hex.hs index a7d4122..ce7682b 100644 --- a/src/Data/ByteString/Base32/Hex.hs +++ b/src/Data/ByteString/Base32/Hex.hs @@ -17,7 +17,7 @@ module Data.ByteString.Base32.Hex ( Base32Hex , encode , decode --- , decodeLenient + , decodeLenient ) where import Data.ByteString as BS diff --git a/tests/Data/ByteString/Base32/HexSpec.hs b/tests/Data/ByteString/Base32/HexSpec.hs index 4e41d09..3a04b09 100644 --- a/tests/Data/ByteString/Base32/HexSpec.hs +++ b/tests/Data/ByteString/Base32/HexSpec.hs @@ -45,3 +45,23 @@ spec = do it "fail gracefully if encoded data contains non alphabet chars" $ do evaluate (decode "#=======") `shouldThrow` anyErrorCall evaluate (decode "AAAAAAAA#=======") `shouldThrow` anyErrorCall + + describe "decodeLenient" $ do + it "conform RFC examples" $ do + decodeLenient "" `shouldBe` "" + decodeLenient "MY======" `shouldBe` "f" + decodeLenient "MZXQ====" `shouldBe` "fo" + decodeLenient "MZXW6===" `shouldBe` "foo" + decodeLenient "MZXW6YQ=" `shouldBe` "foob" + decodeLenient "MZXW6YTB" `shouldBe` "fooba" + decodeLenient "MZXW6YTBOI======" `shouldBe` "foobar" + + it "inverse for encode" $ property $ \bs -> + decodeLenient (encode bs) == bs + + it "case insensitive" $ property $ \bs -> + decodeLenient (BC.map toLower (encode bs)) == bs + + it "skip non alphabet chars" $ do + decodeLenient "|" `shouldBe` "" + decodeLenient "M|Y" `shouldBe` "f" diff --git a/tests/Data/ByteString/Base32Spec.hs b/tests/Data/ByteString/Base32Spec.hs index 66df53a..148539a 100644 --- a/tests/Data/ByteString/Base32Spec.hs +++ b/tests/Data/ByteString/Base32Spec.hs @@ -52,4 +52,22 @@ spec = do evaluate (decode "0=======") `shouldThrow` anyErrorCall evaluate (decode "AAAAAAAA0=======") `shouldThrow` anyErrorCall --- describe "decodeLenient" $ do + describe "decodeLenient" $ do + it "conform RFC examples" $ do + decodeLenient "" `shouldBe` "" + decodeLenient "MY======" `shouldBe` "f" + decodeLenient "MZXQ====" `shouldBe` "fo" + decodeLenient "MZXW6===" `shouldBe` "foo" + decodeLenient "MZXW6YQ=" `shouldBe` "foob" + decodeLenient "MZXW6YTB" `shouldBe` "fooba" + decodeLenient "MZXW6YTBOI======" `shouldBe` "foobar" + + it "inverse for encode" $ property $ \bs -> + decodeLenient (encode bs) == bs + + it "case insensitive" $ property $ \bs -> + decodeLenient (BC.map toLower (encode bs)) == bs + + it "skip non alphabet chars" $ do + decodeLenient "|" `shouldBe` "" + decodeLenient "M|Y" `shouldBe` "f" -- cgit v1.2.3