{- |
Module : Main
Description : Stream merging tests
Copyright : Ivan Lazar Miljenovic
License : MIT
Maintainer : Ivan.Miljenovic@gmail.com
-}
module Main (main) where
import Streaming.Concurrent
import Streaming.Prelude (each, toList_)
import Data.Function (on)
import Data.List (concat, sort)
import Test.Hspec (describe, hspec)
import Test.Hspec.QuickCheck (prop)
import Test.QuickCheck (Positive(..), Property, ioProperty)
import Test.QuickCheck.Instances ()
--------------------------------------------------------------------------------
main :: IO ()
main = hspec $ do
describe "Merging retains all elements" $
prop "Int Stream" (mergeCheck :: [[Int]] -> Property)
describe "Stream transformation" $ do
prop "map id" (streamMapCheckId :: Positive Int -> [Int] -> Property)
prop "map show" (streamMapCheck show :: Positive Int -> [Int] -> Property)
mergeCheck :: (Ord a) => [[a]] -> Property
mergeCheck ass = ioProperty (withMergedStreams unbounded
(map each ass)
(eqOn sort as . toList_))
where
as = concat ass
streamMapCheckId :: (Ord a) => Positive Int -> [a] -> Property
streamMapCheckId (Positive n) as =
ioProperty (withStreamMap n id (each as) (eqOn sort as . toList_))
streamMapCheck :: (Ord b) => (a -> b) -> Positive Int -> [a] -> Property
streamMapCheck f (Positive n) as =
ioProperty (withStreamMap n f (each as) (eqOn sort bs . toList_))
where
bs = map f as
eqOn :: (Eq b, Functor f) => (a -> b) -> a -> f a -> f Bool
eqOn f a = fmap (((==)`on`f) a)