on e57424d help sign in
111 lines 4.4 kB history raw
1-- |
2-- Module : Streamly.Test.Prelude.Parallel
3-- Copyright : (c) 2020 Composewell Technologies
4--
5-- License : BSD-3-Clause
6-- Maintainer : streamly@composewell.com
7-- Stability : experimental
8-- Portability : GHC
10module Streamly.Test.Prelude.Parallel where
12import Data.List (sort)
13#if !(MIN_VERSION_base(4,11,0))
14import Data.Semigroup ((<>))
15#endif
16import Test.Hspec.QuickCheck
17import Test.Hspec as H
19import Streamly.Prelude
20import qualified Streamly.Prelude as S
22import Streamly.Test.Prelude.Common
24main :: IO ()
25main = hspec
26 $ H.parallel
27#ifdef COVERAGE_BUILD
28 $ modifyMaxSuccess (const 10)
29#endif
30 $ do
31 let parallelCommonOps :: IsStream t => [(String, ParallelT m a -> t m a)]
32 parallelCommonOps = []
33#ifndef COVERAGE_BUILD
34 <> [("rate AvgRate 0.00000001", parallely . avgRate 0.00000001)]
35 <> [("maxBuffer (-1)", parallely . maxBuffer (-1))]
36#endif
37 let parallelOps :: IsStream t
38 => ((ParallelT IO a -> t IO a) -> Spec) -> Spec
39 parallelOps spec = mapOps spec $ makeOps parallely <> parallelCommonOps
41 describe "Construction" $ do
42 parallelOps $ prop "parallely replicateM" . constructWithReplicateM
44 describe "Functor operations" $ do
45 parallelOps $ functorOps S.fromFoldable "parallely" sortEq
46 parallelOps $ functorOps folded "parallely folded" sortEq
48 describe "Monoid operations" $ do
49 parallelOps $ monoidOps "parallely" mempty sortEq
51 describe "Parallel loops" $ loops parallely sort sort
53 describe "Bind and Monoidal composition combinations" $ do
54 -- XXX Taking a long time when parallelOps is used.
55 bindAndComposeSimpleOps "Parallel" sortEq parallely
56 bindAndComposeHierarchyOps "Parallel" parallely
57 parallelOps $ nestTwoStreams "Parallel" sort sort
58 parallelOps $ nestTwoStreamsApp "Parallel" sort sort
60 describe "Semigroup operations" $ do
61 parallelOps $ semigroupOps "parallely" sortEq
63 describe "Applicative operations" $ do
64 parallelOps $ applicativeOps folded "parallely applicative folded" sortEq
66 -- XXX add tests for indexed/indexedR
67 describe "Zip operations" $ do
68 -- We test only the serial zip with serial streams and the parallel
69 -- stream, because the rate setting in these streams can slow down
70 -- zipAsync.
71 parallelOps $ prop "zip monadic parallely" . zipMonadic S.fromFoldable (==)
72 parallelOps $ prop "zip monadic parallely folded" . zipMonadic folded (==)
74 -- XXX add merge tests like zip tests
75 -- for mergeBy, we can split a list randomly into two lists and
76 -- then merge them, it should result in original list
77 -- describe "Merge operations" $ do
79 describe "Monad operations" $ do
80 parallelOps $ prop "parallely monad then" . monadThen S.fromFoldable sortEq
81 parallelOps $ prop "parallely monad then folded" . monadThen folded sortEq
82 parallelOps $ prop "parallely monad bind" . monadBind S.fromFoldable sortEq
83 parallelOps $ prop "parallely monad bind folded" . monadBind folded sortEq
85 describe "Stream transform and combine operations" $ do
86 parallelOps $ transformCombineOpsCommon S.fromFoldable "parallely" sortEq
87 parallelOps $ transformCombineOpsCommon folded "parallely" sortEq
89 describe "Stream elimination operations" $ do
90 parallelOps $ eliminationOps S.fromFoldable "parallely"
91 parallelOps $ eliminationOps folded "parallely folded"
92 parallelOps $ eliminationOpsWord8 S.fromFoldable "parallely"
93 parallelOps $ eliminationOpsWord8 folded "parallely folded"
95 -- test both (<>) and mappend to make sure we are using correct instance
96 -- for Monoid that is using the right version of semigroup. Instance
97 -- deriving can cause us to pick wrong instances sometimes.
99#ifdef DEVBUILD
100 describe "Parallel (<>) time order check" $ parallelCheck parallely (<>)
101 describe "Parallel mappend time order check" $ parallelCheck parallely mappend
102#endif
104 describe "Composed MonadThrow parallely" $ composeWithMonadThrow parallely
106#ifdef DEVBUILD
107 -- parallely fails on CI machines, may need more difference in times of
108 -- the events, but that would make tests even slower.
109 it "take 1 parallely" $ checkCleanup 3 parallely (S.take 1)
110 it "takeWhile (< 0) parallely" $ checkCleanup 3 parallely (S.takeWhile (< 0))
111#endif