module Ribosome.Host.Test.AsyncTest where

import Conc (interpretSync)
import qualified Polysemy.Conc.Sync as Sync
import Polysemy.Test (UnitTest, assertJust)
import Polysemy.Time (Seconds (Seconds))

import Ribosome.Host.Api.Data (nvimCallFunction)
import Ribosome.Host.Class.Msgpack.Encode (toMsgpack)
import Ribosome.Host.Data.Execution (Execution (Async))
import Ribosome.Host.Data.RpcHandler (Handler, RpcHandler)
import qualified Ribosome.Host.Effect.Rpc as Rpc
import Ribosome.Host.Embed (embedNvim)
import Ribosome.Host.Handler (rpcFunction)
import Ribosome.Host.Unit.Run (runTest)

hand ::
  Member (Sync Int) r =>
  Int ->
  Handler r ()
hand =
  void . Sync.putWait (Seconds 5)

handlers ::
  ∀ r .
  Member (Sync Int) r =>
  [RpcHandler r]
handlers =
  [
    rpcFunction "Fun" Async hand
  ]

test_async :: UnitTest
test_async =
  runTest $ interpretSync $ embedNvim handlers do
    Rpc.notify (nvimCallFunction @() "Fun" [toMsgpack (47 :: Int)])
    assertJust 47 =<< Sync.takeWait (Seconds 1)