Rewrite foldl in the test suite
[list-fusion-probe.git] / tests / Test.hs
1 import Data.List.Fusion.Probe
2
3 import Test.Tasty
4 import Test.Tasty.HUnit
5
6
7 import Control.Exception
8 import Control.Monad
9
10 assertErrorCall :: String -> IO a -> IO ()
11 assertErrorCall ex action =
12     handleJust isWanted (const $ return ()) $ do
13         action
14         assertFailure $ "Expected exception: " ++ show ex
15   where isWanted (ErrorCall x) = guard $ x == ex
16
17
18 -- Since GHC-7.10, foldl fuses, so re-write it here naively to have a
19 -- non-fusing foldl
20 myFoldl :: (b -> a -> b) -> b -> [a] -> b
21 myFoldl f = go
22   where go a [] = a
23         go a (x:xs) = go (f a x) xs
24
25
26 x1, x2 :: Integer
27 x1 = myFoldl (+) 0 (fuseThis [0..1001])
28 x2 = foldr (+) 0 (fuseThis [0..1000])
29
30 main = defaultMain unitTests
31
32 unitTests = testGroup "Unit tests"
33   [ testCase "foldr fuses" $
34       x2 `compare` 500500 @?= EQ
35
36   , testCase "foldl does not fuse" $
37       assertErrorCall "fuseThis: List did not fuse" (evaluate x1)
38   ]
39
40
41