comfort-graph-0.0.5.1: test/Test/Data/Graph/Comfort.hs
-- Do not edit! Automatically created with doctest-extract from src/Data/Graph/Comfort.hs
{-# LINE 103 "src/Data/Graph/Comfort.hs" #-}
module Test.Data.Graph.Comfort where
import Test.DocTest.Base
import qualified Test.DocTest.Driver as DocTest
{-# LINE 104 "src/Data/Graph/Comfort.hs" #-}
import Test.Base
import qualified Test.Data.Graph.Alternative as GraphAlt
import qualified Data.Graph.Comfort as Graph
import qualified Data.Map as Map
import qualified Data.Set as Set
import qualified Data.Char as Char
import Data.Graph.Comfort (Graph, DirEdge(DirEdge), UndirEdge(UndirEdge))
import Data.Tree (Forest)
import Data.Map (Map)
import Data.Tuple.HT (mapSnd)
import qualified Control.Monad.Trans.Class as MT
import qualified Control.Monad.Trans.State as MS
import Control.Applicative (pure)
import Data.Functor.Identity (Identity(Identity), runIdentity)
import qualified Test.QuickCheck as QC
import Test.QuickCheck ((==>), (===))
deleteNodeIfExists :: Node -> MonoGraph -> MonoGraph
deleteNodeIfExists n gr =
maybe gr (const $ Graph.deleteNode n gr) $ Graph.lookupNode n gr
isolated :: (Graph.Edge e, Ord n) => Graph.Graph e n el nl -> n -> Bool
isolated gr n = Set.null (Graph.adjacentEdgeSet gr n)
nodeAction :: (Monad m) => NodeLabel -> MS.StateT NodeLabel m NodeLabel
nodeAction x = do y <- MS.get; MS.put x; return y
evalTraverseNode :: NodeLabel -> MonoGraph -> MonoGraph
evalTraverseNode nl =
flip MS.evalState nl . Graph.traverseNode nodeAction
edgeAction :: (Monad m) => EdgeLabel -> MS.StateT EdgeLabel m EdgeLabel
edgeAction x = MS.modify (x+) >> MS.get
evalTraverseEdge :: EdgeLabel -> MonoGraph -> MonoGraph
evalTraverseEdge el =
flip MS.evalState el . Graph.traverseEdge edgeAction
evalTraverse :: NodeLabel -> EdgeLabel -> MonoGraph -> MonoGraph
evalTraverse nl el =
flip MS.evalState el . flip MS.evalStateT nl .
Graph.traverse nodeAction (MT.lift . edgeAction)
(*-*) :: n -> n -> UndirEdge n
(*-*) = UndirEdge
(*->) :: n -> n -> DirEdge n
(*->) = DirEdge
unlabGraph ::
(Graph.Edge edge, Ord (edge node), Ord node) =>
[node] -> [edge node] -> Graph edge node () ()
unlabGraph ns es =
let label = map (flip (,) ()) in
Graph.fromMap
(Map.fromList $ label $ ns ++ map Graph.from es ++ map Graph.to es)
(Map.fromList $ label es)
addReversedEdges ::
(Ord node) => Graph DirEdge node el nl -> Graph DirEdge node el nl
addReversedEdges gr =
Graph.fromMap
(Graph.nodeLabels gr)
(Map.union
(Graph.edgeLabels gr)
(Map.mapKeys (\(Graph.DirEdge f t) -> Graph.DirEdge t f) $
Graph.edgeLabels gr))
genShuffledGraph ::
(Graph.Edge e, Functor e, Ord a) =>
Graph e a el nl -> QC.Gen (Graph e Int el nl, Map a Int)
genShuffledGraph gr = do
shuffledNodes <- QC.shuffle $ Graph.nodes gr
let nodeMap = Map.fromList $ zip shuffledNodes [(0::Int)..]
let mapNode n = nodeMap Map.! n
return (Graph.mapKeys mapNode (fmap mapNode) gr, nodeMap)
test :: DocTest.T ()
test = do
DocTest.printPrefix "Data.Graph.Comfort:424: "
{-# LINE 424 "src/Data/Graph/Comfort.hs" #-}
DocTest.property(
{-# LINE 424 "src/Data/Graph/Comfort.hs" #-}
\(TestGraph gr) -> Graph.isConsistent (Graph.reverse gr)
)
DocTest.printPrefix "Data.Graph.Comfort:425: "
{-# LINE 425 "src/Data/Graph/Comfort.hs" #-}
DocTest.property(
{-# LINE 425 "src/Data/Graph/Comfort.hs" #-}
\(TestGraph gr) -> Graph.reverse (Graph.reverse gr) === gr
)
DocTest.printPrefix "Data.Graph.Comfort:476: "
{-# LINE 476 "src/Data/Graph/Comfort.hs" #-}
DocTest.property(
{-# LINE 476 "src/Data/Graph/Comfort.hs" #-}
Graph.isEmpty (Graph.empty :: MonoGraph)
)
DocTest.printPrefix "Data.Graph.Comfort:477: "
{-# LINE 477 "src/Data/Graph/Comfort.hs" #-}
DocTest.property(
{-# LINE 477 "src/Data/Graph/Comfort.hs" #-}
Graph.isConsistent (Graph.empty :: MonoGraph)
)
DocTest.printPrefix "Data.Graph.Comfort:530: "
{-# LINE 530 "src/Data/Graph/Comfort.hs" #-}
DocTest.property(
{-# LINE 530 "src/Data/Graph/Comfort.hs" #-}
\(GraphAndEdge gr e) -> Graph.lookupEdge e gr === Map.lookup e (Graph.edgeLabels gr)
)
DocTest.printPrefix "Data.Graph.Comfort:548: "
{-# LINE 548 "src/Data/Graph/Comfort.hs" #-}
DocTest.property(
{-# LINE 548 "src/Data/Graph/Comfort.hs" #-}
\(TestGraph gr) n -> Graph.lookupNode n gr === Map.lookup n (Graph.nodeLabels gr)
)
DocTest.printPrefix "Data.Graph.Comfort:599: "
{-# LINE 599 "src/Data/Graph/Comfort.hs" #-}
DocTest.property(
{-# LINE 599 "src/Data/Graph/Comfort.hs" #-}
\(TestGraph gr) n -> Graph.isConsistent $ deleteNodeIfExists n gr
)
DocTest.printPrefix "Data.Graph.Comfort:600: "
{-# LINE 600 "src/Data/Graph/Comfort.hs" #-}
DocTest.property(
{-# LINE 600 "src/Data/Graph/Comfort.hs" #-}
\(TestGraph gr) n nl -> Graph.deleteNode n (Graph.insertNode n nl gr) === deleteNodeIfExists n gr
)
DocTest.printPrefix "Data.Graph.Comfort:601: "
{-# LINE 601 "src/Data/Graph/Comfort.hs" #-}
DocTest.property(
{-# LINE 601 "src/Data/Graph/Comfort.hs" #-}
\(TestGraph gr) -> let isolatedNodes = filter (isolated gr) $ Graph.nodes gr in not (null isolatedNodes) ==> QC.forAll (QC.elements isolatedNodes) $ \n nl -> Graph.insertNode n nl gr === Graph.insertNode n nl (Graph.deleteNode n gr)
)
DocTest.printPrefix "Data.Graph.Comfort:627: "
{-# LINE 627 "src/Data/Graph/Comfort.hs" #-}
DocTest.property(
{-# LINE 627 "src/Data/Graph/Comfort.hs" #-}
\(GraphAndEdge gr e) -> Graph.isConsistent $ Graph.deleteEdge e gr
)
DocTest.printPrefix "Data.Graph.Comfort:628: "
{-# LINE 628 "src/Data/Graph/Comfort.hs" #-}
DocTest.property(
{-# LINE 628 "src/Data/Graph/Comfort.hs" #-}
\(GraphAndEdge gr e) el -> Graph.deleteEdge e (Graph.insertEdge e el gr) === Graph.deleteEdge e gr
)
DocTest.printPrefix "Data.Graph.Comfort:629: "
{-# LINE 629 "src/Data/Graph/Comfort.hs" #-}
DocTest.property(
{-# LINE 629 "src/Data/Graph/Comfort.hs" #-}
\(GraphAndEdge gr e) el -> Graph.insertEdge e el gr === Graph.insertEdge e el (Graph.deleteEdge e gr)
)
DocTest.printPrefix "Data.Graph.Comfort:640: "
{-# LINE 640 "src/Data/Graph/Comfort.hs" #-}
DocTest.property(
{-# LINE 640 "src/Data/Graph/Comfort.hs" #-}
\(GraphAndEdge gr e) -> Graph.filterEdgeWithKey (\ei _ -> e/=ei) gr === Graph.deleteEdge e gr
)
DocTest.printPrefix "Data.Graph.Comfort:693: "
{-# LINE 693 "src/Data/Graph/Comfort.hs" #-}
DocTest.property(
{-# LINE 693 "src/Data/Graph/Comfort.hs" #-}
\(TestGraph gr) n nl -> Graph.isConsistent $ Graph.insertNode n nl gr
)
DocTest.printPrefix "Data.Graph.Comfort:694: "
{-# LINE 694 "src/Data/Graph/Comfort.hs" #-}
DocTest.property(
{-# LINE 694 "src/Data/Graph/Comfort.hs" #-}
\(TestGraph gr) n nl -> Graph.lookupNode n (Graph.insertNode n nl gr) === Just nl
)
DocTest.printPrefix "Data.Graph.Comfort:706: "
{-# LINE 706 "src/Data/Graph/Comfort.hs" #-}
DocTest.property(
{-# LINE 706 "src/Data/Graph/Comfort.hs" #-}
\(GraphAndEdge gr e) el -> Graph.isConsistent $ Graph.insertEdge e el gr
)
DocTest.printPrefix "Data.Graph.Comfort:707: "
{-# LINE 707 "src/Data/Graph/Comfort.hs" #-}
DocTest.property(
{-# LINE 707 "src/Data/Graph/Comfort.hs" #-}
\(GraphAndEdge gr e) el -> Graph.lookupEdge e (Graph.insertEdge e el gr) === Just el
)
DocTest.printPrefix "Data.Graph.Comfort:741: "
{-# LINE 741 "src/Data/Graph/Comfort.hs" #-}
DocTest.property(
{-# LINE 741 "src/Data/Graph/Comfort.hs" #-}
\(TestGraph gr) -> gr === Graph.fromMap (Graph.nodeLabels gr) (Graph.edgeLabels gr)
)
DocTest.printPrefix "Data.Graph.Comfort:784: "
{-# LINE 784 "src/Data/Graph/Comfort.hs" #-}
DocTest.property(
{-# LINE 784 "src/Data/Graph/Comfort.hs" #-}
\(TestGraph gr) -> Graph.mapNode id gr === gr
)
DocTest.printPrefix "Data.Graph.Comfort:797: "
{-# LINE 797 "src/Data/Graph/Comfort.hs" #-}
DocTest.property(
{-# LINE 797 "src/Data/Graph/Comfort.hs" #-}
\(TestGraph gr) -> Graph.mapEdge id gr === gr
)
DocTest.printPrefix "Data.Graph.Comfort:833: "
{-# LINE 833 "src/Data/Graph/Comfort.hs" #-}
DocTest.property(
{-# LINE 833 "src/Data/Graph/Comfort.hs" #-}
\(TestGraph gr) nl -> Graph.isConsistent $ evalTraverseNode nl gr
)
DocTest.printPrefix "Data.Graph.Comfort:834: "
{-# LINE 834 "src/Data/Graph/Comfort.hs" #-}
DocTest.property(
{-# LINE 834 "src/Data/Graph/Comfort.hs" #-}
\(TestGraph gr) -> runIdentity (Graph.traverseNode (Identity . Char.toUpper) gr) === Graph.mapNode Char.toUpper gr
)
DocTest.printPrefix "Data.Graph.Comfort:847: "
{-# LINE 847 "src/Data/Graph/Comfort.hs" #-}
DocTest.property(
{-# LINE 847 "src/Data/Graph/Comfort.hs" #-}
\(TestGraph gr) el -> Graph.isConsistent $ evalTraverseEdge el gr
)
DocTest.printPrefix "Data.Graph.Comfort:848: "
{-# LINE 848 "src/Data/Graph/Comfort.hs" #-}
DocTest.property(
{-# LINE 848 "src/Data/Graph/Comfort.hs" #-}
\(TestGraph gr) el -> runIdentity (Graph.traverseEdge (Identity . (el+)) gr) === Graph.mapEdge (el+) gr
)
DocTest.printPrefix "Data.Graph.Comfort:859: "
{-# LINE 859 "src/Data/Graph/Comfort.hs" #-}
DocTest.property(
{-# LINE 859 "src/Data/Graph/Comfort.hs" #-}
\(TestGraph gr) nl el -> Graph.isConsistent $ evalTraverse nl el gr
)
DocTest.printPrefix "Data.Graph.Comfort:860: "
{-# LINE 860 "src/Data/Graph/Comfort.hs" #-}
DocTest.property(
{-# LINE 860 "src/Data/Graph/Comfort.hs" #-}
\(TestGraph gr) nl el -> evalTraverse nl el gr === evalTraverseNode nl (evalTraverseEdge el gr)
)
DocTest.printPrefix "Data.Graph.Comfort:861: "
{-# LINE 861 "src/Data/Graph/Comfort.hs" #-}
DocTest.property(
{-# LINE 861 "src/Data/Graph/Comfort.hs" #-}
\(TestGraph gr) nl el -> evalTraverse nl el gr === evalTraverseEdge el (evalTraverseNode nl gr)
)
DocTest.printPrefix "Data.Graph.Comfort:862: "
{-# LINE 862 "src/Data/Graph/Comfort.hs" #-}
DocTest.property(
{-# LINE 862 "src/Data/Graph/Comfort.hs" #-}
\(TestGraph gr) nl -> flip MS.evalState nl (Graph.traverseNode nodeAction gr) === flip MS.evalState nl (Graph.traverse nodeAction pure gr)
)
DocTest.printPrefix "Data.Graph.Comfort:863: "
{-# LINE 863 "src/Data/Graph/Comfort.hs" #-}
DocTest.property(
{-# LINE 863 "src/Data/Graph/Comfort.hs" #-}
\(TestGraph gr) el -> flip MS.evalState el (Graph.traverseEdge edgeAction gr) === flip MS.evalState el (Graph.traverse pure edgeAction gr)
)
DocTest.printPrefix "Data.Graph.Comfort:900: "
{-# LINE 900 "src/Data/Graph/Comfort.hs" #-}
DocTest.example(
{-# LINE 900 "src/Data/Graph/Comfort.hs" #-}
Graph.depthFirstSearch $
Graph.fromList [(0,'A'),(1,'B')]
[(Graph.DirEdge 1 0, 23), (Graph.DirEdge 0 (1::Int), 42::Integer)]
)
[ExpectedLine [LineChunk "[Node {rootLabel = 0, subForest = [Node {rootLabel = 1, subForest = []}]}]"]]
DocTest.printPrefix "Data.Graph.Comfort:907: "
{-# LINE 907 "src/Data/Graph/Comfort.hs" #-}
DocTest.property(
{-# LINE 907 "src/Data/Graph/Comfort.hs" #-}
\(TestGraph gr) ->
Graph.depthFirstSearch gr === GraphAlt.depthFirstSearch gr
)
DocTest.printPrefix "Data.Graph.Comfort:944: "
{-# LINE 944 "src/Data/Graph/Comfort.hs" #-}
DocTest.example(
{-# LINE 944 "src/Data/Graph/Comfort.hs" #-}
mapSnd Graph.nodes $ Graph.topologicalSort $ unlabGraph [] ['a'*->'a']
)
[ExpectedLine [LineChunk "(\"\",\"a\")"]]
DocTest.printPrefix "Data.Graph.Comfort:946: "
{-# LINE 946 "src/Data/Graph/Comfort.hs" #-}
DocTest.example(
{-# LINE 946 "src/Data/Graph/Comfort.hs" #-}
mapSnd Graph.nodes $ Graph.topologicalSort $ unlabGraph [] ['a'*->'h', 'a'*->'p', 'g'*->'r', 'p'*->'h', 'r'*->'a']
)
[ExpectedLine [LineChunk "(\"graph\",\"\")"]]
DocTest.printPrefix "Data.Graph.Comfort:948: "
{-# LINE 948 "src/Data/Graph/Comfort.hs" #-}
DocTest.example(
{-# LINE 948 "src/Data/Graph/Comfort.hs" #-}
mapSnd Graph.nodes $ Graph.topologicalSort $ unlabGraph [] ['h'*->'a', 'a'*->'p', 'g'*->'r', 'p'*->'h', 'r'*->'a']
)
[ExpectedLine [LineChunk "(\"gr\",\"ahp\")"]]
DocTest.printPrefix "Data.Graph.Comfort:971: "
{-# LINE 971 "src/Data/Graph/Comfort.hs" #-}
DocTest.example(
{-# LINE 971 "src/Data/Graph/Comfort.hs" #-}
map Graph.nodes $ Graph.components $ unlabGraph ['d'] ['a'*->'p', 'g'*->'r', 'p'*->'h']
)
[ExpectedLine [LineChunk "[\"ahp\",\"d\",\"gr\"]"]]
DocTest.printPrefix "Data.Graph.Comfort:973: "
{-# LINE 973 "src/Data/Graph/Comfort.hs" #-}
DocTest.example(
{-# LINE 973 "src/Data/Graph/Comfort.hs" #-}
map Graph.nodes $ Graph.components $ unlabGraph ['d'] ['a'*-*'p', 'g'*-*'r', 'p'*-*'h']
)
[ExpectedLine [LineChunk "[\"ahp\",\"d\",\"gr\"]"]]
DocTest.printPrefix "Data.Graph.Comfort:1018: "
{-# LINE 1018 "src/Data/Graph/Comfort.hs" #-}
DocTest.example(
{-# LINE 1018 "src/Data/Graph/Comfort.hs" #-}
Graph.stronglyConnectedComponents $
Graph.fromList [(0,'A'),(1,'B')] [(Graph.DirEdge 0 (1::Int),42::Integer)]
)
[ExpectedLine [LineChunk "[fromList [0],fromList [1]]"]]
DocTest.printPrefix "Data.Graph.Comfort:1024: "
{-# LINE 1024 "src/Data/Graph/Comfort.hs" #-}
DocTest.example(
{-# LINE 1024 "src/Data/Graph/Comfort.hs" #-}
map Set.toAscList $ Graph.stronglyConnectedComponents $ unlabGraph ['d'] ['g'*->'r', 'r'*->'a', 'a'*->'g', 'a'*->'p', 'p'*->'h', 'h'*->'p']
)
[ExpectedLine [LineChunk "[\"agr\",\"d\",\"hp\"]"]]
DocTest.printPrefix "Data.Graph.Comfort:1030: "
{-# LINE 1030 "src/Data/Graph/Comfort.hs" #-}
DocTest.property(
{-# LINE 1030 "src/Data/Graph/Comfort.hs" #-}
\(TestGraph gr) ->
Set.fromList (Graph.stronglyConnectedComponentsNE gr)
===
Set.fromList (GraphAlt.stronglyConnectedComponents gr)
)
DocTest.printPrefix "Data.Graph.Comfort:1041: "
{-# LINE 1041 "src/Data/Graph/Comfort.hs" #-}
DocTest.property(
{-# LINE 1041 "src/Data/Graph/Comfort.hs" #-}
\forest ->
let gr = Graph.fromForest (forest :: Forest Char) in
all (\comp -> Set.size comp == 1) $ Graph.stronglyConnectedComponents gr
)
DocTest.printPrefix "Data.Graph.Comfort:1047: "
{-# LINE 1047 "src/Data/Graph/Comfort.hs" #-}
DocTest.property(
{-# LINE 1047 "src/Data/Graph/Comfort.hs" #-}
\forest -> let gr = Graph.fromForest (forest :: Forest Char) in
QC.forAll (genShuffledGraph gr) $ \(shuffled, _nodeMap) ->
all (\comp -> Set.size comp == 1) $
Graph.stronglyConnectedComponents shuffled
)
DocTest.printPrefix "Data.Graph.Comfort:1058: "
{-# LINE 1058 "src/Data/Graph/Comfort.hs" #-}
DocTest.property(
{-# LINE 1058 "src/Data/Graph/Comfort.hs" #-}
\(TestGraph gr) ->
QC.forAll (genShuffledGraph gr) $ \(shuffled, nodeMap) ->
Set.fromList
(map (Set.map (nodeMap Map.!)) $ Graph.stronglyConnectedComponents gr)
===
Set.fromList (Graph.stronglyConnectedComponents shuffled)
)
DocTest.printPrefix "Data.Graph.Comfort:1072: "
{-# LINE 1072 "src/Data/Graph/Comfort.hs" #-}
DocTest.property(
{-# LINE 1072 "src/Data/Graph/Comfort.hs" #-}
\(TestGraph gr) ->
Set.fromList (map Graph.nodeSet (Graph.components gr))
===
Set.fromList (Graph.stronglyConnectedComponents (addReversedEdges gr))
)