{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ScopedTypeVariables #-}
module Main
( main,
)
where
import qualified Codec.Serialise as Ser
import Codec.Serialise.UUID ()
import qualified Data.ByteString.Lazy as BL
import qualified Data.UUID.Types as UUID
import qualified Test.Tasty as Tasty
import Test.Tasty.HUnit ((@?=), testCase)
import Test.Tasty.QuickCheck ((===), Gen, arbitrary, forAll, testProperty)
import qualified Test.Tasty.Runners as Tasty
main :: IO ()
main =
Tasty.defaultMainWithIngredients
[ Tasty.consoleTestReporter,
Tasty.listingTests
]
tt
tt :: Tasty.TestTree
tt =
Tasty.testGroup
"serialise-uuid"
[ testProperty "round trip" $ forAll genUUID $ \u ->
Right u === Ser.deserialiseOrFail (Ser.serialise u),
testProperty "expected format" $ forAll genUUID $ \u ->
Ser.serialise u === "\xd8\x25\x50" <> UUID.toByteString u,
testProperty "expected length" $ forAll genUUID $ \u ->
BL.length (Ser.serialise u) === 19,
testCase "00000000-0000-0000-0000-000000000000" $
Ser.serialise UUID.nil @?= "\xd8\x25\x50\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
testCase "8b0d1a20-dcc5-11d9-bda9-0002a5d5c51b" $
let Just u = UUID.fromString "8b0d1a20-dcc5-11d9-bda9-0002a5d5c51b"
in Ser.serialise u @?= "\xd8\x25\x50\x8b\x0d\x1a\x20\xdc\xc5\x11\xd9\xbd\xa9\x00\x02\xa5\xd5\xc5\x1b"
]
genUUID :: Gen UUID.UUID
genUUID =
UUID.fromWords
<$> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary