capnp-0.4.0.0: tests/Module/Capnp/Bits.hs
module Module.Capnp.Bits (bitsTests) where
import Data.Bits
import Data.Word
import Test.Hspec
import Data.Foldable (traverse_)
import Capnp.Bits
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