packages feed

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

module Ribosome.Host.Test.CommandRangeTest where

import Polysemy.Test (UnitTest, assertJust)

import Ribosome.Host.Api.Effect (
  nvimBufSetLines,
  nvimCommand,
  nvimGetCurrentBuf,
  nvimGetCurrentWin,
  nvimGetVar,
  nvimSetVar,
  nvimWinSetCursor,
  )
import Ribosome.Host.Data.Execution (Execution (Sync))
import Ribosome.Host.Data.Report (resumeReport)
import Ribosome.Host.Data.Range (Range (Range), RangeStyle (RangeCount, RangeFile, RangeLine))
import Ribosome.Host.Data.RpcError (RpcError)
import Ribosome.Host.Data.RpcHandler (Handler, 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"

rangeFile ::
  Member (Rpc !! RpcError) r =>
  Range 'RangeFile ->
  Int64 ->
  Handler r ()
rangeFile = \case
  Range l (Just h) ->
    \ i -> resumeReport (nvimSetVar var (l, h, i))
  Range _ Nothing ->
    const (stop "no upper range bound given")

rangeLine ::
  Member (Rpc !! RpcError) r =>
  Range ('RangeLine 'Nothing) ->
  Handler r ()
rangeLine = \case
  Range l (Just h) ->
    resumeReport (nvimSetVar var (l, h))
  Range _ Nothing ->
    stop "no upper range bound given"

rangeLineDefault ::
  Member (Rpc !! RpcError) r =>
  Range ('RangeLine ('Just 13)) ->
  Handler r ()
rangeLineDefault = \case
  Range l Nothing ->
    resumeReport (nvimSetVar var l)
  Range _ (Just _) ->
    stop "range line count function got upper bound"

rangeCountImplicit ::
  Member (Rpc !! RpcError) r =>
  Range ('RangeCount 'Nothing) ->
  Handler r ()
rangeCountImplicit = \case
  Range _ (Just _) ->
    stop "range count function got upper bound"
  Range l Nothing ->
    resumeReport (nvimSetVar var l)

rangeCountDefault ::
  Member (Rpc !! RpcError) r =>
  Range ('RangeCount ('Just 23)) ->
  Handler r ()
rangeCountDefault = \case
  Range _ (Just _) ->
    stop "range count function got upper bound"
  Range l Nothing ->
    resumeReport (nvimSetVar var l)

rangeHandlers ::
  ∀ r .
  Member (Rpc !! RpcError) r =>
  [RpcHandler r]
rangeHandlers =
  [
    rpcCommand "RangeFile" Sync rangeFile,
    rpcCommand "RangeLine" Sync rangeLine,
    rpcCommand "RangeLineDefault" Sync rangeLineDefault,
    rpcCommand "RangeCountImplicit" Sync rangeCountImplicit,
    rpcCommand "RangeCountDefault" Sync rangeCountDefault
  ]

test_range :: UnitTest
test_range =
  runTest $ embedNvim rangeHandlers do
    buf <- nvimGetCurrentBuf
    win <- nvimGetCurrentWin
    nvimBufSetLines buf 0 1 True ["1", "2", "3", "4", "5"]
    nvimWinSetCursor win (3, 1)
    nvimCommand "RangeFile 9"
    assertJust @(Int64, Int64, Int64) (1, 5, 9) =<< nvimGetVar var
    nvimCommand "RangeLine"
    assertJust @(Int64, Int64) (3, 3) =<< nvimGetVar var
    nvimCommand "2,4RangeLine"
    assertJust @(Int64, Int64) (2, 4) =<< nvimGetVar var
    nvimCommand "RangeLineDefault"
    assertJust @Int64 13 =<< nvimGetVar var
    nvimCommand "RangeCountImplicit"
    assertJust @Int64 0 =<< nvimGetVar var
    nvimCommand "RangeCountDefault"
    assertJust @Int64 23 =<< nvimGetVar var
    nvimCommand "144RangeCountDefault"
    assertJust @Int64 144 =<< nvimGetVar var
    nvimCommand "RangeCountDefault 201"
    assertJust @Int64 201 =<< nvimGetVar var