packages feed

ribosome-root-0.3.0.0: test/u/MappingSpec.hs

{-# OPTIONS_GHC -F -pgmF htfpp #-}
{-# LANGUAGE TemplateHaskell #-}

module MappingSpec (htf_thisModulesTests) where

import Control.Monad.Trans.Except (ExceptT)
import qualified Data.Map as Map (empty)
import Neovim (Neovim, Plugin(..))
import Test.Framework

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.Nvim.Api.RpcCall (RpcError)
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 TestError (handleTestError)

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 ::
  MonadDeepError e DecodeError m =>
  MonadRibo m =>
  NvimE e m =>
  m ()
setupMappingScratch = do
  _ <- showInScratch target (ScratchOptions False True False True True True Nothing Nothing [] [mapping] "buffi")
  return ()

$(return [])

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

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

test_mapping :: IO ()
test_mapping = do
  plug <- mappingPlugin
  integrationSpecDef plug mappingSpec