module Ribosome.Test.Ui where

import Hedgehog (TestT, (===))
import Ribosome.Api.Window (currentCursor, cursor)
import Ribosome.Control.Monad.Ribo (NvimE)
import Ribosome.Nvim.Api.Data (Window)
import Ribosome.Nvim.Api.IO (nvimListWins)

windowCountIs ::
  NvimE e m =>
  Int ->
  TestT m ()
windowCountIs :: Int -> TestT m ()
windowCountIs Int
count = do
  [Window]
wins <- TestT m [Window]
forall (m :: * -> *) e.
(Nvim m, MonadDeepError e RpcError m) =>
m [Window]
nvimListWins
  Int
count Int -> Int -> TestT m ()
forall (m :: * -> *) a.
(MonadTest m, Eq a, Show a, HasCallStack) =>
a -> a -> m ()
=== ([Window] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [Window]
wins)

cursorIs ::
  NvimE e m =>
  Int ->
  Int ->
  Window ->
  TestT m ()
cursorIs :: Int -> Int -> Window -> TestT m ()
cursorIs Int
line Int
col =
  ((Int
line, Int
col) (Int, Int) -> (Int, Int) -> TestT m ()
forall (m :: * -> *) a.
(MonadTest m, Eq a, Show a, HasCallStack) =>
a -> a -> m ()
===) ((Int, Int) -> TestT m ())
-> (Window -> TestT m (Int, Int)) -> Window -> TestT m ()
forall (m :: * -> *) b c a.
Monad m =>
(b -> m c) -> (a -> m b) -> a -> m c
<=< m (Int, Int) -> TestT m (Int, Int)
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m (Int, Int) -> TestT m (Int, Int))
-> (Window -> m (Int, Int)) -> Window -> TestT m (Int, Int)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Window -> m (Int, Int)
forall e (m :: * -> *). NvimE e m => Window -> m (Int, Int)
cursor

currentCursorIs ::
  NvimE e m =>
  Int ->
  Int ->
  TestT m ()
currentCursorIs :: Int -> Int -> TestT m ()
currentCursorIs Int
line Int
col =
  ((Int
line, Int
col) (Int, Int) -> (Int, Int) -> TestT m ()
forall (m :: * -> *) a.
(MonadTest m, Eq a, Show a, HasCallStack) =>
a -> a -> m ()
===) ((Int, Int) -> TestT m ()) -> TestT m (Int, Int) -> TestT m ()
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< m (Int, Int) -> TestT m (Int, Int)
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift m (Int, Int)
forall e (m :: * -> *). NvimE e m => m (Int, Int)
currentCursor