{-# LANGUAGE RecordWildCards #-}
module Handle.LiveProgram where
-- base
import Control.Arrow
-- containers
import qualified Data.IntMap as IntMap
-- transformers
import Control.Monad.Trans.Class (MonadTrans (lift))
import Control.Monad.Trans.RWS.Strict (RWS, tell)
import qualified Control.Monad.Trans.RWS.Strict as RWS
import Control.Monad.Trans.State.Strict
-- test-framework
import Test.Framework
-- test-framework-quickcheck2
import Test.Framework.Providers.QuickCheck2
-- essence-of-live-coding
import LiveCoding
import LiveCoding.Handle
import Util.LiveProgramMigration
testHandle :: Handle (RWS () [String] Int) String
testHandle =
Handle
{ create = do
n <- RWS.get
let msg = "Handle #" ++ show n
tell ["Creating " ++ msg]
return msg
, destroy = const $ tell ["Destroyed handle"]
}
test =
testGroup
"Handle.LiveProgram"
[ testProperty
"Trigger destructors in live program"
LiveProgramMigration
{ liveProgram1 =
runHandlingState $
liveCell $
handling testHandle
>>> arrM (lift . tell . return)
>>> constM inspectHandlingState
, liveProgram2 = runHandlingState mempty
, input1 = replicate 3 ()
, input2 = replicate 3 ()
, output1 =
["Creating Handle #0", "Handle #0", "Handles: 1", "Destructors: (1,True)"]
: replicate 2 ["Handle #0", "Handles: 1", "Destructors: (1,True)"]
, output2 = [["Destroyed handle"], [], []]
, initialState = 0
}
]
where
inspectHandlingState = do
HandlingState {..} <- get
lift $
tell
[ "Handles: " ++ show nHandles
, "Destructors: " ++ unwords (show . second isRegistered <$> IntMap.toList destructors)
]