packages feed

hob-0.0.1.0: test/Hob/Command/FocusPreviousTabSpec.hs

module Hob.Command.FocusPreviousTabSpec (main, spec) where

import Control.Monad   (replicateM_)
import Graphics.UI.Gtk

import           Hob.Command.FocusPreviousTab
import           Hob.Command.NewTab
import           Hob.Context
import qualified Hob.Context.UiContext        as HC

import Test.Hspec

import HobTest.Context.Default
import HobTest.Control

main :: IO ()
main = hspec spec

spec :: Spec
spec =
  describe "focus previous tab command" $ do
    it "does not change the state if there are no tabs" $ do
      ctx <- loadGuiWithNTabs 0
      currentPage <- focusPreviousTab ctx
      currentPage `shouldBe` -1

    it "leaves the first tab focused if there is just one tab" $ do
      ctx <- loadGuiWithNTabs 1
      currentPage <- focusPreviousTab ctx
      currentPage `shouldBe` 0

    it "focuses the previous tab" $ do
      ctx <- loadGuiWithNTabs 2
      notebookSetCurrentPage (HC.mainNotebook . uiContext $ ctx) 1
      currentPage <- focusPreviousTab ctx
      currentPage `shouldBe` 0

    it "focuses the last tab if the command is invoked on the first tab" $ do
      ctx <- loadGuiWithNTabs 2
      notebookSetCurrentPage (HC.mainNotebook . uiContext $ ctx) 0
      currentPage <- focusPreviousTab ctx
      currentPage `shouldBe` 1

focusPreviousTab :: Context -> IO Int
focusPreviousTab ctx = do
    runCtxActions ctx $ commandExecute focusPreviousTabCommandHandler
    let notebook = HC.mainNotebook . uiContext $ ctx
    notebookGetCurrentPage notebook

loadGuiWithNTabs :: Int -> IO Context
loadGuiWithNTabs n = do
    ctx <- loadDefaultContext
    replicateM_ n $ runCtxActions ctx editNewFile
    return ctx