capnp-0.17.0.0: tests/Module/Capnp/Bits.hs
module Module.Capnp.Bits (bitsTests) where
import Capnp.Bits
import Data.Bits
import Data.Foldable (traverse_)
import Data.Word
import Test.Hspec
bitsTests :: Spec
bitsTests = do
describe "bitRange" bitRangeExamples
describe "replaceBits" replaceBitsExamples
bitRangeExamples :: Spec
bitRangeExamples = do
it "Should get single bits correctly" $
traverse_ bitRangeTest ones
it "Should work on this extra example" $
bitRangeTest
(0x0000000200000000, 32, 48, 2)
where
bitRangeTest :: (Word64, Int, Int, Word64) -> IO ()
bitRangeTest (word, lo, hi, expected) =
bitRange word lo hi `shouldBe` expected
ones = map (\bit -> (1 `shiftL` bit, bit, bit + 1, 1)) [0 .. 63]
replaceBitsExamples :: Spec
replaceBitsExamples =
it "Should work with several examples" $
sequence_
[ replaceTest (0xf :: Word8) 0 0 0xf,
replaceTest (0x1 :: Word8) 0xf 0 0x1,
replaceTest (0x2 :: Word8) 0x1 0 0x2,
replaceTest (0x1 :: Word8) 0xf 0 0x1,
replaceTest (0x2 :: Word8) 0x10 4 0x20,
replaceTest (0x1 :: Word8) 0x10 8 0x0110,
replaceTest (0xa :: Word8) 0xffff 8 0x0aff,
replaceTest (0x0 :: Word1) 0xff 4 0xef
]
where
replaceTest ::
(Bounded a, Integral a, Show a) =>
a ->
Word64 ->
Int ->
Word64 ->
Expectation
replaceTest new orig shift expected =
replaceBits new orig shift `shouldBe` expected