packages feed

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