mirror of
https://github.com/zap-proto/haskell.git
synced 2026-10-30 15:05:00 +00:00
47 lines
1.5 KiB
Haskell
47 lines
1.5 KiB
Haskell
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
|