packages feed

mediabus-0.2.0.0: specs/Data/MediaBus/SequenceSpec.hs

module Data.MediaBus.SequenceSpec ( spec ) where

import           Conduit                         as C
import           Data.Conduit.List               ( consume, sourceList )
import           Data.Word
import           Test.Hspec
import           Test.QuickCheck
import           Data.MediaBus

-- -----------------------------------------------------------------------------
-- * Tests/Specs
-- -----------------------------------------------------------------------------
spec :: Spec
spec =
    describe "synchronizeToSeqNum" $
        it "produces dense, strictly monotonic output" $
            property synchronizeToSeqNumIsMonotone

synchronizeToSeqNumIsMonotone :: NonEmptyList (SeqNum ())
                              -> Word64
                              -> Expectation
synchronizeToSeqNumIsMonotone (NonEmpty xs) startVal = do
    let inEvents = sourceList xs :: Producer Identity (SeqNum ())
        (e0 : rest) = runConduitPure (inEvents .|
                                          synchronizeToSeqNum startVal .|
                                          consume)
    e0 `shouldBe` MkSeqNum startVal

    (rest `zip` drop 1 rest) `shouldSatisfy`
        all (not .
                 uncurry succeeds)