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 [] ] ] )