{-# LANGUAGE OverloadedStrings, ViewPatterns #-}
module Main (main) where
import Data.Base16.Types
import Data.ByteString (ByteString)
import qualified Data.ByteString as B
import qualified Data.ByteString.Base16 as B
import Data.ByteString.Short (ShortByteString)
import qualified Data.ByteString.Short as SB
import qualified Data.ByteString.Short.Base16 as SB
import Data.Function(on)
import Data.Text (Text)
import qualified Data.Text as T
import Crypto.HashString (HashString(..))
import qualified Crypto.HashString as HS
import Test.Tasty
import Test.Tasty.QuickCheck
import Test.QuickCheck.Instances.ByteString()
main :: IO ()
main = defaultMain $ testGroup "toplevel"
[ testProperty "prop_compare" prop_compare
, testProperty "prop_eq_refl" prop_eq_refl
, testProperty "prop_compare_len" prop_compare_len
, testProperty "prop_toShortBase16" prop_toShortBase16
, testProperty "prop_fromShortBase16" prop_fromShortBase16
, testProperty "prop_toBase16" prop_toBase16
, testProperty "prop_fromBase16" prop_fromBase16
]
-- this should mostly exercise LT/GT, but not likely to exercise EQ or LT/GT determined by length, which we'll write other test cases for
prop_compare :: ShortByteString -> ShortByteString -> Bool
prop_compare as bs = compare as bs == (compare `on` HS.fromShort) as bs
prop_eq_refl :: ShortByteString -> Bool
prop_eq_refl (HS.fromShort -> bs) = bs == bs
prop_compare_len :: ShortByteString -> ShortByteString -> Bool
prop_compare_len as bs =
SB.null bs
|| ( (compare `on` HS.fromShort) as abs == LT
&& (compare `on` HS.fromShort) abs as == GT )
where
abs = as <> bs
prop_toShortBase16 :: ShortByteString -> Bool
prop_toShortBase16 as = roundtrip as == Right as
where
roundtrip = SB.decodeBase16Untyped . HS.toShortBase16 . HS.fromShort
prop_fromShortBase16 :: ShortByteString -> Bool
prop_fromShortBase16 as = roundtrip as == Just as
where
roundtrip = fmap HS.toShort . HS.fromShortBase16 . extractBase16 . SB.encodeBase16'
prop_toBase16 :: ByteString -> Bool
prop_toBase16 as = roundtrip as == Right as
where
roundtrip = B.decodeBase16Untyped . HS.toBase16 . HS.fromByteString
prop_fromBase16 :: ByteString -> Bool
prop_fromBase16 as = roundtrip as == Just as
where
roundtrip = fmap HS.toByteString . HS.fromBase16 . extractBase16 . B.encodeBase16'