packages feed

ribosome-test-0.4.0.0: test/Ribosome/Test/MappingTest.hs

module Ribosome.Test.MappingTest where

import qualified Data.Map.Strict as Map (empty)
import Hedgehog ((===))
import Neovim (Plugin(..))
import TestError (RiboTest, handleTestError)

import Ribosome.Api.Buffer (currentBufferContent)
import Ribosome.Control.Monad.Ribo (MonadRibo, NvimE)
import Ribosome.Control.Ribosome (Ribosome, newRibosome)
import Ribosome.Data.Mapping (Mapping(Mapping), MappingIdent(MappingIdent))
import Ribosome.Data.ScratchOptions (ScratchOptions(ScratchOptions))
import Ribosome.Msgpack.Encode (MsgpackEncode(toMsgpack))
import Ribosome.Msgpack.Error (DecodeError)
import Ribosome.Nvim.Api.IO (nvimFeedkeys, vimCallFunction, vimGetVar, vimSetVar)
import Ribosome.Plugin (riboPlugin, rpcHandlerDef)
import Ribosome.Plugin.Mapping (MappingHandler, mappingHandler)
import Ribosome.Scratch (showInScratch)
import Ribosome.Test.Await (await)
import Ribosome.Test.Embed (integrationSpecDef)
import Ribosome.Test.Orphans ()
import Ribosome.Test.Run (UnitTest)

target :: [Text]
target = ["line 1", "line 2"]

go :: NvimE e m => m ()
go =
  vimSetVar "number" (toMsgpack (13 :: Int))

mapping :: Mapping
mapping =
  Mapping (MappingIdent "go") "a" "n" False True

mapHandler :: NvimE e m => MappingHandler m
mapHandler =
  mappingHandler "go" go

setupMappingScratch ::
  NvimE e m =>
  MonadRibo m =>
  MonadBaseControl IO m =>
  MonadDeepError e DecodeError m =>
  m ()
setupMappingScratch = do
  _ <- showInScratch target options
  return ()
  where
    options =
      ScratchOptions False True False True True True False Nothing Nothing Nothing [] [mapping] "buffi"

$(return [])

mappingPlugin :: IO (Plugin (Ribosome ()))
mappingPlugin = do
  env <- newRibosome "mapping" ()
  return $ riboPlugin "mapping" env funcs [mapHandler] handleTestError Map.empty
  where
    funcs = [$(rpcHandlerDef 'setupMappingScratch)]

mappingSpec :: RiboTest ()
mappingSpec = do
  () <- vimCallFunction "SetupMappingScratch" []
  await (target ===) currentBufferContent
  nvimFeedkeys "a" "x" False
  await ((13 :: Int) ===) (vimGetVar "number")

test_mapping :: UnitTest
test_mapping = do
  plug <- liftIO mappingPlugin
  integrationSpecDef plug mappingSpec