module RuntimeIO.Launch where
-- base
import Data.IORef
-- hunit
import Test.HUnit
-- test-framework-hunit
import Test.Framework.Providers.HUnit
-- essence-of-live-coding
import Control.Concurrent (threadDelay)
import LiveCoding
loggingHandle :: IORef [String] -> Handle IO ()
loggingHandle ref =
Handle
{ create = modifyIORef ref ("Created handle" :)
, destroy = const $ modifyIORef ref ("Destroyed handle" :)
}
testProgram :: IORef [String] -> LiveProgram (HandlingStateT IO)
testProgram ref = liveCell $ handling $ loggingHandle ref
test = testCase "HandlingStateT destroys all handles" $ do
ref <- newIORef []
launchedProgram <- launch mempty
assertRefContains ref []
update launchedProgram $ testProgram ref
assertRefContains ref ["Created handle"]
stop launchedProgram
assertRefContains ref ["Destroyed handle", "Created handle"]
assertRefContains ref messagesExpected = do
threadDelay 100000
messagesRead <- readIORef ref
messagesRead @?= messagesExpected