hw-rankselect-0.11.0.0: test/HaskellWorks/Data/RankSelect/InternalSpec.hs
{-# OPTIONS_GHC -fno-warn-incomplete-patterns #-}
{-# LANGUAGE ScopedTypeVariables #-}
module HaskellWorks.Data.RankSelect.InternalSpec (spec) where
import HaskellWorks.Data.Bits.BitRead
import HaskellWorks.Data.Bits.PopCount.PopCount1
import HaskellWorks.Data.RankSelect.Base.Rank
import HaskellWorks.Data.RankSelect.Base.Select
import HaskellWorks.Hspec.Hedgehog
import Hedgehog
import Prelude hiding (length)
import Test.Hspec
import qualified Hedgehog.Gen as G
import qualified Hedgehog.Range as R
{-# ANN module ("HLint: ignore Redundant do" :: String) #-}
{-# ANN module ("HLint: ignore Reduce duplication" :: String) #-}
spec :: Spec
spec = describe "HaskellWorks.Data.RankSelect.InternalSpec" $ do
describe "For [Bool]" $ do
it "rank True 10010010 over [0..8] should be 011122233" $ requireProperty $ do
let (Just bs) = bitRead "10010010" :: Maybe [Bool]
fmap (rank True bs) [0..8] === [0, 1, 1, 1, 2, 2, 2, 3, 3]
it "rank True 10010010 over [0..8] should be 001223445" $ requireProperty $ do
let (Just bs) = bitRead "10010010" :: Maybe [Bool]
fmap (rank False bs) [0..8] === [0, 0, 1, 2, 2, 3, 4, 4, 5]
it "select True 10010010 over [0..3] should be 0147" $ requireProperty $ do
let (Just bs) = bitRead "10010010" :: Maybe [Bool]
fmap (select True bs) [0..3] === [0, 1, 4, 7]
it "select False 10010010 over [0..5] should be 023568" $ requireProperty $ do
let (Just bs) = bitRead "10010010" :: Maybe [Bool]
fmap (select False bs) [0..5] === [0, 2, 3, 5, 6, 8]
it "Rank and select form a galois connection" $ requireProperty $ do
bs <- forAll $ G.list (R.linear 0 70) G.bool
c <- forAll $ G.word64 (R.linear 0 (popCount1 bs))
rank True bs (select True bs c) === c