hw-fingertree-strict-0.1.2.1: test/HaskellWorks/Data/SegmentSet/NaiveSpec.hs
module HaskellWorks.Data.SegmentSet.NaiveSpec where
import Data.List
import HaskellWorks.Data.SegmentSet.Naive
import Test.Hspec
{- HLINT ignore "Redundant do" -}
rawIps :: [Segment Int]
rawIps = [Segment 12 20, Segment 1 10, Segment 220 300]
ips :: SegmentSet Int
ips = fromList rawIps
spec :: Spec
spec = describe "App.NaiveIntervalSpec" $ do
it "should preserve empty" $ fromList (toList (empty :: SegmentSet Int)) `shouldBe` empty
it "should insert one range" $ toList (update (Segment 11 20) empty) `shouldBe` ([Segment 11 20] :: [Segment Int])
it "should not change if update is inclusive" $ update (Segment 12 18) ips `shouldBe` ips
it "should join cross ranges" $ do
toList (update (Segment 15 250) ips) `shouldBe` [Segment 1 10, Segment 12 300]
toList (update (Segment 5 15) ips) `shouldBe` [Segment 1 20, Segment 220 300]
it "should keep sorted list (fromList)" $
toList (fromList (reverse rawIps)) `shouldBe` sortOn low rawIps
it "should preserve sorting (update)" $
let addon = Segment 50 70
in toList (update addon ips) `shouldBe` sortOn low (addon:rawIps)
it "should preserve sorring (delete)" $
toList (remove (Segment 12 20) ips) `shouldBe` sortOn low (filter (\x -> low x /= 12) rawIps)
it "should remove nothing from empty" $ remove (Segment 1 10) empty `shouldBe` (empty :: SegmentSet Int)
it "should remove exact segment" $
toList (remove (Segment 12 20) ips) `shouldBe` [Segment 1 10, Segment 220 300]
it "should remove inner segment" $
toList (remove (Segment 250 270) ips) `shouldBe`
[Segment 1 10, Segment 12 20, Segment 220 249, Segment 271 300]
it "should remove crossing segment" $
toList (remove (Segment 5 15) ips) `shouldBe`
[Segment 1 4, Segment 16 20, Segment 220 300]
it "should remove everything" $
remove (Segment 0 1000) ips `shouldBe` empty
it "should remove leftmost" $ do
toList (remove (Segment 1 10) ips) `shouldBe` [Segment 12 20, Segment 220 300]
toList (remove (Segment 1 15) ips) `shouldBe` [Segment 16 20, Segment 220 300]
toList (remove (Segment 0 15) ips) `shouldBe` [Segment 16 20, Segment 220 300]
it "should remove rightmost" $ do
toList (remove (Segment 220 300) ips) `shouldBe` [Segment 1 10, Segment 12 20]
toList (remove (Segment 200 300) ips) `shouldBe` [Segment 1 10, Segment 12 20]
toList (remove (Segment 18 300) ips) `shouldBe` [Segment 1 10, Segment 12 17]
toList (remove (Segment 18 400) ips) `shouldBe` [Segment 1 10, Segment 12 17]
it "should merge adjacent segments" $ do
let segments = [Segment 1 1, Segment 2 2] :: [Segment Int]
toList (fromList segments) `shouldBe` [Segment 1 2]