I'm trying to test some properties with quickcheck. If these tests fail, they will almost certainly fail by nontermination.
I've been using the 'within' function to catch these nontermination cases. However, I was surprised to find that this doesn't always work.
'within' uses the 'timeout' function under the hood. Here is an example that demonstrates the problem:
import System.Timeout
import Control.Exception
works :: Int -> Int
works x = sum $ cycle [x]
doesntWork :: Int -> Int
doesntWork x = last $ cycle [x]
test1 = timeout 1 $ evaluate $ works 5 == 5 -- terminates
test2 = timeout 1 $ evaluate $ doesntWork 5 == 5 -- never terminates
test1 returns Nothing as expected, but test2 never terminates. Why?
I thought timeout exceptions are supposed to always work with pure (non FFI) Haskell code.
Is there any way I can work around this?
I'm using ghc 6.12.2
Thanks,
- Job