@@ -9,7 +9,6 @@ import Control.Exception
9 BlockedIndefinitelyOnSTM(..), Handler(..))
9 BlockedIndefinitelyOnSTM(..), Handler(..))
10import Control.Monad (when, forM_, replicateM_)
10import Control.Monad (when, forM_, replicateM_)
11import Data.IORef (readIORef, modifyIORef, newIORef)
11import Data.IORef (readIORef, modifyIORef, newIORef)
12−import Data.List (sort)
13import GHC.Word (Word8)
12import GHC.Word (Word8)
15import Test.Hspec.QuickCheck
14import Test.Hspec.QuickCheck
@@ -20,15 +19,11 @@ import Test.QuickCheck.Monadic (monadicIO, run)
20import Test.Hspec as H
19import Test.Hspec as H
22import Streamly
21import Streamly
24import qualified Streamly.Prelude as S
22import qualified Streamly.Prelude as S
26import Streamly.Test.Common
24import Streamly.Test.Common
27import Streamly.Test.Prelude
25import Streamly.Test.Prelude
29−sortEq :: Ord a => [a] -> [a] -> Bool
30−sortEq a b = sort a == sort b
32-------------------------------------------------------------------------------
27-------------------------------------------------------------------------------
33-- Concurrent generation
28-- Concurrent generation
34-------------------------------------------------------------------------------
29-------------------------------------------------------------------------------
@@ -259,10 +254,6 @@ zipAsyncMonadic constr eq t (a, b) = withMaxSuccess maxTestCount $
259 listEquals eq stream1 list
254 listEquals eq stream1 list
260 listEquals eq stream2 list
255 listEquals eq stream2 list
262−-------------------------------------------------------------------------------
263−-- Tests for S.groupsBy
264−-------------------------------------------------------------------------------
266main :: IO ()
257main :: IO ()
267main = hspec
258main = hspec
268 $ H.parallel
259 $ H.parallel
@@ -270,34 +261,6 @@ main = hspec
270 $ modifyMaxSuccess (const 10)
261 $ modifyMaxSuccess (const 10)
273− let folded :: IsStream t => [a] -> t IO a
274− folded = serially . (\xs ->
276− [x] -> return x -- singleton stream case
277− _ -> S.foldMapWith (<>) return xs
280− let makeCommonOps :: IsStream t => (t m a -> c) -> [(String, t m a -> c)]
283−#ifndef COVERAGE_BUILD
284− , ("rate AvgRate 10000", t . avgRate 10000)
285− , ("rate Nothing", t . rate Nothing)
286− , ("maxBuffer 0", t . maxBuffer 0)
287− , ("maxThreads 0", t . maxThreads 0)
288− , ("maxThreads 1", t . maxThreads 1)
289− , ("maxThreads -1", t . maxThreads (-1))
293− let makeOps :: IsStream t => (t m a -> c) -> [(String, t m a -> c)]
294− makeOps t = makeCommonOps t ++
296−#ifndef COVERAGE_BUILD
297− ("maxBuffer 1", t . maxBuffer 1)
301 -- For concurrent application test we need a buffer of at least size 2 to
264 -- For concurrent application test we need a buffer of at least size 2 to
302 -- allow two threads to run.
265 -- allow two threads to run.
303 let makeConcurrentAppOps :: IsStream t
266 let makeConcurrentAppOps :: IsStream t
@@ -309,19 +272,6 @@ main = hspec
312− let mapOps spec = mapM_ (\(desc, f) -> describe desc $ spec f)
313− let serialOps :: IsStream t => ((SerialT IO a -> t IO a) -> Spec) -> Spec
314− serialOps spec = mapOps spec $ makeOps serially
315−#ifndef COVERAGE_BUILD
316− <> [("rate AvgRate 0.00000001", serially . avgRate 0.00000001)]
317− <> [("maxBuffer -1", serially . maxBuffer (-1))]
319− let wSerialOps :: IsStream t => ((WSerialT IO a -> t IO a) -> Spec) -> Spec
320− wSerialOps spec = mapOps spec $ makeOps wSerially
321−#ifndef COVERAGE_BUILD
322− <> [("rate AvgRate 0.00000001", wSerially . avgRate 0.00000001)]
323− <> [("maxBuffer (-1)", wSerially . maxBuffer (-1))]
325 let asyncOps :: IsStream t => ((AsyncT IO a -> t IO a) -> Spec) -> Spec
275 let asyncOps :: IsStream t => ((AsyncT IO a -> t IO a) -> Spec) -> Spec
326 asyncOps spec = mapOps spec $ makeOps asyncly
276 asyncOps spec = mapOps spec $ makeOps asyncly
327#ifndef COVERAGE_BUILD
277#ifndef COVERAGE_BUILD
@@ -365,7 +315,6 @@ main = hspec
365 zipAsyncOps spec = mapOps spec $ makeOps zipAsyncly
315 zipAsyncOps spec = mapOps spec $ makeOps zipAsyncly
367 describe "Construction" $ do
317 describe "Construction" $ do
368− wSerialOps $ prop "wSerially replicateM" . constructWithReplicateM
369 aheadOps $ prop "aheadly replicateM" . constructWithReplicateM
318 aheadOps $ prop "aheadly replicateM" . constructWithReplicateM
370 asyncOps $ prop "asyncly replicateM" . constructWithReplicateM
319 asyncOps $ prop "asyncly replicateM" . constructWithReplicateM
371 wAsyncOps $ prop "wAsyncly replicateM" . constructWithReplicateM
320 wAsyncOps $ prop "wAsyncly replicateM" . constructWithReplicateM
@@ -381,8 +330,6 @@ main = hspec
381 -- XXX add tests for fromIndices
330 -- XXX add tests for fromIndices
383 describe "Functor operations" $ do
332 describe "Functor operations" $ do
384− wSerialOps $ functorOps S.fromFoldable "wSerially" (==)
385− wSerialOps $ functorOps folded "wSerially folded" (==)
386 aheadOps $ functorOps S.fromFoldable "aheadly" (==)
333 aheadOps $ functorOps S.fromFoldable "aheadly" (==)
387 aheadOps $ functorOps folded "aheadly folded" (==)
334 aheadOps $ functorOps folded "aheadly folded" (==)
388 asyncOps $ functorOps S.fromFoldable "asyncly" sortEq
335 asyncOps $ functorOps S.fromFoldable "asyncly" sortEq
@@ -397,7 +344,6 @@ main = hspec
397 zipAsyncOps $ functorOps folded "zipAsyncly folded" (==)
344 zipAsyncOps $ functorOps folded "zipAsyncly folded" (==)
399 describe "Semigroup operations" $ do
346 describe "Semigroup operations" $ do
400− wSerialOps $ semigroupOps "wSerially" (==)
401 aheadOps $ semigroupOps "aheadly" (==)
347 aheadOps $ semigroupOps "aheadly" (==)
402 asyncOps $ semigroupOps "asyncly" sortEq
348 asyncOps $ semigroupOps "asyncly" sortEq
403 wAsyncOps $ semigroupOps "wAsyncly" sortEq
349 wAsyncOps $ semigroupOps "wAsyncly" sortEq
@@ -406,8 +352,6 @@ main = hspec
406 zipAsyncOps $ semigroupOps "zipAsyncly" (==)
352 zipAsyncOps $ semigroupOps "zipAsyncly" (==)
408 describe "Applicative operations" $ do
354 describe "Applicative operations" $ do
409− wSerialOps $ prop "wSerially applicative" . applicativeOps S.fromFoldable sortEq
410− wSerialOps $ prop "wSerially applicative folded" . applicativeOps folded sortEq
411 aheadOps $ prop "aheadly applicative" . applicativeOps S.fromFoldable (==)
355 aheadOps $ prop "aheadly applicative" . applicativeOps S.fromFoldable (==)
412 aheadOps $ prop "aheadly applicative folded" . applicativeOps folded (==)
356 aheadOps $ prop "aheadly applicative folded" . applicativeOps folded (==)
413 asyncOps $ prop "asyncly applicative" . applicativeOps S.fromFoldable sortEq
357 asyncOps $ prop "asyncly applicative" . applicativeOps S.fromFoldable sortEq
@@ -426,8 +370,6 @@ main = hspec
426 -- We test only the serial zip with serial streams and the parallel
370 -- We test only the serial zip with serial streams and the parallel
427 -- stream, because the rate setting in these streams can slow down
371 -- stream, because the rate setting in these streams can slow down
428 -- zipAsync.
372 -- zipAsync.
429− wSerialOps $ prop "zip monadic wSerially" . zipMonadic S.fromFoldable (==)
430− wSerialOps $ prop "zip monadic wSerially folded" . zipMonadic folded (==)
431 aheadOps $ prop "zip monadic aheadly" . zipAsyncMonadic S.fromFoldable (==)
373 aheadOps $ prop "zip monadic aheadly" . zipAsyncMonadic S.fromFoldable (==)
432 aheadOps $ prop "zip monadic aheadly folded" . zipAsyncMonadic folded (==)
374 aheadOps $ prop "zip monadic aheadly folded" . zipAsyncMonadic folded (==)
433 asyncOps $ prop "zip monadic asyncly" . zipAsyncMonadic S.fromFoldable (==)
375 asyncOps $ prop "zip monadic asyncly" . zipAsyncMonadic S.fromFoldable (==)
@@ -443,25 +385,21 @@ main = hspec
443 -- describe "Merge operations" $ do
385 -- describe "Merge operations" $ do
445 describe "Monad operations" $ do
387 describe "Monad operations" $ do
446− wSerialOps $ prop "wSerially monad then" . monadThen S.fromFoldable sortEq
447 aheadOps $ prop "aheadly monad then" . monadThen S.fromFoldable (==)
388 aheadOps $ prop "aheadly monad then" . monadThen S.fromFoldable (==)
448 asyncOps $ prop "asyncly monad then" . monadThen S.fromFoldable sortEq
389 asyncOps $ prop "asyncly monad then" . monadThen S.fromFoldable sortEq
449 wAsyncOps $ prop "wAsyncly monad then" . monadThen S.fromFoldable sortEq
390 wAsyncOps $ prop "wAsyncly monad then" . monadThen S.fromFoldable sortEq
450 parallelOps $ prop "parallely monad then" . monadThen S.fromFoldable sortEq
391 parallelOps $ prop "parallely monad then" . monadThen S.fromFoldable sortEq
452− wSerialOps $ prop "wSerially monad then folded" . monadThen folded sortEq
453 aheadOps $ prop "aheadly monad then folded" . monadThen folded (==)
393 aheadOps $ prop "aheadly monad then folded" . monadThen folded (==)
454 asyncOps $ prop "asyncly monad then folded" . monadThen folded sortEq
394 asyncOps $ prop "asyncly monad then folded" . monadThen folded sortEq
455 wAsyncOps $ prop "wAsyncly monad then folded" . monadThen folded sortEq
395 wAsyncOps $ prop "wAsyncly monad then folded" . monadThen folded sortEq
456 parallelOps $ prop "parallely monad then folded" . monadThen folded sortEq
396 parallelOps $ prop "parallely monad then folded" . monadThen folded sortEq
458− wSerialOps $ prop "wSerially monad bind" . monadBind S.fromFoldable sortEq
459 aheadOps $ prop "aheadly monad bind" . monadBind S.fromFoldable (==)
398 aheadOps $ prop "aheadly monad bind" . monadBind S.fromFoldable (==)
460 asyncOps $ prop "asyncly monad bind" . monadBind S.fromFoldable sortEq
399 asyncOps $ prop "asyncly monad bind" . monadBind S.fromFoldable sortEq
461 wAsyncOps $ prop "wAsyncly monad bind" . monadBind S.fromFoldable sortEq
400 wAsyncOps $ prop "wAsyncly monad bind" . monadBind S.fromFoldable sortEq
462 parallelOps $ prop "parallely monad bind" . monadBind S.fromFoldable sortEq
401 parallelOps $ prop "parallely monad bind" . monadBind S.fromFoldable sortEq
464− wSerialOps $ prop "wSerially monad bind folded" . monadBind folded sortEq
465 aheadOps $ prop "aheadly monad bind folded" . monadBind folded (==)
403 aheadOps $ prop "aheadly monad bind folded" . monadBind folded (==)
466 asyncOps $ prop "asyncly monad bind folded" . monadBind folded sortEq
404 asyncOps $ prop "asyncly monad bind folded" . monadBind folded sortEq
467 wAsyncOps $ prop "wAsyncly monad bind folded" . monadBind folded sortEq
405 wAsyncOps $ prop "wAsyncly monad bind folded" . monadBind folded sortEq
@@ -493,7 +431,7 @@ main = hspec
493 forOps (mkOps parallely) $ concurrentOps folded "parallely folded" sortEq
431 forOps (mkOps parallely) $ concurrentOps folded "parallely folded" sortEq
495 describe "Concurrent application" $ do
433 describe "Concurrent application" $ do
496− serialOps $ prop "serial" . concurrentApplication (==)
434+-- serialOps $ prop "serial" . concurrentApplication (==)
497 asyncOps $ prop "async" . concurrentApplication sortEq
435 asyncOps $ prop "async" . concurrentApplication sortEq
498 aheadOps $ prop "ahead" . concurrentApplication (==)
436 aheadOps $ prop "ahead" . concurrentApplication (==)
499 parallelConcurrentAppOps $
437 parallelConcurrentAppOps $
@@ -505,7 +443,6 @@ main = hspec
505 concurrentFoldlApplication
443 concurrentFoldlApplication
507 describe "Stream transform and combine operations" $ do
445 describe "Stream transform and combine operations" $ do
508− wSerialOps $ transformCombineOpsCommon S.fromFoldable "wSerially" sortEq
509 aheadOps $ transformCombineOpsCommon S.fromFoldable "aheadly" (==)
446 aheadOps $ transformCombineOpsCommon S.fromFoldable "aheadly" (==)
510 asyncOps $ transformCombineOpsCommon S.fromFoldable "asyncly" sortEq
447 asyncOps $ transformCombineOpsCommon S.fromFoldable "asyncly" sortEq
511 wAsyncOps $ transformCombineOpsCommon S.fromFoldable "wAsyncly" sortEq
448 wAsyncOps $ transformCombineOpsCommon S.fromFoldable "wAsyncly" sortEq
@@ -513,7 +450,6 @@ main = hspec
513 zipSerialOps $ transformCombineOpsCommon S.fromFoldable "zipSerially" (==)
450 zipSerialOps $ transformCombineOpsCommon S.fromFoldable "zipSerially" (==)
514 zipAsyncOps $ transformCombineOpsCommon S.fromFoldable "zipAsyncly" (==)
451 zipAsyncOps $ transformCombineOpsCommon S.fromFoldable "zipAsyncly" (==)
516− wSerialOps $ transformCombineOpsCommon folded "wSerially" sortEq
517 aheadOps $ transformCombineOpsCommon folded "aheadly" (==)
453 aheadOps $ transformCombineOpsCommon folded "aheadly" (==)
518 asyncOps $ transformCombineOpsCommon folded "asyncly" sortEq
454 asyncOps $ transformCombineOpsCommon folded "asyncly" sortEq
519 wAsyncOps $ transformCombineOpsCommon folded "wAsyncly" sortEq
455 wAsyncOps $ transformCombineOpsCommon folded "wAsyncly" sortEq
@@ -530,7 +466,6 @@ main = hspec
530 zipAsyncOps $ transformCombineOpsOrdered folded "zipAsyncly" (==)
466 zipAsyncOps $ transformCombineOpsOrdered folded "zipAsyncly" (==)
532 describe "Stream elimination operations" $ do
468 describe "Stream elimination operations" $ do
533− wSerialOps $ eliminationOps S.fromFoldable "wSerially"
534 aheadOps $ eliminationOps S.fromFoldable "aheadly"
469 aheadOps $ eliminationOps S.fromFoldable "aheadly"
535 asyncOps $ eliminationOps S.fromFoldable "asyncly"
470 asyncOps $ eliminationOps S.fromFoldable "asyncly"
536 wAsyncOps $ eliminationOps S.fromFoldable "wAsyncly"
471 wAsyncOps $ eliminationOps S.fromFoldable "wAsyncly"
@@ -538,7 +473,6 @@ main = hspec
538 zipSerialOps $ eliminationOps S.fromFoldable "zipSerially"
473 zipSerialOps $ eliminationOps S.fromFoldable "zipSerially"
539 zipAsyncOps $ eliminationOps S.fromFoldable "zipAsyncly"
474 zipAsyncOps $ eliminationOps S.fromFoldable "zipAsyncly"
541− wSerialOps $ eliminationOps folded "wSerially folded"
542 aheadOps $ eliminationOps folded "aheadly folded"
476 aheadOps $ eliminationOps folded "aheadly folded"
543 asyncOps $ eliminationOps folded "asyncly folded"
477 asyncOps $ eliminationOps folded "asyncly folded"
544 wAsyncOps $ eliminationOps folded "wAsyncly folded"
478 wAsyncOps $ eliminationOps folded "wAsyncly folded"
@@ -546,7 +480,6 @@ main = hspec
546 zipSerialOps $ eliminationOps folded "zipSerially folded"
480 zipSerialOps $ eliminationOps folded "zipSerially folded"
547 zipAsyncOps $ eliminationOps folded "zipAsyncly folded"
481 zipAsyncOps $ eliminationOps folded "zipAsyncly folded"
549− wSerialOps $ eliminationOpsWord8 S.fromFoldable "wSerially"
550 aheadOps $ eliminationOpsWord8 S.fromFoldable "aheadly"
483 aheadOps $ eliminationOpsWord8 S.fromFoldable "aheadly"
551 asyncOps $ eliminationOpsWord8 S.fromFoldable "asyncly"
484 asyncOps $ eliminationOpsWord8 S.fromFoldable "asyncly"
552 wAsyncOps $ eliminationOpsWord8 S.fromFoldable "wAsyncly"
485 wAsyncOps $ eliminationOpsWord8 S.fromFoldable "wAsyncly"
@@ -554,7 +487,6 @@ main = hspec
554 zipSerialOps $ eliminationOpsWord8 S.fromFoldable "zipSerially"
487 zipSerialOps $ eliminationOpsWord8 S.fromFoldable "zipSerially"
555 zipAsyncOps $ eliminationOpsWord8 S.fromFoldable "zipAsyncly"
488 zipAsyncOps $ eliminationOpsWord8 S.fromFoldable "zipAsyncly"
557− wSerialOps $ eliminationOpsWord8 folded "wSerially folded"
558 aheadOps $ eliminationOpsWord8 folded "aheadly folded"
490 aheadOps $ eliminationOpsWord8 folded "aheadly folded"
559 asyncOps $ eliminationOpsWord8 folded "asyncly folded"
491 asyncOps $ eliminationOpsWord8 folded "asyncly folded"
560 wAsyncOps $ eliminationOpsWord8 folded "wAsyncly folded"
492 wAsyncOps $ eliminationOpsWord8 folded "wAsyncly folded"
@@ -565,12 +497,10 @@ main = hspec
565 -- XXX Add a test where we chain all transformation APIs and make sure that
497 -- XXX Add a test where we chain all transformation APIs and make sure that
566 -- the state is being passed through all of them.
498 -- the state is being passed through all of them.
567 describe "Stream serial elimination operations" $ do
499 describe "Stream serial elimination operations" $ do
568− wSerialOps $ eliminationOpsOrdered S.fromFoldable "wSerially"
569 aheadOps $ eliminationOpsOrdered S.fromFoldable "aheadly"
500 aheadOps $ eliminationOpsOrdered S.fromFoldable "aheadly"
570 zipSerialOps $ eliminationOpsOrdered S.fromFoldable "zipSerially"
501 zipSerialOps $ eliminationOpsOrdered S.fromFoldable "zipSerially"
571 zipAsyncOps $ eliminationOpsOrdered S.fromFoldable "zipAsyncly"
502 zipAsyncOps $ eliminationOpsOrdered S.fromFoldable "zipAsyncly"
573− wSerialOps $ eliminationOpsOrdered folded "wSerially folded"
574 aheadOps $ eliminationOpsOrdered folded "aheadly folded"
504 aheadOps $ eliminationOpsOrdered folded "aheadly folded"
575 zipSerialOps $ eliminationOpsOrdered folded "zipSerially folded"
505 zipSerialOps $ eliminationOpsOrdered folded "zipSerially folded"
576 zipAsyncOps $ eliminationOpsOrdered folded "zipAsyncly folded"
506 zipAsyncOps $ eliminationOpsOrdered folded "zipAsyncly folded"