mirror of
https://github.com/zap-proto/haskell.git
synced 2026-10-30 15:05:00 +00:00
75 lines
2.7 KiB
Haskell
75 lines
2.7 KiB
Haskell
module Module.Capnp.Pointer (ptrTests) where
|
|
|
|
import Data.Bits
|
|
import Data.Int
|
|
import Data.Word
|
|
import Test.Hspec
|
|
import Test.QuickCheck
|
|
|
|
import Capnp.Pointer
|
|
|
|
instance Arbitrary EltSpec where
|
|
arbitrary = oneof [ EltNormal <$> arbitrary <*> arbitraryU29
|
|
, EltComposite <$> arbitraryI29
|
|
]
|
|
|
|
instance Arbitrary ElementSize where
|
|
arbitrary = oneof $ map return [ Sz0
|
|
, Sz1
|
|
, Sz8
|
|
, Sz16
|
|
, Sz32
|
|
, Sz64
|
|
, SzPtr
|
|
]
|
|
|
|
|
|
-- | arbitraryIN is an arbitrary N bit signed integer as an Int32.
|
|
arbitraryI32, arbitraryI30, arbitraryI29 :: Gen Int32
|
|
arbitraryI32 = arbitrary
|
|
arbitraryI30 = (`shiftR` 2) <$> arbitraryI32
|
|
arbitraryI29 = (`shiftR` 3) <$> arbitraryI32
|
|
-- | arbitraryUN is an arbitrary N bit unsigned integer as a Word32.
|
|
arbitraryU32, arbitraryU29 :: Gen Word32
|
|
arbitraryU32 = arbitrary
|
|
arbitraryU29 = (`shiftR` 3) <$> arbitraryU32
|
|
|
|
|
|
instance Arbitrary Ptr where
|
|
arbitrary = oneof [ StructPtr <$> arbitraryI30
|
|
<*> arbitrary
|
|
<*> arbitrary
|
|
, ListPtr <$> arbitraryI30
|
|
<*> arbitrary
|
|
, FarPtr <$> arbitrary
|
|
<*> arbitraryU29
|
|
<*> arbitrary
|
|
, CapPtr <$> arbitrary
|
|
]
|
|
|
|
ptrTests :: Spec
|
|
ptrTests = do
|
|
ptrProps
|
|
parsePtrExamples
|
|
|
|
ptrProps :: Spec
|
|
ptrProps = describe "Pointer Properties" $ do
|
|
it "Should satisfy: parseEltSpec . serializeEltSpec == id" $
|
|
property $ \spec -> parseEltSpec (serializeEltSpec spec) == spec
|
|
it "Should satisfy: parsePtr . serializePtr == id" $
|
|
property $ \ptr ->
|
|
case ptr of
|
|
(Just (StructPtr 0 0 0)) -> True -- we skip this one, since it's
|
|
-- the same bits as a null, so this
|
|
-- shouldn't hold. TODO: the name
|
|
-- of this test is a bit misleading
|
|
-- because of this case; should fix
|
|
-- that.
|
|
_ -> parsePtr (serializePtr ptr) == ptr
|
|
|
|
|
|
parsePtrExamples :: Spec
|
|
parsePtrExamples = describe "parsePtr (examples)" $
|
|
it "Should parse this example correctly" $
|
|
parsePtr 0x0000000200000000 `shouldBe` Just (StructPtr 0 2 0)
|