packages feed

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

module Ribosome.Host.Test.CommandCompleteTest where

import Conc (interpretSync)
import qualified Data.Text as Text
import Exon (exon)
import Polysemy.Test (UnitTest, assertEq, (===))
import qualified Sync
import Time (Seconds (Seconds))

import Ribosome.Host.Api.Effect (nvimCallFunction, nvimGetVar, nvimInput, nvimSetVar)
import Ribosome.Host.Class.Msgpack.Array (msgpackArray)
import Ribosome.Host.Data.Args (Args (Args))
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, RpcHandler)
import Ribosome.Host.Data.RpcType (CompleteStyle (CompleteFiltered, CompleteUnfiltered))
import Ribosome.Host.Effect.Rpc (Rpc)
import Ribosome.Host.Embed (embedNvim)
import Ribosome.Host.Handler (completeWith, rpcCommand)
import Ribosome.Host.Unit.Run (runTest)

var :: Text
var =
  "var"

completing ::
  Members [Sync (), Rpc !! RpcError] r =>
  Args ->
  Handler r ()
completing (Args a) = do
  resumeReport (nvimSetVar var a)
  void (Sync.putWait (Seconds 5) ())

dictionary :: [Text]
dictionary =
  [
    "completion",
    "somethingelse"
  ]

completeFiltered :: Text -> Text -> Int -> Handler r [Text]
completeFiltered lead _ _ =
  pure (filter (Text.isPrefixOf lead) dictionary)

completeUnfiltered :: Text -> Text -> Int -> Handler r [Text]
completeUnfiltered _ _ _ =
  pure dictionary

handlers ::
  ∀ r .
  Members [Sync (), Rpc !! RpcError] r =>
  [RpcHandler r]
handlers =
  completeWith CompleteFiltered completeFiltered (rpcCommand "CompletingFiltered" Sync completing)
  <>
  completeWith CompleteUnfiltered completeUnfiltered (rpcCommand "CompletingUnfiltered" Sync completing)

test_complete :: UnitTest
test_complete =
  runTest $ interpretSync $ embedNvim handlers do
    test "CompletingFiltered"
    nvimSetVar var ("reset" :: Text)
    test "CompletingUnfiltered"
    res <- nvimCallFunction "Complete_CompletingUnfiltered" (msgpackArray ("comp" :: Text) ("" :: Text) (0 :: Int))
    Text.unlines dictionary === res
  where
    test fun = do
      void (nvimInput [exon|:#{fun} comp<tab><cr>|])
      Sync.takeWait (Seconds 5)
      assertEq "completion" =<< nvimGetVar @Text var