packages feed

HsOpenSSL-0.5: tests/Base64.hs

{-# LANGUAGE OverloadedStrings  #-}

-- | Unittest for Base64 [en|de]coding.
module Main where

import           Data.Char (ord)
import           Data.String
import qualified Data.ByteString as BS
import qualified Data.ByteString.Lazy as BSL
import           OpenSSL.EVP.Base64

{-
  Comment by PHO:

  These instance declarations now seem to be part of
  Data.ByteString. What should we do then?

  Base64.hs:12:9:
      Duplicate instance declarations:
        instance IsString BS.ByteString -- Defined at Base64.hs:12:9-30
        instance IsString BS.ByteString -- Defined in Data.ByteString.Char8

  Base64.hs:17:9:
      Duplicate instance declarations:
        instance IsString BSL.ByteString -- Defined at Base64.hs:17:9-31
        instance IsString BSL.ByteString
          -- Defined in Data.ByteString.Lazy.Char8
-}
{-
instance IsString BS.ByteString where
  fromString = BS.pack . map (fromIntegral . ord)

-- Note that this instance packs each charactor as a separate lazy chunk.
-- This is to stress the lazy code - not because it's a good idea generally
instance IsString BSL.ByteString where
  fromString = BSL.fromChunks . map (BS.singleton . fromIntegral . ord)
-}

encodeTests :: [(BS.ByteString, BS.ByteString)]
encodeTests =
  [("", "")
  ,("a", "YQ==")
  ,("aa", "YWE=")
  ,("aaa", "YWFh")
  ]

lazyEncodeTests :: [(BSL.ByteString, BSL.ByteString)]
lazyEncodeTests =
  [("", "")
  ,("a", "YQ==")
  ,("aa", "YWE=")
  ,("aaa", "YWFh")
  ]

decodeTests :: [(BS.ByteString, BS.ByteString)]
decodeTests =
  [("", "")
  ,("aGFza2VsbA==", "haskell")
  ,("YWJjZGVmZ2hpams=", "abcdefghijk")
  ,("YWJjZGVmZ2hpams=\n", "abcdefghijk")
  ]

encoding = all id $ map (\(a, v) -> encodeBase64BS a == v) encodeTests
lazyEncoding = all id $ map (\(a, v) -> encodeBase64LBS a == v) lazyEncodeTests
decoding = all id $ map (\(a, v) -> decodeBase64BS a == v) decodeTests

main = do
  mapM (print . encodeBase64LBS . fst) lazyEncodeTests
  if encoding && lazyEncoding && decoding
     then putStrLn "PASS"
     else putStrLn "FAIL"