ghcide-1.6.0.0: test/exe/Progress.hs
{-# LANGUAGE PackageImports #-}
module Progress (tests) where
import Control.Concurrent.STM
import Data.Foldable (for_)
import qualified Data.HashMap.Strict as Map
import Development.IDE (NormalizedFilePath)
import Development.IDE.Core.ProgressReporting
import qualified "list-t" ListT
import qualified StmContainers.Map as STM
import Test.Tasty
import Test.Tasty.HUnit
tests :: TestTree
tests = testGroup "Progress"
[ reportProgressTests
]
data InProgressModel = InProgressModel {
done, todo :: Int,
current :: Map.HashMap NormalizedFilePath Int
}
reportProgressTests :: TestTree
reportProgressTests = testGroup "recordProgress"
[ test "addNew" addNew
, test "increase" increase
, test "decrease" decrease
, test "done" done
]
where
p0 = pure $ InProgressModel 0 0 mempty
addNew = recordProgressModel "A" succ p0
increase = recordProgressModel "A" succ addNew
decrease = recordProgressModel "A" succ increase
done = recordProgressModel "A" pred decrease
recordProgressModel key change state =
model state $ \st -> recordProgress st key change
model stateModelIO k = do
state <- fromModel =<< stateModelIO
k state
toModel state
test name p = testCase name $ do
InProgressModel{..} <- p
(done, todo) @?= (length (filter (==0) (Map.elems current)), Map.size current)
fromModel :: InProgressModel -> IO InProgressState
fromModel InProgressModel{..} = do
doneVar <- newTVarIO done
todoVar <- newTVarIO todo
currentVar <- STM.newIO
atomically $ for_ (Map.toList current) $ \(k,v) -> STM.insert v k currentVar
return InProgressState{..}
toModel :: InProgressState -> IO InProgressModel
toModel InProgressState{..} = atomically $ do
done <- readTVar doneVar
todo <- readTVar todoVar
current <- Map.fromList <$> ListT.toList (STM.listT currentVar)
return InProgressModel{..}