{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE OverloadedStrings #-}
import Test.QuickCheck (Arbitrary(..), choose, forAll)
import Test.QuickCheck.All (quickCheckAll)
import Control.Monad (void)
import Data.Word
import qualified Data.ByteString.Base64 as Base64
import qualified Data.ByteString.Base32 as Base32
import qualified Data.ByteString.Base16 as Base16
import qualified Data.ByteString.Char8 as B8
instance Arbitrary B8.ByteString where
arbitrary = B8.pack <$> arbitrary
prop_base64_inverse :: B8.ByteString -> Bool
prop_base64_inverse bs =
either (const False) (bs==)
$ Base64.decode $ Base64.encode bs
prop_base16_inverse :: B8.ByteString -> Bool
prop_base16_inverse bs =
either (const False) (bs==)
$ Base16.decode $ Base16.encode bs
inverse ::
(B8.ByteString -> B8.ByteString) ->
(B8.ByteString -> Either String B8.ByteString) ->
B8.ByteString ->
Bool
inverse encode decode bs =
let
enc = encode bs
long = "--%" `B8.append` encode bs
[pre,post] = B8.split '%' long
in
either (const False) (bs==) (decode post)
prop_base16_inverse_split :: B8.ByteString -> Bool
prop_base16_inverse_split = inverse Base16.encode Base16.decode
prop_base32_inverse_split :: B8.ByteString -> Bool
prop_base32_inverse_split = inverse Base32.encode Base32.decode
prop_base64_inverse_split :: B8.ByteString -> Bool
prop_base64_inverse_split = inverse Base64.encode Base64.decode
prop_base32_inverse :: B8.ByteString -> Bool
prop_base32_inverse bs =
either (const False) (bs==)
$ Base32.decode $ Base32.encode bs
return []
runTests = $quickCheckAll
main :: IO ()
main = void runTests