packages feed

serokell-util-0.2.0.0: test/Test/Serokell/Util/ByteStringSpec.hs

{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE StandaloneDeriving  #-}

module Test.Serokell.Util.ByteStringSpec
       ( spec
       ) where

import           Data.Aeson                (decode, encode)
import qualified Data.ByteString           as BS
import           Data.Maybe                (fromJust)
import           Test.Hspec                (Spec, describe)
import           Test.Hspec.QuickCheck     (prop)
import           Test.QuickCheck           ((===))
import           Test.QuickCheck.Instances ()

import           Serokell.Arbitrary        ()
import qualified Serokell.Util.Base16      as C16
import qualified Serokell.Util.Base64      as C64

spec :: Spec
spec =
    describe "Serialization" $ do
        describe "Indentity Properties" $ do
            prop "Base16" $
                \(a :: BS.ByteString) -> a === base16Mid a
            prop "Base64" $
                \(a :: BS.ByteString) -> a === base64Mid a
            prop "JSON Base64" $
                \(a :: C64.JsonByteString) -> a === base64JSONMid a

base16Mid,
    base64Mid :: BS.ByteString -> BS.ByteString
base16Mid = fromRight . C16.decode . C16.encode
base64Mid = fromRight . C64.decode . C64.encode

base64JSONMid :: C64.JsonByteString -> C64.JsonByteString
base64JSONMid = fromJust . decode . encode

fromRight :: Either a BS.ByteString -> BS.ByteString
fromRight (Left _)  = error "failed decoding to ByteString"
fromRight (Right b) = b