packages feed

capnp-0.17.0.0: tests/Rpc/Unwrap.hs

{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}

module Rpc.Unwrap (unwrapTests) where

import Capnp
  ( SomeServer (..),
    export,
    methodUnimplemented,
  )
import qualified Capnp.Gen.Aircraft as Aircraft
import qualified Capnp.Rpc as Rpc
import Data.Typeable (Typeable)
import qualified Data.Typeable as Typeable
import qualified Supervisors
import Test.Hspec

data OpaqueEcho = OpaqueEcho
  deriving (Show, Read, Eq, Ord, Enum, Bounded)

instance SomeServer OpaqueEcho

instance Aircraft.Echo'server_ OpaqueEcho where
  echo'echo _ = methodUnimplemented

newtype TransparentEcho = TransparentEcho Int
  deriving (Show, Read, Eq, Ord, Bounded, Typeable)

instance SomeServer TransparentEcho where
  unwrap = Typeable.cast

instance Aircraft.Echo'server_ TransparentEcho where
  echo'echo _ = methodUnimplemented

unwrapTests :: Spec
unwrapTests = describe "Tests for client unwrapping" $ do
  it "Should return nothing for OpaqueEcho." $ do
    r :: Maybe OpaqueEcho <- exportAndUnwrap OpaqueEcho
    r `shouldBe` Nothing
  it "Should return nothing for the wrong type." $ do
    r :: Maybe () <- exportAndUnwrap (TransparentEcho 4)
    r `shouldBe` Nothing
  it "Should return the value for TransparentEcho." $ do
    r <- exportAndUnwrap (TransparentEcho 4)
    r `shouldBe` Just (TransparentEcho 4)

exportAndUnwrap :: (SomeServer a, Aircraft.Echo'server_ a, Typeable b) => a -> IO (Maybe b)
exportAndUnwrap srv = Supervisors.withSupervisor $ \sup -> do
  client <- export @Aircraft.Echo sup srv
  pure $ Rpc.unwrapServer client