module BaseSpec.SkeletonCheckBase where
import Parrows.Definition
import Parrows.Skeletons.Topology
import Parrows.Skeletons.Map
import Parrows.Future
import Control.Arrow
import Test.Hspec
import Test.Hspec.QuickCheck
pipeSpec :: (ArrowLoopParallel (->) Int Int (),
Future fut Int (), ArrowLoopParallel (->) (fut Int) (fut Int) (),
Future fut (([Int], [Int]) ,[Int]) (), ArrowLoopParallel (->) (fut (([Int], [Int]), [Int])) (fut (([Int], [Int]), [Int])) ()) => Spec
pipeSpec = describe "Pipe Test" $ do
prop "Pipe 4 times (+1)" $ pipeTest
prop "Pipe (Future) 4 times (+1)" $ pipeSimpleTest
where
replicated :: [Int -> Int]
replicated = map (+) [1..4]
expectedValue :: Int -> Int
expectedValue x = foldl (flip ($)) x replicated
pipeTest :: Int -> Bool
pipeTest x = pipe () replicated x == expectedValue x
pipeSimpleTest :: Int -> Bool
pipeSimpleTest x = pipeSimple () replicated x == expectedValue x
pipeCombinatorTest :: Int -> Bool
pipeCombinatorTest x = (((+1) |>>>| (*2)) x) == (((+1) >>> (*2)) x)
ringSpec :: (Future fut Int (), ArrowLoopParallel (->) (Int, fut Int) (Int, fut Int) (),
ArrowLoopParallel (->) Int Int ()) => Spec
ringSpec = describe "Ring Test" $ do
prop "" $ ringTest
where
values :: Int -> [Int]
values cnt = take cnt $ [1..]
ringTest :: Int -> Bool
ringTest cnt = (ring () (\(x,y) -> (y, x+1)) (values cnt) ) == (rightRotate $ map (+1) (values cnt))
rightRotate :: [a] -> [a]
rightRotate [] = []
rightRotate xs = last xs : init xs
mapSpec :: (ArrowParallel (->) Int Int (), ArrowParallel (->) [Int] [Int] ()) => Spec
mapSpec = describe "mapTest" $ do
prop "parMap" $ parMapTest $ parMap ()
prop "parMapStream" $ parMapTest $ parMapStream () 4
prop "farm" $ parMapTest $ farm () 2
prop "farmChunk" $ parMapTest $ farmChunk () 2 4
where
parMapTest :: ((Int -> Int) -> ([Int] -> [Int])) -> [Int] -> Bool
parMapTest skel xs = skel (+1) xs == map (+1) xs
mapReduceSpec :: (ArrowParallel (->) (Int, [Int]) Int ()) => Spec
mapReduceSpec = describe "parMapReduceDirect Test" $
prop "Basic parMapReduceDirect Test" $ parMapReduceDirectTest
where
parMapReduceDirectTest :: [Int] -> Bool
parMapReduceDirectTest xs = (parMapReduceDirect () 4 (+1) (uncurry (*)) (0, xs)) == (foldl (*) 0 $ map (+1) xs)