packages feed

capnp-0.13.0.0: tests/Rpc/Unwrap.hs

{-# LANGUAGE FlexibleContexts      #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE ScopedTypeVariables   #-}
{-# LANGUAGE TypeApplications      #-}
module Rpc.Unwrap (unwrapTests) where

import Test.Hspec

import qualified Data.Typeable as Typeable

import Data.Typeable (Typeable)

import qualified Capnp.Gen.Aircraft.New as Aircraft
import           Capnp.New
    (SomeServer(..), export, methodUnimplemented)
import qualified Capnp.Rpc              as Rpc
import qualified Supervisors

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