packages feed

hw-rankselect-0.6.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.Positioning
import           HaskellWorks.Data.RankSelect.Base.Rank
import           HaskellWorks.Data.RankSelect.Base.Select
import           Test.Hspec
import           Test.QuickCheck

{-# 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" $
      let (Just bs) = bitRead "10010010" :: Maybe [Bool] in
      fmap (rank True bs) [0..8] `shouldBe` [0, 1, 1, 1, 2, 2, 2, 3, 3]
    it "rank True 10010010 over [0..8] should be 001223445" $
      let (Just bs) = bitRead "10010010" :: Maybe [Bool] in
      fmap (rank False bs) [0..8] `shouldBe` [0, 0, 1, 2, 2, 3, 4, 4, 5]
    it "select True 10010010 over [0..3] should be 0147" $
      let (Just bs) = bitRead "10010010" :: Maybe [Bool] in
      fmap (select True bs) [0..3] `shouldBe` [0, 1, 4, 7]
    it "select False 10010010 over [0..5] should be 023568" $
      let (Just bs) = bitRead "10010010" :: Maybe [Bool] in
      fmap (select False bs) [0..5] `shouldBe` [0, 2, 3, 5, 6, 8]
    it "Rank and select form a galois connection" $
      property $ \(bs :: [Bool]) ->
      forAll (choose (0, popCount1 bs)) $ \(c :: Count) ->
        rank True bs (select True bs c) == c