Refactor Async ops into a separate test suite.

This commit is contained in:
Pranay Sashank 2020-07-25 05:35:36 +05:30
parent 7d4cf315f4
commit b8916dc43f
3 changed files with 86 additions and 24 deletions

View File

@ -624,6 +624,14 @@ test-suite Prelude.Ahead
other-modules: Streamly.Test.Common other-modules: Streamly.Test.Common
, Streamly.Test.Prelude , Streamly.Test.Prelude
test-suite Prelude.Async
import: test-options, prelude-test-options
type: exitcode-stdio-1.0
main-is: Streamly/Test/Prelude/Async.hs
ghc-options: -main-is Streamly.Test.Prelude.Async.main
other-modules: Streamly.Test.Common
, Streamly.Test.Prelude
test-suite array-test test-suite array-test
import: test-options import: test-options
type: exitcode-stdio-1.0 type: exitcode-stdio-1.0

View File

@ -229,11 +229,6 @@ main = hspec
#endif #endif
] ]
let asyncOps :: IsStream t => ((AsyncT IO a -> t IO a) -> Spec) -> Spec
asyncOps spec = mapOps spec $ makeOps asyncly
#ifndef COVERAGE_BUILD
<> [("maxBuffer (-1)", asyncly . maxBuffer (-1))]
#endif
let wAsyncOps :: IsStream t => ((WAsyncT IO a -> t IO a) -> Spec) -> Spec let wAsyncOps :: IsStream t => ((WAsyncT IO a -> t IO a) -> Spec) -> Spec
wAsyncOps spec = mapOps spec $ makeOps wAsyncly wAsyncOps spec = mapOps spec $ makeOps wAsyncly
#ifndef COVERAGE_BUILD #ifndef COVERAGE_BUILD
@ -255,7 +250,6 @@ main = hspec
mapOps spec $ makeConcurrentAppOps parallely <> parallelCommonOps mapOps spec $ makeConcurrentAppOps parallely <> parallelCommonOps
describe "Construction" $ do describe "Construction" $ do
asyncOps $ prop "asyncly replicateM" . constructWithReplicateM
wAsyncOps $ prop "wAsyncly replicateM" . constructWithReplicateM wAsyncOps $ prop "wAsyncly replicateM" . constructWithReplicateM
parallelOps $ prop "parallely replicateM" . constructWithReplicateM parallelOps $ prop "parallely replicateM" . constructWithReplicateM
@ -269,21 +263,16 @@ main = hspec
-- XXX add tests for fromIndices -- XXX add tests for fromIndices
describe "Functor operations" $ do describe "Functor operations" $ do
asyncOps $ functorOps S.fromFoldable "asyncly" sortEq
asyncOps $ functorOps folded "asyncly folded" sortEq
wAsyncOps $ functorOps S.fromFoldable "wAsyncly" sortEq wAsyncOps $ functorOps S.fromFoldable "wAsyncly" sortEq
wAsyncOps $ functorOps folded "wAsyncly folded" sortEq wAsyncOps $ functorOps folded "wAsyncly folded" sortEq
parallelOps $ functorOps S.fromFoldable "parallely" sortEq parallelOps $ functorOps S.fromFoldable "parallely" sortEq
parallelOps $ functorOps folded "parallely folded" sortEq parallelOps $ functorOps folded "parallely folded" sortEq
describe "Semigroup operations" $ do describe "Semigroup operations" $ do
asyncOps $ semigroupOps "asyncly" sortEq
wAsyncOps $ semigroupOps "wAsyncly" sortEq wAsyncOps $ semigroupOps "wAsyncly" sortEq
parallelOps $ semigroupOps "parallely" sortEq parallelOps $ semigroupOps "parallely" sortEq
describe "Applicative operations" $ do describe "Applicative operations" $ do
asyncOps $ prop "asyncly applicative" . applicativeOps S.fromFoldable sortEq
asyncOps $ prop "asyncly applicative folded" . applicativeOps folded sortEq
wAsyncOps $ prop "wAsyncly applicative" . applicativeOps S.fromFoldable sortEq wAsyncOps $ prop "wAsyncly applicative" . applicativeOps S.fromFoldable sortEq
wAsyncOps $ prop "wAsyncly applicative folded" . applicativeOps folded sortEq wAsyncOps $ prop "wAsyncly applicative folded" . applicativeOps folded sortEq
parallelOps $ prop "parallely applicative folded" . applicativeOps folded sortEq parallelOps $ prop "parallely applicative folded" . applicativeOps folded sortEq
@ -293,8 +282,6 @@ main = hspec
-- We test only the serial zip with serial streams and the parallel -- We test only the serial zip with serial streams and the parallel
-- stream, because the rate setting in these streams can slow down -- stream, because the rate setting in these streams can slow down
-- zipAsync. -- zipAsync.
asyncOps $ prop "zip monadic asyncly" . zipAsyncMonadic S.fromFoldable (==)
asyncOps $ prop "zip monadic asyncly folded" . zipAsyncMonadic folded (==)
wAsyncOps $ prop "zip monadic wAsyncly" . zipAsyncMonadic S.fromFoldable (==) wAsyncOps $ prop "zip monadic wAsyncly" . zipAsyncMonadic S.fromFoldable (==)
wAsyncOps $ prop "zip monadic wAsyncly folded" . zipAsyncMonadic folded (==) wAsyncOps $ prop "zip monadic wAsyncly folded" . zipAsyncMonadic folded (==)
parallelOps $ prop "zip monadic parallely" . zipMonadic S.fromFoldable (==) parallelOps $ prop "zip monadic parallely" . zipMonadic S.fromFoldable (==)
@ -306,19 +293,15 @@ main = hspec
-- describe "Merge operations" $ do -- describe "Merge operations" $ do
describe "Monad operations" $ do describe "Monad operations" $ do
asyncOps $ prop "asyncly monad then" . monadThen S.fromFoldable sortEq
wAsyncOps $ prop "wAsyncly monad then" . monadThen S.fromFoldable sortEq wAsyncOps $ prop "wAsyncly monad then" . monadThen S.fromFoldable sortEq
parallelOps $ prop "parallely monad then" . monadThen S.fromFoldable sortEq parallelOps $ prop "parallely monad then" . monadThen S.fromFoldable sortEq
asyncOps $ prop "asyncly monad then folded" . monadThen folded sortEq
wAsyncOps $ prop "wAsyncly monad then folded" . monadThen folded sortEq wAsyncOps $ prop "wAsyncly monad then folded" . monadThen folded sortEq
parallelOps $ prop "parallely monad then folded" . monadThen folded sortEq parallelOps $ prop "parallely monad then folded" . monadThen folded sortEq
asyncOps $ prop "asyncly monad bind" . monadBind S.fromFoldable sortEq
wAsyncOps $ prop "wAsyncly monad bind" . monadBind S.fromFoldable sortEq wAsyncOps $ prop "wAsyncly monad bind" . monadBind S.fromFoldable sortEq
parallelOps $ prop "parallely monad bind" . monadBind S.fromFoldable sortEq parallelOps $ prop "parallely monad bind" . monadBind S.fromFoldable sortEq
asyncOps $ prop "asyncly monad bind folded" . monadBind folded sortEq
wAsyncOps $ prop "wAsyncly monad bind folded" . monadBind folded sortEq wAsyncOps $ prop "wAsyncly monad bind folded" . monadBind folded sortEq
parallelOps $ prop "parallely monad bind folded" . monadBind folded sortEq parallelOps $ prop "parallely monad bind folded" . monadBind folded sortEq
@ -349,7 +332,7 @@ main = hspec
describe "Concurrent application" $ do describe "Concurrent application" $ do
-- serialOps $ prop "serial" . concurrentApplication (==) -- serialOps $ prop "serial" . concurrentApplication (==)
asyncOps $ prop "async" . concurrentApplication sortEq -- asyncOps $ prop "async" . concurrentApplication sortEq
-- aheadOps $ prop "ahead" . concurrentApplication (==) -- aheadOps $ prop "ahead" . concurrentApplication (==)
parallelConcurrentAppOps $ parallelConcurrentAppOps $
prop "parallel" . concurrentApplication sortEq prop "parallel" . concurrentApplication sortEq
@ -360,27 +343,21 @@ main = hspec
concurrentFoldlApplication concurrentFoldlApplication
describe "Stream transform and combine operations" $ do describe "Stream transform and combine operations" $ do
asyncOps $ transformCombineOpsCommon S.fromFoldable "asyncly" sortEq
wAsyncOps $ transformCombineOpsCommon S.fromFoldable "wAsyncly" sortEq wAsyncOps $ transformCombineOpsCommon S.fromFoldable "wAsyncly" sortEq
parallelOps $ transformCombineOpsCommon S.fromFoldable "parallely" sortEq parallelOps $ transformCombineOpsCommon S.fromFoldable "parallely" sortEq
asyncOps $ transformCombineOpsCommon folded "asyncly" sortEq
wAsyncOps $ transformCombineOpsCommon folded "wAsyncly" sortEq wAsyncOps $ transformCombineOpsCommon folded "wAsyncly" sortEq
parallelOps $ transformCombineOpsCommon folded "parallely" sortEq parallelOps $ transformCombineOpsCommon folded "parallely" sortEq
describe "Stream elimination operations" $ do describe "Stream elimination operations" $ do
asyncOps $ eliminationOps S.fromFoldable "asyncly"
wAsyncOps $ eliminationOps S.fromFoldable "wAsyncly" wAsyncOps $ eliminationOps S.fromFoldable "wAsyncly"
parallelOps $ eliminationOps S.fromFoldable "parallely" parallelOps $ eliminationOps S.fromFoldable "parallely"
asyncOps $ eliminationOps folded "asyncly folded"
wAsyncOps $ eliminationOps folded "wAsyncly folded" wAsyncOps $ eliminationOps folded "wAsyncly folded"
parallelOps $ eliminationOps folded "parallely folded" parallelOps $ eliminationOps folded "parallely folded"
asyncOps $ eliminationOpsWord8 S.fromFoldable "asyncly"
wAsyncOps $ eliminationOpsWord8 S.fromFoldable "wAsyncly" wAsyncOps $ eliminationOpsWord8 S.fromFoldable "wAsyncly"
parallelOps $ eliminationOpsWord8 S.fromFoldable "parallely" parallelOps $ eliminationOpsWord8 S.fromFoldable "parallely"
asyncOps $ eliminationOpsWord8 folded "asyncly folded"
wAsyncOps $ eliminationOpsWord8 folded "wAsyncly folded" wAsyncOps $ eliminationOpsWord8 folded "wAsyncly folded"
parallelOps $ eliminationOpsWord8 folded "parallely folded" parallelOps $ eliminationOpsWord8 folded "parallely folded"

