module CallIdTest (test) where
import Control.Monad (replicateM)
import Data.Data
import Data.List (nub)
import qualified UnliftIO.MessageBox.Util.CallId as CallId
import QCOrphans ()
import Test.QuickCheck
import Test.Tasty (TestTree, testGroup)
import Test.Tasty.HUnit
( assertBool,
assertEqual,
testCase,
)
import Test.Tasty.QuickCheck (testProperty)
import UnliftIO
( replicateConcurrently,
)
import Utils (allEqOrdShowMethodsImplemented, withCallIds)
test :: TestTree
test =
testGroup
"UnliftIO.MessageBox.Util.CallId"
[ testCase
"Even when a CallId CounterVar is shared by multiple threads/processes, all callIds are unique"
$ do
callIds <- withCallIds (replicateConcurrently 1000 CallId.takeNext)
assertEqual
"all callids must be unique"
(nub callIds)
callIds,
testCase
"The next callId is greater and not equal to the previous"
$ do
[c1, c2] <- withCallIds (replicateM 2 CallId.takeNext)
assertBool
"next callId is not greater"
(c2 > c1)
assertBool
"next callId is equal to the previous"
(c2 /= c1),
testProperty
"more recent CallIds are > (greater than) all previous CallIds"
$ \(Positive (Small n)) -> ioProperty $ do
callIds <- withCallIds (replicateM n CallId.takeNext)
return $
n > 1 ==> (head callIds < last callIds),
-- This ONLY exists because I wanted the test-code coverage to be 100%
testCase
"CallId Show instance"
(assertEqual "bad show result" "<123>" (show (CallId.MkCallId 123))),
testProperty "CallId Laws" (allEqOrdShowMethodsImplemented (Proxy @CallId.CallId))
]