packages feed

streamly-0.9.0: test/Streamly/Test/Prelude/ZipSerial.hs

{-# OPTIONS_GHC -Wno-deprecations #-}

-- |
-- Module      : Streamly.Test.Prelude.ZipSerial
-- Copyright   : (c) 2020 Composewell Technologies
--
-- License     : BSD-3-Clause
-- Maintainer  : streamly@composewell.com
-- Stability   : experimental
-- Portability : GHC

module Streamly.Test.Prelude.ZipSerial (main) where

import Test.Hspec.QuickCheck
import Test.Hspec as H

import Streamly.Prelude
import qualified Streamly.Prelude as S

import Streamly.Test.Prelude.Common

moduleName :: String
moduleName = "Prelude.ZipSerial"

main :: IO ()
main = hspec
  $ H.parallel
#ifdef COVERAGE_BUILD
  $ modifyMaxSuccess (const 10)
#endif
  $ describe moduleName $ do
    let zipSerialOps :: IsStream t
            => ((ZipSerialM IO a -> t IO a) -> Spec) -> Spec
        zipSerialOps spec = mapOps spec $ makeOps fromZipSerial
#ifndef COVERAGE_BUILD
            <> [("rate AvgRate 0.00000001", fromZipSerial . avgRate 0.00000001)]
            <> [("maxBuffer (-1)", fromZipSerial . maxBuffer (-1))]
#endif

    describe "Functor operations" $ do
        zipSerialOps $ functorOps S.fromFoldable "zipSerially" (==)
        zipSerialOps $ functorOps folded "zipSerially folded" (==)

    describe "Monoid operations" $ do
        zipSerialOps $ monoidOps "zipSerially" mempty (==)

    describe "Semigroup operations" $ do
        zipSerialOps $ semigroupOps "zipSerially" (==)

    -- XXX add tests for indexed/indexedR
    describe "Zip operations" $ do
        zipSerialOps $
            prop "zipSerially applicative" . zipApplicative S.fromFoldable (==)
        zipSerialOps $
            prop "zipSerially applicative folded" . zipApplicative folded (==)

    describe "Stream transform and combine operations" $ do
        zipSerialOps $ transformCombineOpsCommon S.fromFoldable "zipSerially" (==)
        zipSerialOps $ transformCombineOpsCommon folded "zipSerially" (==)
        zipSerialOps $ transformCombineOpsOrdered S.fromFoldable "zipSerially" (==)
        zipSerialOps $ transformCombineOpsOrdered folded "zipSerially" (==)

    describe "Stream elimination operations" $ do
        zipSerialOps $ eliminationOps S.fromFoldable "zipSerially"
        zipSerialOps $ eliminationOps folded "zipSerially folded"
        zipSerialOps $ eliminationOpsWord8 S.fromFoldable "zipSerially"
        zipSerialOps $ eliminationOpsWord8 folded "zipSerially folded"

    -- XXX Add a test where we chain all transformation APIs and make sure that
    -- the state is being passed through all of them.
    describe "Stream serial elimination operations" $ do
        zipSerialOps $ eliminationOpsOrdered S.fromFoldable "zipSerially"
        zipSerialOps $ eliminationOpsOrdered folded "zipSerially folded"