packages feed

algebraic-graphs-0.6.1: test/Algebra/Graph/Test/Undirected.hs

-----------------------------------------------------------------------------
-- |
-- Module     : Algebra.Graph.Test.Undirected
-- Copyright  : (c) Andrey Mokhov 2016-2022
-- License    : MIT (see the file LICENSE)
-- Maintainer : andrey.mokhov@gmail.com
-- Stability  : experimental
--
-- Testsuite for "Algebra.Graph.Undirected".
-----------------------------------------------------------------------------
module Algebra.Graph.Test.Undirected (
    -- * Testsuite
    testUndirected
    ) where

import Algebra.Graph.Undirected
import Algebra.Graph.Test
import Algebra.Graph.Test.API (toIntAPI, undirectedGraphAPI)
import Algebra.Graph.Test.Generic

import qualified Algebra.Graph as G
import qualified Algebra.Graph.Undirected as U

tPoly :: Testsuite Graph Ord
tPoly = ("Graph.Undirected.", undirectedGraphAPI)

t :: TestsuiteInt Graph
t = fmap toIntAPI tPoly

type G = Graph Int
type UGI = U.Graph Int
type AGI = G.Graph Int

testUndirected :: IO ()
testUndirected = do
    putStrLn "\n============ Graph.Undirected ============"
    test "Axioms of undirected graphs" $ size10 $ undirectedAxioms @G

    testSymmetricShow t

    putStrLn $ "\n============ Graph.Undirected.toUndirected ============"
    test "toUndirected (edge 1 2)         == edge 1 2" $
          toUndirected (G.edge 1 2)       == edge 1 (2 :: Int)

    test "toUndirected . fromUndirected   == id" $ \(x :: G) ->
          (toUndirected . fromUndirected) x == id x

    test "vertexCount      . toUndirected == vertexCount" $ \(x :: AGI) ->
          vertexCount (toUndirected x) == G.vertexCount x

    test "(*2) . edgeCount . toUndirected >= edgeCount" $ \(x :: AGI) ->
          ((*2) . edgeCount . toUndirected) x >= G.edgeCount x

    putStrLn $ "\n============ Graph.Undirected.fromUndirected ============"
    test "fromUndirected (edge 1 2)    == edges [(1,2),(2,1)]" $
          fromUndirected (edge 1 2)    == G.edges [(1,2), (2,1 :: Int)]

    test "toUndirected . fromUndirected == id" $ \(x :: G) ->
          (toUndirected . fromUndirected) x == id x

    test "vertexCount . fromUndirected == vertexCount" $ \(x :: G) ->
          (G.vertexCount . fromUndirected) x == vertexCount x

    test "edgeCount   . fromUndirected <= (*2) . edgeCount" $ \(x :: G) ->
          (G.edgeCount . fromUndirected) x <= ((*2) . edgeCount) x

    putStrLn $ "\n============ Graph.Undirected.complement ================"
    test "complement empty              == empty" $
          complement (empty :: UGI)     == empty

    test "complement (vertex x)         == vertex x" $ \x ->
          complement (vertex x :: UGI)  == vertex x

    test "complement (edge 1 1)         == edge 1 1" $
          complement (edge 1 1)         == edge 1 (1 :: Int)

    test "complement (edge 1 2)         == vertices [1, 2]" $
          complement (edge 1 2 :: UGI)  == vertices [1, 2]

    test "complement (star 1 [2, 3])    == overlay (vertex 1) (edge 2 3)" $
          complement (star 1 [2, 3])    == overlay (vertex 1) (edge 2 3 :: UGI)

    test "complement . complement       == id" $ \(x :: UGI) ->
         (complement . complement $ x)  == x

    testSymmetricBasicPrimitives t
    testSymmetricIsSubgraphOf    t
    testSymmetricGraphFamilies   t
    testSymmetricTransformations t
    testInduceJust               tPoly