module SingleThreadedScheduler where import Common import Control.Eff.Concurrent.Process.SingleThreadedScheduler as Scheduler test_pureScheduler :: TestTree test_pureScheduler = setTravisTestOptions $ testGroup "Pure Scheduler" [ testCase "two processes, each calculate and report back to main process" $ Right (42 :: Int) @=? Scheduler.schedulePure ( do adderChild <- spawn "test" $ do (from, arg1, arg2) <- receiveMessage sendMessage from ((arg1 + arg2) :: Int) foreverCheap $ void $ receiveAnyMessage multiplierChild <- spawn "test" $ do (from, arg1, arg2) <- receiveMessage sendMessage from ((arg1 * arg2) :: Int) me <- self sendMessage adderChild (me, 3 :: Int, 4 :: Int) x <- receiveMessage @Int sendMessage multiplierChild (me, x, 6 :: Int) receiveMessage @Int ) ] test_mainProcessSpawnsAChildAndExitsNormally :: TestTree test_mainProcessSpawnsAChildAndExitsNormally = setTravisTestOptions ( testCase "spawn a child and exit normally" ( Scheduler.defaultMain ( do void (spawn "test" (void receiveAnyMessage)) void exitNormally error "This should not happen!!" ) ) ) test_mainProcessSpawnsAChildBothExitNormally :: TestTree test_mainProcessSpawnsAChildBothExitNormally = setTravisTestOptions ( testCase "spawn a child and let it exit and exit" ( Scheduler.defaultMain ( do child <- spawn "test" ( do void (receiveMessage @String) void exitNormally error "This should not happen (child)!!" ) sendMessage child ("test" :: String) void exitNormally error "This should not happen!!" ) ) )