packages feed

basen-0.1.0.0: test/Data/BaseNTest.hs

module Data.BaseNTest where

import Test.Tasty.Hspec
import Test.Tasty.QuickCheck
import Test.QuickCheck.Instances.ByteString ()

import Data.BaseN

import Data.ByteString
import Data.Word

--
-- Specs
--

spec_examples :: Spec
spec_examples = do
  describe "Edge Cases" $ do
    it "Empty Base2" $ do
      encodeBase2 ([] :: [Word8]) `shouldBe` ""
      decodeBase2 "" `shouldBe` Right ([] :: [Word8])
    it "Malformed Base2" $ do
      decodeBase2 "0" `shouldBe` (Left (WrongLength 7) :: Either DecodeError [Word8])
      decodeBase2 "000011110000" `shouldBe`(Left (WrongLength 4) :: Either DecodeError [Word8])
      decodeBase2 "01234567" `shouldBe` (Left UnkownAlphabet :: Either DecodeError [Word8])
  describe "Base2 Spec" $ do
    testEnc2 [0] "00000000"
    testEnc2 [1] "00000001"
    testEnc2 [10] "00001010"
    testEnc2 [123] "01111011"
    testEnc2 [0,0] "0000000000000000"
    testEnc2 [213,231] "1101010111100111"
  where
    testEnc2 i s = it (show i) $ encodeBase2 (i :: [Word8]) `shouldBe` s

--
-- Properties
--

prop_decodeBase2IsLeftInverseOfencodeBase2 :: ByteString -> Bool
prop_decodeBase2IsLeftInverseOfencodeBase2 input =
  decodeBase2 encoded == Right input
  where
    encoded :: String
    encoded = encodeBase2 input