packages feed

euler-tour-tree-0.1.0.0: test/UnitTests.hs

import           Data.EulerTourTree

import           Data.Tree
import           Test.Tasty
import           Test.Tasty.HUnit


-- Unsafe version of fromTree
fromTree' :: Ord node => Tree node -> EulerTourTree node
fromTree' tree = let Just a = fromTree tree in a

main :: IO ()
main = defaultMain $ testGroup "Unit tests"
  [ cutEdgeTest
  , memberTest
  , rerootTest
  , rootTest
  , sizeTest
  , spliceTest
  ]

testTree1 :: EulerTourTree Int
testTree1 = fromTree' $ Node 0
  [ Node 10
    [ Node 11 []
    , Node 12 [] ]
  , Node 20
    [ Node 21 []
    , Node 22 [] ] ]

testTree2 :: EulerTourTree Int
testTree2 = fromTree' $ Node 100
  [ Node 110
    [ Node 111 []
    , Node 112 []
    ]
  , Node 120
    [ Node 121 []
    , Node 122 []
    ]
  ]


cutEdgeTest :: TestTree
cutEdgeTest = testCase "cutEdge" $ do
  cutEdge empty (0, 1) @?= Nothing
  cutEdge testTree1 (10, 11) @?= Just (fromTree' $ Node 11 [], fromTree' $ Node 0
   [ Node 10
     [ Node 12 [] ]
   , Node 20
     [ Node 21 []
     , Node 22 [] ] ])

memberTest :: TestTree
memberTest = testCase "member" $ do
  member 0 testTree1  @?= True
  member 1 testTree1  @?= False
  member 12 testTree1 @?= True
  member 21 testTree1 @?= True
  member 23 testTree1 @?= False

rerootTest :: TestTree
rerootTest = testCase "reroot" $ do
  reroot 0 empty @?= Nothing
  reroot 12 testTree1 @?= Just (fromTree' $ Node 12
    [ Node 10
      [ Node 0
        [ Node 20
          [ Node 21 []
          , Node 22 [] ] ]
        , Node 11 [] ] ] )

rootTest :: TestTree
rootTest = testCase "root" $ do
  root (empty :: EulerTourTree Int) @?= Nothing
  root (singleton 1) @?= Just 1
  root testTree1 @?= Just 0

sizeTest :: TestTree
sizeTest = testCase "size" $ do
  size (empty :: EulerTourTree Int) @?= 0
  size (singleton 1) @?= 1
  size testTree1 @?= 7
  size testTree2 @?= 7

spliceTest :: TestTree
spliceTest = testCase "splice" $ do
  splice testTree2 12 empty @?= Nothing
  splice testTree2 12 testTree1 @?= Just (fromTree' $ Node 0
    [ Node 10
      [ Node 11 []
      , Node 12
          [ Node 100
            [ Node 110
              [ Node 111 []
              , Node 112 [] ]
            , Node 120
              [ Node 121 []
              , Node 122 [] ] ] ] ]
    , Node 20
      [ Node 21 []
      , Node 22 [] ] ] )