{-# LANGUAGE TemplateHaskell #-}
module Main where
{
import Data.OpenWitness.ST;
import Data.OpenWitness.Exception;
import Prelude;
import Test.Tasty;
import Test.Tasty.HUnit;
stuff :: ST s [Int];
stuff = do
{
ra <- newSTRef 3;
a1 <- readSTRef ra;
rb <- newSTRef 4;
b1 <- readSTRef rb;
writeSTRef ra 5;
a2 <- readSTRef ra;
writeSTRef rb 7;
b2 <- readSTRef rb;
return [a1,b1,a2,b2];
};
testST :: TestTree;
testST = testCase "ST" $ assertEqual "vals" [3,4,5,7] $ runST stuff;
intExn :: Exn Int;
intExn = $(declexn [t|Int|]);
stringExn :: Exn String;
stringExn = $(declexn [t|String|]);
data Caught = NotCaught | IntCaught Int | StringCaught String deriving (Eq,Show);
getCaught :: IO a -> IO Caught;
getCaught f = ((do
{
_ <- f;
return NotCaught;
}
`catch` intExn) (\x -> return (IntCaught x))
`catch` stringExn) (\x -> return (StringCaught x));
testCaught :: String -> Caught -> IO a -> TestTree;
testCaught name expected f = testCase name $ do
{
result <- getCaught f;
assertEqual "caught" expected result;
};
tests :: TestTree;
tests = testGroup "test"
[
testST,
testCaught "return" NotCaught $ return "hello",
testCaught "throw intExn 3" (IntCaught 3) $ throw intExn 3,
testCaught "throw stringExn text" (StringCaught "text") $ throw stringExn "text",
testCaught "throw intExn 67" (IntCaught 67) $ throw intExn 67,
testCaught "throw stringExn str" (StringCaught "str") $ throw stringExn "str"
];
main :: IO ();
main = defaultMain tests;
}