packages feed

ribosome-host-0.9.9.9: test/Ribosome/Host/Test/FunctionTest.hs

module Ribosome.Host.Test.FunctionTest where

import Conc (interpretAtomic, interpretSync)
import qualified Polysemy.Conc.Sync as Sync
import Polysemy.Test (UnitTest, assertEq, assertJust, assertLeft, assertRight, evalMaybe)
import Polysemy.Time (Seconds (Seconds))

import qualified Ribosome.Host.Api.Data as Data
import Ribosome.Host.Api.Effect (nvimCallFunction, nvimGetVar, nvimSetVar)
import Ribosome.Host.Class.Msgpack.Encode (toMsgpack)
import Ribosome.Host.Data.Bar (Bar (Bar))
import Ribosome.Host.Data.Execution (Execution (Sync))
import Ribosome.Host.Data.Report (resumeReport)
import Ribosome.Host.Data.RpcError (RpcError)
import Ribosome.Host.Data.RpcHandler (Handler)
import qualified Ribosome.Host.Effect.Rpc as Rpc
import Ribosome.Host.Effect.Rpc (Rpc)
import Ribosome.Host.Embed (embedNvim)
import Ribosome.Host.Handler (rpcFunction)
import Ribosome.Host.Unit.Run (runTest)
import qualified Ribosome.Host.Data.RpcError as RpcError
import Data.MessagePack (Object)

var :: Text
var =
  "test_var"

hand ::
  Members [AtomicState Int, Rpc !! RpcError] r =>
  Bar ->
  Bool ->
  Int ->
  Handler r Int
hand Bar _ n = do
  atomicGet >>= \case
    13 ->
      stop "already 13"
    _ -> do
      resumeReport (nvimSetVar var n)
      47 <$ atomicPut 13

targetError :: RpcError
targetError =
  RpcError.Api "nvim_call_function" [toMsgpack @Text "Fun", toMsgpack @[Object] [toMsgpack True, toMsgpack (14 :: Int)]]
  "Vim(return):Error invoking 'function:Fun' on channel 1:\nalready 13"

callTest ::
  Member Rpc r =>
  Int ->
  Sem r Int
callTest n =
  nvimCallFunction "Fun" [toMsgpack True, toMsgpack n]

test_function :: UnitTest
test_function =
  runTest $ interpretAtomic 0 $ embedNvim [rpcFunction "Fun" Sync hand] $ interpretSync do
    nvimSetVar var (10 :: Int)
    Rpc.async (Data.nvimGetVar var) (void . Sync.putTry)
    assertRight (10 :: Int) =<< evalMaybe =<< Sync.wait (Seconds 5)
    assertEq 47 =<< callTest 23
    assertJust (23 :: Int) =<< nvimGetVar var
    assertEq 13 =<< atomicGet
    assertLeft targetError =<< resumeEither (callTest 14)