content: {-# OPTIONS_GHC -fno-warn-orphans #-}
  {-# LANGUAGE ScopedTypeVariables #-}
  {-# LANGUAGE OverloadedStrings   #-}
  module Raaz.Core.EncodeSpec where
  
  import           Tests.Core
  import qualified Data.ByteString as B
  
  shouldBeAMultipleOf :: Int -> Int -> Bool
  shouldBeAMultipleOf m x = m `rem` x == 0
  
  shouldEncodeTo :: (Format fmt, Eq fmt) => ByteString -> fmt -> Spec
  shouldEncodeTo bs e = it msg $ encodeByteString bs `shouldBe` e
    where msg = show bs ++ " should encode to " ++ show e
  
  spec :: Spec
  spec = do
    describe "Base16" $ do
      prop "encoded string is always of even length" $ \ (x :: Base16) ->
        B.length (toByteString x) `shouldBeAMultipleOf` 2
  
      prop "unsafeFromByteString . toByteString = id" $ \ (x :: Base16) ->
        unsafeFromByteString (toByteString x) `shouldBe` x
  
      prop "correctly encodes a 64-bit big endian word." $ \ (w :: Word64) ->
        read ("0x" ++ showBase16 (bigEndian w))  == w
  
  
    describe "Base64" $ do
      prop "encoded string is always divisible by 4" $ \ (x :: Base64) ->
        B.length (toByteString x) `shouldBeAMultipleOf` 4
  
      prop "unsafeFromByteString . toByteString = id" $ \ (x :: Base16) ->
        unsafeFromByteString (toByteString x) `shouldBe` x
  
      describe "examples" $ do
        "pleasure." `shouldEncodeTo` ("cGxlYXN1cmUu" :: Base64)
        "leasure."  `shouldEncodeTo` ("bGVhc3VyZS4=" :: Base64)
        "easure."   `shouldEncodeTo` ("ZWFzdXJlLg==" :: Base64)
        "asure."    `shouldEncodeTo` ("YXN1cmUu"     :: Base64)
        "sure."     `shouldEncodeTo` ("c3VyZS4="     :: Base64)
  