packages feed

serialise-uuid-0.1: test/Main.hs

{-# 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