packages feed

algraph-0.7.0.0: test/Test/Graph/AdjacencyList/DFS.hs

module Test.Graph.AdjacencyList.DFS where

import Data.Maybe
import Data.List
import Data.List.Unique
import TestHS

import qualified Data.IntMap.Strict as IM
import qualified Data.Sequence as Seq
import qualified Data.IntSet as Set
import Data.Maybe

import qualified Data.Graph.Inductive as I
import qualified Data.Graph.Inductive.Graph as G
import qualified Data.Graph.Inductive.Query.DFS as IDFS

import Data.Graph.AdjacencyList
import Data.Graph.AdjacencyList.DFS
import Data.Graph.AdjacencyList.Grid

fastTests :: [Test]
fastTests = [ testdfs1
            , testlongest1
            , testlongest2
            , testlongest3
            , testlongest4
            , testdfs2
            , outofrange
            , getdirect
            ]

-- | DAG
graphTest1 = 
  let vs = [1..8]
      neis = (\v -> let nei 1 = [2,5,6]
                        nei 2 = [3,5]
                        nei 3 = [4,6]
                        nei 4 = [7]
                        nei 5 = [4,7]
                        nei 6 = [8,7]
                        nei 7 = []
                        nei 8 = [7]
                     in nei v
             )
   in createGraph vs neis

testdfs1 :: Test
testdfs1 = do
  let name = "Test DFS topsort on a graph with hamiltonian path"
      testgraph = graphFromEdges $ (edges graphTest1) ++ [(Edge 3 5),(Edge 5 6),(Edge 8 4)]
      out = dfs testgraph 1
      expe = [1,2,3,5,6,8,4,7]
   in case  topsort out == expe of
        True -> testPassed name $ "passed!" <> (show out)
        False -> testFailed name $ (,) (show expe) (show out)

-- | DAG
graphTest2 = 
  let vs = [1..4]
      neis = (\v -> let nei 1 = [2,3]
                        nei 2 = []
                        nei 3 = [4]
                        nei 4 = [2]
                     in nei v
             )
   in createGraph vs neis

testdfs2 :: Test
testdfs2 = do
  let name = "Test DFS on TestGraph2"
      out = dfs graphTest2 1
      expe = [1,3,4,2]
   in case  topsort out == expe of
        True -> testPassed name $ "passed!" <> (show out)
        False -> testFailed name $ (,) (show expe) (show $ topsort out)

testlongest1 :: Test
testlongest1 = do
  let name = "Test longest path 1 7 on TestGraph1"
      out = map toTuple $ longestPath graphTest1 1 7
      outdfs = dfs graphTest1 1
      expe = [(1,2),(2,3),(3,6),(6,8),(8,7)]
   in case  out == expe of
        True -> testPassed name $ "passed!" <> (show out)
        False -> testFailed name $ (,) (show expe) (show out <> show outdfs)

testlongest2 :: Test
testlongest2 = do
  let name = "Test longest path 1 8 on TestGraph1"
      out = map toTuple $ longestPath graphTest1 1 8
      tdfs = dfs graphTest1 1
      expe = [(1,2),(2,3),(3,6),(6,8)]
   in case  out == expe of
        True -> testPassed name $ "passed!" <> (show out)
        False -> testFailed name $ (,) (show expe) (show out <> show tdfs)

testlongest3 :: Test
testlongest3 = do
  let name = "Test longest path 2 8 on TestGraph2"
      out = map toTuple $ longestPath graphTest1 2 8
      expe = [(2,3),(3,6),(6,8)]
   in case  out == expe of
        True -> testPassed name $ "passed!" <> (show out)
        False -> testFailed name $ (,) (show expe) (show out)

graphTest3 = 
  let edges = 
        map fromTuple 
        [(1,3),(2,1),(2,3),(2,4),(2,5),(2,6),(4,1),(4,3),(4,5),(5,1),(5,3),(6,1),(6,3),(6,4)]
   in graphFromEdges edges

testlongest4 :: Test
testlongest4 = do
  let name = "topsort 2 3 on TestGraph3"
      tdfs = dfs graphTest3 2
      out = postordering tdfs 
      expe = [3,1,5,4,6,2]
      tgr = map (neighbors graphTest3) [1..6]
   in case  out == expe of
        True -> testPassed name $ "passed!"
        False -> testFailed name $ (,) (show expe) (show tdfs <> show tgr)

outofrange :: Test
outofrange = do
  let name = "longest from 3 to 2 on TestGraph3"
      tdfs = dfs graphTest3 3
      out  = longestPath graphTest3 3 2
   in case null out of
        True  -> testPassed name $ "passed!"
        False -> testFailed name $ (,) ("[]") (show out)

getdirect :: Test
getdirect = do
  let name = "longest of direct"
      gr = graphFromEdges $ map fromTuple [(4,5),(1,5)]
      tdfs = dfs gr 1
      out  = longestPath gr 1 5
      expe = map fromTuple [(1,5)]
   in case out == expe of
        True  -> testPassed name $ "passed!"
        False -> testFailed name $ (,) ("[(1,5)]") (show out)