View File

@ -0,0 +1,77 @@
-- |
-- Module : Streamly.Test.Prelude.Async
-- Copyright : (c) 2020 Composewell Technologies
--
-- License : BSD-3-Clause
-- Maintainer : streamly@composewell.com
-- Stability : experimental
-- Portability : GHC
module Streamly.Test.Prelude.Async where
#if __GLASGOW_HASKELL__ < 808
import Data.Semigroup ((<>))
#endif
import Test.Hspec.QuickCheck
import Test.Hspec as H
import Streamly
import qualified Streamly.Prelude as S
import Streamly.Test.Prelude
main :: IO ()
main = hspec
$ H.parallel
#ifdef COVERAGE_BUILD
$ modifyMaxSuccess (const 10)
#endif
$ do
let asyncOps :: IsStream t => ((AsyncT IO a -> t IO a) -> Spec) -> Spec
asyncOps spec = mapOps spec $ makeOps asyncly
#ifndef COVERAGE_BUILD
<> [("maxBuffer (-1)", asyncly . maxBuffer (-1))]
#endif
describe "Construction" $ do
asyncOps $ prop "asyncly replicateM" . constructWithReplicateM
describe "Functor operations" $ do
asyncOps $ functorOps S.fromFoldable "asyncly" sortEq
asyncOps $ functorOps folded "asyncly folded" sortEq
describe "Semigroup operations" $ do
asyncOps $ semigroupOps "asyncly" sortEq
describe "Applicative operations" $ do
asyncOps $ prop "asyncly applicative" . applicativeOps S.fromFoldable sortEq
asyncOps $ prop "asyncly applicative folded" . applicativeOps folded sortEq
-- XXX add tests for indexed/indexedR
describe "Zip operations" $ do
-- We test only the serial zip with serial streams and the parallel
-- stream, because the rate setting in these streams can slow down
-- zipAsync.
asyncOps $ prop "zip monadic asyncly" . zipAsyncMonadic S.fromFoldable (==)
asyncOps $ prop "zip monadic asyncly folded" . zipAsyncMonadic folded (==)
-- XXX add merge tests like zip tests
-- for mergeBy, we can split a list randomly into two lists and
-- then merge them, it should result in original list
-- describe "Merge operations" $ do
describe "Monad operations" $ do
asyncOps $ prop "asyncly monad then" . monadThen S.fromFoldable sortEq
asyncOps $ prop "asyncly monad then folded" . monadThen folded sortEq
asyncOps $ prop "asyncly monad bind" . monadBind S.fromFoldable sortEq
asyncOps $ prop "asyncly monad bind folded" . monadBind folded sortEq
describe "Stream transform and combine operations" $ do
asyncOps $ transformCombineOpsCommon S.fromFoldable "asyncly" sortEq
asyncOps $ transformCombineOpsCommon folded "asyncly" sortEq
describe "Stream elimination operations" $ do
asyncOps $ eliminationOps S.fromFoldable "asyncly"
asyncOps $ eliminationOps folded "asyncly folded"
asyncOps $ eliminationOpsWord8 S.fromFoldable "asyncly"
asyncOps $ eliminationOpsWord8 folded "asyncly folded"