packages feed

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

module Test.Graph.AdjacencyList.WFI where

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

import qualified Data.IntMap.Strict as IM
import Data.Maybe

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

import Data.Graph.AdjacencyList.WFI

fastTests :: [Test]
fastTests = [ testWFI1
            , testWFI2
            , testDisconnected
            ]

-- | DAG
graphTestWFI = 
  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

graphTestDisco =
  let vs = [1..10]
      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]
                        nei 9 = [10]
                        nei 10 = []
                     in nei v
             )
   in createGraph vs neis

testWFI1 :: Test
testWFI1 = do
  let name = "Test Shortest paths Floyd-Warshall algorithm on a directed graph"
      (Distances dists) = unweightedShortestDistances graphTestWFI
      out :: [(Vertex,Rational)]
      out = IM.toList $ fromJust $ IM.lookup 1 $ dists
      expe = [(1,0),(2,1),(3,2),(4,2),(5,1),(6,1),(7,2),(8,2)]
   in case out == expe of
        True -> testPassed name $ "passed!"
        False -> testFailed name $ (,) (show expe) (show out)

testWFI2 :: Test
testWFI2 = do
  let name = "Test Shortest paths Floyd-Warshall algorithm undirected graph"
      (Distances dists) = unweightedShortestDistances $ makeUndirected graphTestWFI
      out :: [(Vertex,Rational)]
      out = IM.toList $ fromJust $ IM.lookup 1 $ dists
      expe = [(1,0),(2,1),(3,2),(4,2),(5,1),(6,1),(7,2),(8,2)]
   in case out == expe of
        True -> testPassed name $ "passed!" 
        False -> testFailed name $ (,) (show expe) (show out)

testDisconnected :: Test
testDisconnected = do
  let name = "Test Shortest paths Floyd-Warshall algorithm on disconnected graph"
      (Distances dists) = unweightedShortestDistances graphTestDisco
      out :: [(Vertex,Rational)]
      out = IM.toList $ fromJust $ IM.lookup 1 $ dists
      expe = [(1,0),(2,1),(3,2),(4,2),(5,1),(6,1),(7,2),(8,2)]
   in case out == expe of
        True -> testPassed name $ "passed!" <> (show dists)
        False -> testFailed name $ (,) (show expe) (show out)