module Data.LinkMap.Tests
( tests
) where
import Data.LinkMap
import Test.HUnit
import Prelude hiding (null, catch)
run :: forall b. (forall x. (forall a. LinkMap I0 x a) -> [Id x] -> b) -> b
run f = runICC g where
g :: ICC I0 v b
g _ m ids = f (linkMap m) ids
testList :: [Bool] -> Test
testList = TestList . map (TestCase . assert)
tests :: IO Counts
tests = runTestTT $ TestList
[ "LinkMap tests" ~: TestList (map testList list)
]
list :: [[Bool]]
list =
[ run $ \m (i1:_) ->
[same m i1 i1]
, run $ \n (i1:_) ->
let m = link i1 i1 n
in [same m i1 i1, notMember i1 m]
, run $ \n (i1:_) ->
let m = link i1 i1 $ insert i1 (1 :: Int) n
in [same m i1 i1, lookUp i1 m == Just 1]
, run $ \n (i1:i2:_) ->
let m = link i1 i2 $ link i2 i1 $ insert i1 (1 :: Int) n
in [same m i1 i2, lookUp i1 m == Just 1, lookUp i2 m == Just 1]
, run $ \n (i1:i2:i3:_) ->
let m = link i3 i1 $ link i2 i3 $ link i2 i1 $ insert i1 (1 :: Int) n
in [lookUp i1 m == Nothing, lookUp i2 m == Nothing, lookUp i3 m == Nothing]
, run $ \n (i1:i2:_) ->
let m = link i1 i2 n
in [same m i1 i2, same m i2 i1]
, run $ \n (i1:i2:_) ->
let m = n
in [not (same m i1 i2), not (same m i2 i1)]
, run $ \n (i1:i2:i3:_) ->
let m = link i3 i2 $ link i2 i1 n
in [same m i1 i2, same m i1 i3, same m i2 i3]
, run $ \n (i1:i2:i3:_) ->
let m = link i3 i1 $ link i2 i1 n
in [same m i1 i2, same m i1 i3, same m i2 i3]
, run $ \n (i1:i2:i3:_) ->
let m = link i2 i3 $ link i2 i1 n
in [same m i1 i2, same m i1 i3, same m i2 i3]
, run $ \n (i1:i2:i3:_) ->
let m = link i1 i3 $ link i2 i1 n
in [same m i1 i2, same m i1 i3, same m i2 i3]
, run $ \n (i1:i2:_) ->
let m = link i1 i2 $ insert i1 (1 :: Int) n
in [lookUp i1 m == Nothing, lookUp i2 m == Nothing]
, run $ \n (i1:i2:_) ->
let m = link i1 i2 $ insert i2 (1 :: Int) n
in [lookUp i1 m == Just 1, lookUp i2 m == Just 1]
, run $ \n (i1:i2:i3:_) ->
let m = link i3 i2 $ link i2 i1 $ insert i1 (1 :: Int) n
in [lookUp i1 m == Just 1, lookUp i2 m == Just 1, lookUp i3 m == Just 1]
]