{-# LANGUAGE CPP #-}
module Main (main) where
import Test.Tasty
import Test.Tasty.QuickCheck (testProperty, (===))
import qualified Data.Aeson as A
import qualified Data.Binary as B
import qualified Data.ByteString as BS
import qualified Data.ByteString.Base64.Lazy.Type as L
import qualified Data.ByteString.Base64.Type as S
import qualified Data.ByteString.Base64.URL.Lazy.Type as UL
import qualified Data.ByteString.Base64.URL.Type as US
import qualified Data.ByteString.Lazy as LBS
#ifdef MIN_VERSION_cereal
import qualified Data.Serialize as C
#endif
#ifdef MIN_VERSION_serialise
import qualified Codec.Serialise as CBOR
#endif
#ifdef MIN_VERSION_http_api_data
import qualified Web.HttpApiData as HTTP
#endif
main :: IO ()
main = defaultMain tests
tests :: TestTree
tests = testGroup "Tests"
[ aeson
, binary
#ifdef MIN_VERSION_cereal
, cereal
#endif
#ifdef MIN_VERSION_serialise
, serialise
#endif
#ifdef MIN_VERSION_http_api_data
, httpApiData
#endif
]
aeson :: TestTree
aeson = testGroup "aeson"
[ testProperty "strict" propS
, testProperty "lazy" propL
, testProperty "strict url" propUL
, testProperty "lazy url" propUS
]
where
propS bs64 = A.decode (A.encode bs64) === Just (bs64 :: S.ByteString64)
propL bs64 = A.decode (A.encode bs64) === Just (bs64 :: L.ByteString64)
propUL bs64 = A.decode (A.encode bs64) === Just (bs64 :: UL.ByteString64)
propUS bs64 = A.decode (A.encode bs64) === Just (bs64 :: US.ByteString64)
binary :: TestTree
binary = testGroup "binary"
[ testProperty "strict" propS
, testProperty "lazy" propL
, testProperty "strict url" propUL
, testProperty "lazy url" propUS
]
where
propS ws = let bs64 = S.makeByteString64 (BS.pack ws)
in B.decode (B.encode bs64) === bs64
propL ws = let bs64 = L.makeByteString64 (LBS.pack ws)
in B.decode (B.encode bs64) === bs64
propUS ws = let bs64 = US.makeByteString64 (BS.pack ws)
in B.decode (B.encode bs64) === bs64
propUL ws = let bs64 = UL.makeByteString64 (LBS.pack ws)
in B.decode (B.encode bs64) === bs64
#ifdef MIN_VERSION_cereal
cereal :: TestTree
cereal = testGroup "cereal"
[ testProperty "strict" propS
, testProperty "lazy" propL
, testProperty "strict url" propUL
, testProperty "lazy url" propUS
]
where
propS ws = let bs64 = S.makeByteString64 (BS.pack ws)
in C.decode (C.encode bs64) === Right bs64
propL ws = let bs64 = L.makeByteString64 (LBS.pack ws)
in C.decode (C.encode bs64) === Right bs64
propUS ws = let bs64 = US.makeByteString64 (BS.pack ws)
in C.decode (C.encode bs64) === Right bs64
propUL ws = let bs64 = UL.makeByteString64 (LBS.pack ws)
in C.decode (C.encode bs64) === Right bs64
#endif
#ifdef MIN_VERSION_serialise
serialise :: TestTree
serialise = testGroup "serialise"
[ testProperty "strict" propS
, testProperty "lazy" propL
, testProperty "strict url" propUL
, testProperty "lazy url" propUS
]
where
propS ws = let bs64 = S.makeByteString64 (BS.pack ws)
in CBOR.deserialiseOrFail (CBOR.serialise bs64) === Right bs64
propL ws = let bs64 = L.makeByteString64 (LBS.pack ws)
in CBOR.deserialiseOrFail (CBOR.serialise bs64) === Right bs64
propUS ws = let bs64 = US.makeByteString64 (BS.pack ws)
in CBOR.deserialiseOrFail (CBOR.serialise bs64) === Right bs64
propUL ws = let bs64 = UL.makeByteString64 (LBS.pack ws)
in CBOR.deserialiseOrFail (CBOR.serialise bs64) === Right bs64
#endif
#ifdef MIN_VERSION_http_api_data
httpApiData :: TestTree
httpApiData = testGroup "http-api-data"
[ testProperty "toUrlPiece" propU
, testProperty "toUrlPiece url" propUU
, testProperty "toHeader" propH
, testProperty "toHeader url" propHU
, testProperty "toQueryParam" propQ
, testProperty "toQueryParam url" propQU
]
where
propU ws = let bs64 = S.makeByteString64 (BS.pack ws)
in HTTP.parseUrlPiece (HTTP.toUrlPiece bs64) === Right bs64
propUU ws = let bs64 = US.makeByteString64 (BS.pack ws)
in HTTP.parseUrlPiece (HTTP.toUrlPiece bs64) === Right bs64
propH ws = let bs64 = S.makeByteString64 (BS.pack ws)
in HTTP.parseHeader (HTTP.toHeader bs64) === Right bs64
propHU ws = let bs64 = US.makeByteString64 (BS.pack ws)
in HTTP.parseHeader (HTTP.toHeader bs64) === Right bs64
propQ ws = let bs64 = S.makeByteString64 (BS.pack ws)
in HTTP.parseQueryParam (HTTP.toQueryParam bs64) === Right bs64
propQU ws = let bs64 = US.makeByteString64 (BS.pack ws)
in HTTP.parseQueryParam (HTTP.toQueryParam bs64) === Right bs64
#endif