-- Do not edit! Automatically created with doctest-extract from src/Data/Graph/Comfort.hs {-# LINE 99 "src/Data/Graph/Comfort.hs" #-} module Test.Data.Graph.Comfort where import Test.DocTest.Base import qualified Test.DocTest.Driver as DocTest {-# LINE 100 "src/Data/Graph/Comfort.hs" #-} import Test.Base 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.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)) test :: DocTest.T () test = do DocTest.printPrefix "Data.Graph.Comfort:408: " {-# LINE 408 "src/Data/Graph/Comfort.hs" #-} DocTest.property {-# LINE 408 "src/Data/Graph/Comfort.hs" #-} (\(TestGraph gr) -> Graph.isConsistent (Graph.reverse gr)) DocTest.printPrefix "Data.Graph.Comfort:409: " {-# LINE 409 "src/Data/Graph/Comfort.hs" #-} DocTest.property {-# LINE 409 "src/Data/Graph/Comfort.hs" #-} (\(TestGraph gr) -> Graph.reverse (Graph.reverse gr) == gr) DocTest.printPrefix "Data.Graph.Comfort:460: " {-# LINE 460 "src/Data/Graph/Comfort.hs" #-} DocTest.property {-# LINE 460 "src/Data/Graph/Comfort.hs" #-} (Graph.isEmpty (Graph.empty :: MonoGraph)) DocTest.printPrefix "Data.Graph.Comfort:461: " {-# LINE 461 "src/Data/Graph/Comfort.hs" #-} DocTest.property {-# LINE 461 "src/Data/Graph/Comfort.hs" #-} (Graph.isConsistent (Graph.empty :: MonoGraph)) DocTest.printPrefix "Data.Graph.Comfort:515: " {-# LINE 515 "src/Data/Graph/Comfort.hs" #-} DocTest.property {-# LINE 515 "src/Data/Graph/Comfort.hs" #-} (\(GraphAndEdge gr e) -> Graph.lookupEdge e gr == Map.lookup e (Graph.edgeLabels gr)) DocTest.printPrefix "Data.Graph.Comfort:533: " {-# LINE 533 "src/Data/Graph/Comfort.hs" #-} DocTest.property {-# LINE 533 "src/Data/Graph/Comfort.hs" #-} (\(TestGraph gr) n -> Graph.lookupNode n gr == Map.lookup n (Graph.nodeLabels gr)) DocTest.printPrefix "Data.Graph.Comfort:584: " {-# LINE 584 "src/Data/Graph/Comfort.hs" #-} DocTest.property {-# LINE 584 "src/Data/Graph/Comfort.hs" #-} (\(TestGraph gr) n -> Graph.isConsistent $ deleteNodeIfExists n gr) DocTest.printPrefix "Data.Graph.Comfort:585: " {-# LINE 585 "src/Data/Graph/Comfort.hs" #-} DocTest.property {-# LINE 585 "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:586: " {-# LINE 586 "src/Data/Graph/Comfort.hs" #-} DocTest.property {-# LINE 586 "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:612: " {-# LINE 612 "src/Data/Graph/Comfort.hs" #-} DocTest.property {-# LINE 612 "src/Data/Graph/Comfort.hs" #-} (\(GraphAndEdge gr e) -> Graph.isConsistent $ Graph.deleteEdge e gr) DocTest.printPrefix "Data.Graph.Comfort:613: " {-# LINE 613 "src/Data/Graph/Comfort.hs" #-} DocTest.property {-# LINE 613 "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:614: " {-# LINE 614 "src/Data/Graph/Comfort.hs" #-} DocTest.property {-# LINE 614 "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:625: " {-# LINE 625 "src/Data/Graph/Comfort.hs" #-} DocTest.property {-# LINE 625 "src/Data/Graph/Comfort.hs" #-} (\(GraphAndEdge gr e) -> Graph.filterEdgeWithKey (\ei _ -> e/=ei) gr == Graph.deleteEdge e gr) DocTest.printPrefix "Data.Graph.Comfort:678: " {-# LINE 678 "src/Data/Graph/Comfort.hs" #-} DocTest.property {-# LINE 678 "src/Data/Graph/Comfort.hs" #-} (\(TestGraph gr) n nl -> Graph.isConsistent $ Graph.insertNode n nl gr) DocTest.printPrefix "Data.Graph.Comfort:679: " {-# LINE 679 "src/Data/Graph/Comfort.hs" #-} DocTest.property {-# LINE 679 "src/Data/Graph/Comfort.hs" #-} (\(TestGraph gr) n nl -> Graph.lookupNode n (Graph.insertNode n nl gr) == Just nl) DocTest.printPrefix "Data.Graph.Comfort:691: " {-# LINE 691 "src/Data/Graph/Comfort.hs" #-} DocTest.property {-# LINE 691 "src/Data/Graph/Comfort.hs" #-} (\(GraphAndEdge gr e) el -> Graph.isConsistent $ Graph.insertEdge e el gr) DocTest.printPrefix "Data.Graph.Comfort:692: " {-# LINE 692 "src/Data/Graph/Comfort.hs" #-} DocTest.property {-# LINE 692 "src/Data/Graph/Comfort.hs" #-} (\(GraphAndEdge gr e) el -> Graph.lookupEdge e (Graph.insertEdge e el gr) == Just el) DocTest.printPrefix "Data.Graph.Comfort:726: " {-# LINE 726 "src/Data/Graph/Comfort.hs" #-} DocTest.property {-# LINE 726 "src/Data/Graph/Comfort.hs" #-} (\(TestGraph gr) -> gr == Graph.fromMap (Graph.nodeLabels gr) (Graph.edgeLabels gr)) DocTest.printPrefix "Data.Graph.Comfort:746: " {-# LINE 746 "src/Data/Graph/Comfort.hs" #-} DocTest.property {-# LINE 746 "src/Data/Graph/Comfort.hs" #-} (\(TestGraph gr) -> Graph.mapNode id gr == gr) DocTest.printPrefix "Data.Graph.Comfort:759: " {-# LINE 759 "src/Data/Graph/Comfort.hs" #-} DocTest.property {-# LINE 759 "src/Data/Graph/Comfort.hs" #-} (\(TestGraph gr) -> Graph.mapEdge id gr == gr) DocTest.printPrefix "Data.Graph.Comfort:795: " {-# LINE 795 "src/Data/Graph/Comfort.hs" #-} DocTest.property {-# LINE 795 "src/Data/Graph/Comfort.hs" #-} (\(TestGraph gr) nl -> Graph.isConsistent $ evalTraverseNode nl gr) DocTest.printPrefix "Data.Graph.Comfort:796: " {-# LINE 796 "src/Data/Graph/Comfort.hs" #-} DocTest.property {-# LINE 796 "src/Data/Graph/Comfort.hs" #-} (\(TestGraph gr) -> runIdentity (Graph.traverseNode (Identity . Char.toUpper) gr) == Graph.mapNode Char.toUpper gr) DocTest.printPrefix "Data.Graph.Comfort:809: " {-# LINE 809 "src/Data/Graph/Comfort.hs" #-} DocTest.property {-# LINE 809 "src/Data/Graph/Comfort.hs" #-} (\(TestGraph gr) el -> Graph.isConsistent $ evalTraverseEdge el gr) DocTest.printPrefix "Data.Graph.Comfort:810: " {-# LINE 810 "src/Data/Graph/Comfort.hs" #-} DocTest.property {-# LINE 810 "src/Data/Graph/Comfort.hs" #-} (\(TestGraph gr) el -> runIdentity (Graph.traverseEdge (Identity . (el+)) gr) == Graph.mapEdge (el+) gr) DocTest.printPrefix "Data.Graph.Comfort:821: " {-# LINE 821 "src/Data/Graph/Comfort.hs" #-} DocTest.property {-# LINE 821 "src/Data/Graph/Comfort.hs" #-} (\(TestGraph gr) nl el -> Graph.isConsistent $ evalTraverse nl el gr) DocTest.printPrefix "Data.Graph.Comfort:822: " {-# LINE 822 "src/Data/Graph/Comfort.hs" #-} DocTest.property {-# LINE 822 "src/Data/Graph/Comfort.hs" #-} (\(TestGraph gr) nl el -> evalTraverse nl el gr == evalTraverseNode nl (evalTraverseEdge el gr)) DocTest.printPrefix "Data.Graph.Comfort:823: " {-# LINE 823 "src/Data/Graph/Comfort.hs" #-} DocTest.property {-# LINE 823 "src/Data/Graph/Comfort.hs" #-} (\(TestGraph gr) nl el -> evalTraverse nl el gr == evalTraverseEdge el (evalTraverseNode nl gr)) DocTest.printPrefix "Data.Graph.Comfort:824: " {-# LINE 824 "src/Data/Graph/Comfort.hs" #-} DocTest.property {-# LINE 824 "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:825: " {-# LINE 825 "src/Data/Graph/Comfort.hs" #-} DocTest.property {-# LINE 825 "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:885: " {-# LINE 885 "src/Data/Graph/Comfort.hs" #-} DocTest.example {-# LINE 885 "src/Data/Graph/Comfort.hs" #-} (mapSnd Graph.nodes $ Graph.topologicalSort $ unlabGraph [] ['a'*->'a']) [ExpectedLine [LineChunk "(\"\",\"a\")"]] DocTest.printPrefix "Data.Graph.Comfort:887: " {-# LINE 887 "src/Data/Graph/Comfort.hs" #-} DocTest.example {-# LINE 887 "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:889: " {-# LINE 889 "src/Data/Graph/Comfort.hs" #-} DocTest.example {-# LINE 889 "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:912: " {-# LINE 912 "src/Data/Graph/Comfort.hs" #-} DocTest.example {-# LINE 912 "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:914: " {-# LINE 914 "src/Data/Graph/Comfort.hs" #-} DocTest.example {-# LINE 914 "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:960: " {-# LINE 960 "src/Data/Graph/Comfort.hs" #-} DocTest.property {-# LINE 960 "src/Data/Graph/Comfort.hs" #-} (\(TestGraph gr) -> Set.fromList (map Graph.nodeSet (Graph.components gr)) == Set.fromList (Graph.stronglyConnectedComponents (addReversedEdges gr))) DocTest.printPrefix "Data.Graph.Comfort:957: " {-# LINE 957 "src/Data/Graph/Comfort.hs" #-} DocTest.example {-# LINE 957 "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 "[\"d\",\"hp\",\"agr\"]"]]