treap-0.0.0.0: test/Test/Rand/Query.hs
module Test.Rand.Query
( querySpec
) where
import Data.Monoid (Sum (..))
import GHC.Exts (IsList (..))
import Test.Hspec (Spec, describe, it, shouldBe)
import Test.Common (TestTreap, extractSum, smallTreap)
import qualified Treap
querySpec :: Spec
querySpec = describe "Query tests" $ do
basicSpec
advancedSpec
basicSpec :: Spec
basicSpec = describe "Sanity checks" $ do
it "size of empty treap is 0" $
Treap.size Treap.empty `shouldBe` 0
it "size of singletone treap is 1" $
Treap.size (Treap.one 1 :: TestTreap) `shouldBe` 1
it "size of smallTreap is 5" $
Treap.size smallTreap `shouldBe` 5
it "measure of empty treap is mempty" $
extractSum Treap.empty `shouldBe` 0
it "measure of singleton treap is mempty" $
extractSum (Treap.one 42) `shouldBe` 42
it "toList smallTreap is [1..5]" $
toList smallTreap `shouldBe` [1..5]
it "total sum of smallTreap is [1..5]" $
extractSum smallTreap `shouldBe` sum [1..5]
advancedSpec :: Spec
advancedSpec = describe "Different checks on query functions" $ do
it "elements by indices are correct" $
map (`Treap.at` smallTreap) [-1..5] `shouldBe`
[Nothing, Just 1, Just 2, Just 3, Just 4, Just 5, Nothing]
it "query on empty segment returns 'mempty'" $
Treap.query 0 (-1) smallTreap `shouldBe` mempty
it "query on the non-intersected segment returns 'mempty'" $ do
Treap.query (-2) (-1) smallTreap `shouldBe` mempty
Treap.query 5 6 smallTreap `shouldBe` mempty
it "query on subsegments works" $ do
Treap.query 0 0 smallTreap `shouldBe` 0
Treap.query 0 1 smallTreap `shouldBe` 1
Treap.query 0 2 smallTreap `shouldBe` 3
Treap.query 1 3 smallTreap `shouldBe` 5
Treap.query (-1) 10 smallTreap `shouldBe` Sum (sum [1..5])