packages feed

comfort-graph-0.0.5: 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:531: "
{-# LINE 531 "src/Data/Graph/Comfort.hs" #-}
 DocTest.property(
{-# LINE 531 "src/Data/Graph/Comfort.hs" #-}
      \(GraphAndEdge gr e) -> Graph.lookupEdge e gr === Map.lookup e (Graph.edgeLabels gr)
  )
 DocTest.printPrefix "Data.Graph.Comfort:549: "
{-# LINE 549 "src/Data/Graph/Comfort.hs" #-}
 DocTest.property(
{-# LINE 549 "src/Data/Graph/Comfort.hs" #-}
      \(TestGraph gr) n -> Graph.lookupNode n gr === Map.lookup n (Graph.nodeLabels 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 -> Graph.isConsistent $ 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) n nl -> Graph.deleteNode n (Graph.insertNode n nl gr) === deleteNodeIfExists n gr
  )
 DocTest.printPrefix "Data.Graph.Comfort:602: "
{-# LINE 602 "src/Data/Graph/Comfort.hs" #-}
 DocTest.property(
{-# LINE 602 "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:628: "
{-# LINE 628 "src/Data/Graph/Comfort.hs" #-}
 DocTest.property(
{-# LINE 628 "src/Data/Graph/Comfort.hs" #-}
      \(GraphAndEdge gr e) -> Graph.isConsistent $ 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.deleteEdge e (Graph.insertEdge e el gr) === Graph.deleteEdge e gr
  )
 DocTest.printPrefix "Data.Graph.Comfort:630: "
{-# LINE 630 "src/Data/Graph/Comfort.hs" #-}
 DocTest.property(
{-# LINE 630 "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:641: "
{-# LINE 641 "src/Data/Graph/Comfort.hs" #-}
 DocTest.property(
{-# LINE 641 "src/Data/Graph/Comfort.hs" #-}
      \(GraphAndEdge gr e) -> Graph.filterEdgeWithKey (\ei _ -> e/=ei) gr === Graph.deleteEdge e 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.isConsistent $ Graph.insertNode n nl gr
  )
 DocTest.printPrefix "Data.Graph.Comfort:695: "
{-# LINE 695 "src/Data/Graph/Comfort.hs" #-}
 DocTest.property(
{-# LINE 695 "src/Data/Graph/Comfort.hs" #-}
      \(TestGraph gr) n nl -> Graph.lookupNode n (Graph.insertNode n nl gr) === Just nl
  )
 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.isConsistent $ Graph.insertEdge e el gr
  )
 DocTest.printPrefix "Data.Graph.Comfort:708: "
{-# LINE 708 "src/Data/Graph/Comfort.hs" #-}
 DocTest.property(
{-# LINE 708 "src/Data/Graph/Comfort.hs" #-}
      \(GraphAndEdge gr e) el -> Graph.lookupEdge e (Graph.insertEdge e el gr) === Just el
  )
 DocTest.printPrefix "Data.Graph.Comfort:742: "
{-# LINE 742 "src/Data/Graph/Comfort.hs" #-}
 DocTest.property(
{-# LINE 742 "src/Data/Graph/Comfort.hs" #-}
      \(TestGraph gr) -> gr === Graph.fromMap (Graph.nodeLabels gr) (Graph.edgeLabels gr)
  )
 DocTest.printPrefix "Data.Graph.Comfort:785: "
{-# LINE 785 "src/Data/Graph/Comfort.hs" #-}
 DocTest.property(
{-# LINE 785 "src/Data/Graph/Comfort.hs" #-}
      \(TestGraph gr) -> Graph.mapNode id gr === gr
  )
 DocTest.printPrefix "Data.Graph.Comfort:798: "
{-# LINE 798 "src/Data/Graph/Comfort.hs" #-}
 DocTest.property(
{-# LINE 798 "src/Data/Graph/Comfort.hs" #-}
      \(TestGraph gr) -> Graph.mapEdge id gr === 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) nl -> Graph.isConsistent $ evalTraverseNode nl gr
  )
 DocTest.printPrefix "Data.Graph.Comfort:835: "
{-# LINE 835 "src/Data/Graph/Comfort.hs" #-}
 DocTest.property(
{-# LINE 835 "src/Data/Graph/Comfort.hs" #-}
      \(TestGraph gr) -> runIdentity (Graph.traverseNode (Identity . Char.toUpper) gr) === Graph.mapNode Char.toUpper 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 -> Graph.isConsistent $ evalTraverseEdge el gr
  )
 DocTest.printPrefix "Data.Graph.Comfort:849: "
{-# LINE 849 "src/Data/Graph/Comfort.hs" #-}
 DocTest.property(
{-# LINE 849 "src/Data/Graph/Comfort.hs" #-}
      \(TestGraph gr) el -> runIdentity (Graph.traverseEdge (Identity . (el+)) gr) === Graph.mapEdge (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 -> Graph.isConsistent $ evalTraverse nl 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 === evalTraverseNode nl (evalTraverseEdge el 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 el -> evalTraverse nl el gr === evalTraverseEdge el (evalTraverseNode nl 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) nl -> flip MS.evalState nl (Graph.traverseNode nodeAction gr) === flip MS.evalState nl (Graph.traverse nodeAction pure gr)
  )
 DocTest.printPrefix "Data.Graph.Comfort:864: "
{-# LINE 864 "src/Data/Graph/Comfort.hs" #-}
 DocTest.property(
{-# LINE 864 "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:901: "
{-# LINE 901 "src/Data/Graph/Comfort.hs" #-}
 DocTest.example(
{-# LINE 901 "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:908: "
{-# LINE 908 "src/Data/Graph/Comfort.hs" #-}
 DocTest.property(
{-# LINE 908 "src/Data/Graph/Comfort.hs" #-}
        
   \(TestGraph gr) ->
   Graph.depthFirstSearch gr === GraphAlt.depthFirstSearch gr
  )
 DocTest.printPrefix "Data.Graph.Comfort:945: "
{-# LINE 945 "src/Data/Graph/Comfort.hs" #-}
 DocTest.example(
{-# LINE 945 "src/Data/Graph/Comfort.hs" #-}
    mapSnd Graph.nodes $ Graph.topologicalSort $ unlabGraph [] ['a'*->'a']
  )
  [ExpectedLine [LineChunk "(\"\",\"a\")"]]
 DocTest.printPrefix "Data.Graph.Comfort:947: "
{-# LINE 947 "src/Data/Graph/Comfort.hs" #-}
 DocTest.example(
{-# LINE 947 "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:949: "
{-# LINE 949 "src/Data/Graph/Comfort.hs" #-}
 DocTest.example(
{-# LINE 949 "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:972: "
{-# LINE 972 "src/Data/Graph/Comfort.hs" #-}
 DocTest.example(
{-# LINE 972 "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:974: "
{-# LINE 974 "src/Data/Graph/Comfort.hs" #-}
 DocTest.example(
{-# LINE 974 "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:1019: "
{-# LINE 1019 "src/Data/Graph/Comfort.hs" #-}
 DocTest.example(
{-# LINE 1019 "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:1025: "
{-# LINE 1025 "src/Data/Graph/Comfort.hs" #-}
 DocTest.example(
{-# LINE 1025 "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:1031: "
{-# LINE 1031 "src/Data/Graph/Comfort.hs" #-}
 DocTest.property(
{-# LINE 1031 "src/Data/Graph/Comfort.hs" #-}
        
   \(TestGraph gr) ->

   Set.fromList (Graph.stronglyConnectedComponentsNE gr)
   ===
   Set.fromList (GraphAlt.stronglyConnectedComponents gr)
  )
 DocTest.printPrefix "Data.Graph.Comfort:1042: "
{-# LINE 1042 "src/Data/Graph/Comfort.hs" #-}
 DocTest.property(
{-# LINE 1042 "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:1048: "
{-# LINE 1048 "src/Data/Graph/Comfort.hs" #-}
 DocTest.property(
{-# LINE 1048 "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:1059: "
{-# LINE 1059 "src/Data/Graph/Comfort.hs" #-}
 DocTest.property(
{-# LINE 1059 "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:1073: "
{-# LINE 1073 "src/Data/Graph/Comfort.hs" #-}
 DocTest.property(
{-# LINE 1073 "src/Data/Graph/Comfort.hs" #-}
        
   \(TestGraph gr) ->
   Set.fromList (map Graph.nodeSet (Graph.components gr))
   ===
   Set.fromList (Graph.stronglyConnectedComponents (addReversedEdges gr))
  )