capnp-0.11.0.0: tests/Module/Capnp/Gen/Capnp/Schema.hs
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE OverloadedLabels #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE TypeApplications #-}
module Module.Capnp.Gen.Capnp.Schema (schemaTests) where
import Test.Hspec
import Control.Monad.Primitive (RealWorld)
import Data.Foldable (traverse_)
import Data.Function ((&))
import Capnp.Gen.Capnp.Schema
import qualified Capnp.Gen.Capnp.Schema.New as N
import Capnp (newRoot)
import Capnp.New (encodeField, encodeVariant, initVariant, readField)
import Capnp.TraversalLimit (LimitT, evalLimitT)
import Data.Mutable (Thaw(..))
import Util (decodeValue, schemaSchemaSrc)
import qualified Capnp.Message as M
import qualified Capnp.New.Classes as NC
data BuildTest = BuildTest
{ typeName :: String
, expected :: String
, builder :: M.Message ('M.Mut RealWorld) -> LimitT IO ()
}
schemaTests :: Spec
schemaTests = describe "tests for typed setters" $ traverse_ testCase
[ BuildTest
{ typeName = "Field"
, expected = concat
[ "( codeOrder = 4,\n"
, " discriminantValue = 6,\n"
, " group = (typeId = 322),\n"
, " ordinal = (explicit = 22) )\n"
]
, builder = \msg -> do
field <- newRoot msg
set_Field'codeOrder field 4
set_Field'discriminantValue field 6
group <- set_Field'group field
set_Field'group'typeId group 322
ordinal <- get_Field'ordinal field
set_Field'ordinal'explicit ordinal 22
}
, BuildTest -- same test, but with the repr API.
{ typeName = "Field"
, expected = concat
[ "( codeOrder = 4,\n"
, " discriminantValue = 6,\n"
, " group = (typeId = 322),\n"
, " ordinal = (explicit = 22) )\n"
]
, builder = \msg -> do
field <- NC.newRoot @N.Field () msg
field & encodeField #codeOrder 4
field & encodeField #discriminantValue 6
field
& initVariant #group
>>= encodeField #typeId 322
field
& readField #ordinal
>>= encodeVariant #explicit 22
}
]
where
testCase BuildTest{..} = it ("Should build " ++ expected) $ do
msg <- M.newMessage Nothing
evalLimitT maxBound $ builder msg
constMsg <- freeze msg
actual <- decodeValue schemaSchemaSrc typeName constMsg
actual `shouldBe` expected