56 lines
2.7 KiB
Haskell
56 lines
2.7 KiB
Haskell
module Syndicate.Dataspace.Trie.Tests.ESOP2016v2 where
|
|
-- Close to the ESOP 2016 implementation of dataspace tries, but takes
|
|
-- a step toward efficiency by using collapse/update instead of dedup/distinct.
|
|
|
|
import Prelude hiding (null, seq)
|
|
import Syndicate.Dataspace.Trie.ESOP2016v2
|
|
import qualified Data.Map.Strict as Map
|
|
import qualified Data.Set as Set
|
|
import Test.HUnit
|
|
|
|
ok vs = Ok (Set.fromList vs)
|
|
seq x r = if null r then r else Br (Map.singleton x r)
|
|
|
|
seqCh '<' = Open
|
|
seqCh '>' = Close
|
|
seqCh '*' = Wild
|
|
seqCh x = Ch x
|
|
|
|
seqs s r = foldr (\ x r -> seq (seqCh x) r) r s
|
|
|
|
hUnitSuite = test
|
|
[ "seqs simple" ~: seq Open (seq Close (Ok (Set.singleton 1))) ~=? seqs "<>" (ok [1]),
|
|
"union simple1" ~: Br (Map.fromList [(Ch 'a', ok [1]),
|
|
(Ch 'b', ok [2])]) ~=?
|
|
union (seqs "a" (ok [1])) (seqs "b" (ok [2])),
|
|
"union simple2" ~: Br (Map.fromList [(Ch 'a', ok [1,2]),
|
|
(Ch 'b', ok [2])]) ~=?
|
|
unions [seqs "a" (ok [1]),
|
|
seqs "b" (ok [2]),
|
|
seqs "a" (ok [2])],
|
|
"union idem" ~: (seqs "abc" (ok [1])) ~=?
|
|
union (seqs "abc" (ok [1])) (seqs "abc" (ok [1])),
|
|
"union wild" ~:
|
|
Br (Map.fromList [(Open,Br (Map.fromList [(Wild,Tl (ok [1])),
|
|
(Ch 'a',Br (Map.fromList [(Close,ok [1,2]),
|
|
(Wild,Tl (ok [1]))]))])),
|
|
(Wild,ok [1])])
|
|
~=? union (seqs "*" (ok [1])) (seqs "<a>" (ok [2])),
|
|
"route union wild1" ~: Set.fromList [1,2] ~=?
|
|
route [Open, Ch 'a', Close] (union
|
|
(seqs "*" (ok [1]))
|
|
(seqs "<a>" (ok [2]))) Set.empty,
|
|
"route union wild2" ~: Set.fromList [1] ~=?
|
|
route [Open, Ch 'b', Close] (union
|
|
(seqs "*" (ok [1]))
|
|
(seqs "<a>" (ok [2]))) Set.empty,
|
|
"route union wild3" ~: Set.fromList [1] ~=?
|
|
route [Open, Close] (union
|
|
(seqs "*" (ok [1]))
|
|
(seqs "<a>" (ok [2]))) Set.empty,
|
|
"route union wild4" ~: Set.fromList [1] ~=?
|
|
route [Open, Ch 'a', Ch 'a', Close] (union
|
|
(seqs "*" (ok [1]))
|
|
(seqs "<a>" (ok [2]))) Set.empty
|
|
]
|