-- | Tests for sequential sort of messages.
module Sequential (tests) where
import Protolude
import Hedgehog (forAll, property, (===))
import qualified Hedgehog.Gen as Gen
import qualified Hedgehog.Range as Range
import Test.Tasty (TestTree, testGroup)
import Test.Tasty.Hedgehog (testProperty)
import qualified MagicWormhole.Internal.Sequential as Sequential
tests :: IO TestTree
tests = pure $ testGroup "Sequential"
[ testProperty "exhausts items in order" $ property $ do
-- Sequential with an arbitrary start point that gets the rank from the
-- first element of a tuple.
start <- forAll (Gen.integral (Range.linear 0 100))
sequential <- liftIO (atomically (Sequential.sequenceBy fst start))
-- An arbitrary list of messages...
messages <- forAll (Gen.list (Range.linear 0 100) (Gen.text (Range.linear 0 100) Gen.unicode))
-- ... ranked from our arbitrary start...
let allMessages = zip [start..start+length messages] messages
-- ... in an arbitrary order.
shuffled <- forAll $ Gen.shuffle allMessages
-- Insert them all.
traverse_ (liftIO . atomically . Sequential.insert sequential) shuffled
-- Pull them all out.
items <- replicateM (length messages) (liftIO . atomically $ Sequential.next sequential)
items === allMessages
]