sessiontypes-0.1.0: test/Test/Debug/Main.hs
import Control.SessionTypes
import Control.SessionTypes.Debug
import Test.Program.Simple
import Test.Program.FileServer
import Test.Hspec
main :: IO ()
main = hspec $ do
describe "runSingle" $ do
it "returns True" $
runSingle (inferIdentity prog_sendRecv) (S_Send $ S_Recv True S_Eps) `shouldBe` True
it "returns the value of the first returned value in a program; '()'" $
runSingle (inferIdentity prog_branching) (S_Off1 $ S_Send S_Eps) `shouldBe` ()
it "selects a branch and returns 'c'" $
runSingle (inferIdentity prog_branching_dual) (S_Sel1 $ S_Recv "c" S_Eps) `shouldBe` "c"
it "Recurses until a 10 is given" $
runSingle (inferIdentity prog_recursion) (S_Rec $ S_Recv 7 $ S_Sel2 $ S_Sel1 $ S_Var $ S_Recv 10 $ S_Sel1 $ S_Weaken $ S_Eps) `shouldBe` 10
describe "runAll" $ do
it "returns [True]" $
runAll (inferIdentity prog_sendRecv) (S_Send $ S_Recv True S_Eps) `shouldBe` [True]
it "returns the values returned in all branches; [(),(),()]" $
runAll (inferIdentity prog_branching) (S_OffS (S_Send S_Eps) $ S_OffS (S_Send S_Eps) $ S_OffZ (S_Send S_Eps)) `shouldBe` [(),(),()]
it "returns only the final result in a list; [10]" $
runAll (inferIdentity prog_recursion) (S_Rec $ S_Recv 7 $ S_Sel2 $ S_Sel1 $ S_Var $ S_Recv 10 $ S_Sel1 $ S_Weaken $ S_Eps) `shouldBe` [10]
describe "run" $ do
it "returns O_Send followed by O_Recv" $
run (inferIdentity prog_sendRecv) (S_Send $ S_Recv True S_Eps) `shouldBe` (O_Send "c" $ O_Recv True $ O_Eps True)
it "describes the second branch" $
run (inferIdentity prog_branching) (S_Off2 $ S_Off1 $ S_Send S_Eps) `shouldBe` (O_Off2 $ O_Off1 $ O_Send True $ O_Eps ())
it "Recurses until a 10 is given" $
run (inferIdentity prog_recursion) (S_Rec $ S_Recv 7 $ S_Sel2 $ S_Sel1 $ S_Var $ S_Recv 10 $ S_Sel1 $ S_Weaken $ S_Eps) `shouldBe`
(O_Rec $ O_Recv 7 $ O_Sel2 $ O_Sel1 $ O_Var $ O_Recv 10 $ O_Sel1 $ O_Weaken $ O_Eps 10)
describe "runSingleM" $ do
it "can be used to print something to console" $ do
s <- runSingleM (client ["test.txt", "doesnotexist.txt"])
(S_Rec $ S_Sel1 $ S_Send $ S_Recv (Right "hello") $ S_Var $
S_Sel1 $ S_Send $ S_Recv (Left "File does not exist") $ S_Var $
S_Sel2 $ S_Sel1 $ S_Weaken $ S_Eps)
s `shouldBe` ["hello"]
it "can do any IO action (like readFile)" $ do
let io = runSingleM server
(S_Rec $ S_Off1 $ S_Recv "hello.txt" $ S_Send $ S_Var $
S_Off1 $ S_Recv "doesnotexist.txt" $ S_Send $ S_Var $
S_Off2 $ S_Off1 $ S_Weaken $ S_Eps)
io `shouldThrow` anyException
describe "runAllM" $ do
it "returns more than one result" $ do
s <- runAllM (client ["text.txt", "doesnotexist.txt"])
(S_Rec $ S_Sel1 $ S_Send $ S_Recv (Right "hello") $ S_Var $
S_Sel1 $ S_Send $ S_Recv (Right "text") $ S_Var $
S_Sel2 $ S_Sel1 $ S_Weaken $ S_Eps)
s `shouldBe` [["text", "hello"]]
describe "runM" $ do
it "Also describes Lifts" $ do
s <- runM (client ["text.txt", "doesnotexist.txt"])
(S_Rec $ S_Sel1 $ S_Send $ S_Recv (Right "hello") $ S_Var $
S_Sel1 $ S_Send $ S_Recv (Left "File does not exist") $ S_Var $
S_Sel2 $ S_Sel1 $ S_Weaken $ S_Eps)
s `shouldBe` (O_Rec $ O_Sel1 $ O_Send "text.txt" $ O_Recv (Right "hello") $ O_Var $
O_Sel1 $ O_Send "doesnotexist.txt" $ O_Recv (Left "File does not exist") $ O_Lift $ O_Var $
O_Sel2 $ O_Sel1 $ O_Weaken $ O_Eps ["hello"])