packages feed

graph-core-0.1.0.0: src/Test/NodeManager.hs

{-# OPTIONS_GHC -F -pgmF htfpp #-}
module Test.NodeManager where

import Data.Graph.NodeManager

import Test.Framework
import Control.Monad.State.Strict
import qualified Data.IntMap.Strict as IM
import qualified Data.List as L

assertConsistent :: StateT (NodeManager Char) IO ()
assertConsistent = get >>= liftIO . assertEqual True . isConsistent

prop_init :: NodeMap String -> Property
prop_init m = uniqueValues m && all (>=0) (IM.keys m)
        ==> isConsistent new && m == getNodeMap new
    where new = initNodeManager m
          uniqueValues im = IM.size im == length (L.nub $ IM.elems im)

test_getNewNodesSince :: IO ()
test_getNewNodesSince =
    flip evalStateT emptyNodeManager $
        do _ <- getNodeHandle 'a'
           n2 <- getNodeHandle 'b'
           n3 <- getNodeHandle 'c'
           n4 <- getNodeHandle 'd'
           new <- gets (getNewNodesSince n2)
           liftIO $ assertEqual (IM.fromList [(n3, 'c'), (n4, 'd')]) new

test_getNodeHandle :: IO ()
test_getNodeHandle =
    flip evalStateT emptyNodeManager $
        do n1 <- getNodeHandle 'a'
           n2 <- getNodeHandle 'a'
           liftIO $ assertEqual n1 n2
           n3 <- getNodeHandle 'b'
           n4 <- getNodeHandle 'b'
           liftIO $ assertEqual n3 n4
           n5 <- getNodeHandle 'a'
           liftIO $ assertEqual n1 n5
           liftIO $ assertNotEqual n1 n3
           assertConsistent

test_lookupNode :: IO ()
test_lookupNode =
    flip evalStateT emptyNodeManager $
        do n1 <- getNodeHandle 'a'
           n2 <- getNodeHandle 'b'
           x1 <- gets $ lookupNode n1
           x2 <- gets $ lookupNode n2
           x3 <- gets $ lookupNode 123
           liftIO $ assertEqual (Just 'a') x1
           liftIO $ assertEqual (Just 'b') x2
           liftIO $ assertEqual Nothing x3
           assertConsistent