packages feed

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

module Ribosome.Host.Test.CommandBangTest where

import Conc (interpretAtomic)
import Polysemy.Test (UnitTest, assertJust)

import Ribosome.Host.Api.Effect (nvimCommand, nvimGetVar, nvimSetVar)
import Ribosome.Host.Class.Msgpack.Encode (toMsgpack)
import Ribosome.Host.Data.Bang (Bang (Bang, NoBang))
import Ribosome.Host.Data.Execution (Execution (Sync))
import Ribosome.Host.Data.Report (Report, resumeReport)
import Ribosome.Host.Data.RpcError (RpcError)
import Ribosome.Host.Data.RpcHandler (RpcHandler)
import Ribosome.Host.Effect.Rpc (Rpc)
import Ribosome.Host.Embed (embedNvim)
import Ribosome.Host.Handler (rpcCommand)
import Ribosome.Host.Unit.Run (runTest)

var :: Text
var =
  "test_var"

bang ::
  Members [Rpc !! RpcError, Stop Report] r =>
  Bang ->
  Int64 ->
  Sem r ()
bang = \case
  Bang ->
    \ i -> resumeReport (nvimSetVar @[_] var [toMsgpack True, toMsgpack i])
  NoBang ->
    \ i -> resumeReport (nvimSetVar @[_] var [toMsgpack False, toMsgpack i])

handlers ::
  ∀ r .
  Members [AtomicState Int, Rpc !! RpcError] r =>
  [RpcHandler r]
handlers =
  [
    rpcCommand "Bang" Sync (bang @(Stop Report : r))
  ]

test_bang :: UnitTest
test_bang =
  runTest $ interpretAtomic 0 $ embedNvim handlers do
    nvimCommand "Bang! 9"
    assertJust @(_, Int) (True, 9) =<< nvimGetVar var
    nvimCommand "Bang 10"
    assertJust @(_, Int) (False, 10) =<< nvimGetVar var