packages feed

hob-0.0.1.0: test/Hob/Ui/EditorSpec.hs

module Hob.Ui.EditorSpec (main, spec) where

import Test.Hspec

import Control.Monad.Reader
import Data.IORef
import Data.Maybe
import Data.Monoid
import Data.Text                  (pack, unpack)
import Graphics.UI.Gtk
import Graphics.UI.Gtk.SourceView (SourceView, castToSourceBuffer,
                                   sourceBufferUndo)

import           Hob.Context
import qualified Hob.Context.UiContext as HC
import           Hob.Ui
import           Hob.Ui.Editor

import HobTest.Context.Default
import HobTest.Control

main :: IO ()
main = hspec spec

spec :: Spec
spec =
  describe "editor ui" $ do
    it "does not allow to undo the intial loaded source" $ do
      ctx <- loadDefaultContext
      editor <- launchEditorTab ctx $ Just "/xxx/testName.hs"
      buffer <- textViewGetBuffer editor
      sourceBufferUndo $ castToSourceBuffer buffer
      editorText <- getEditorText editor
      unpack editorText `shouldBe` "initial text"

    it "sets the tab title when opening a file" $ do
      ctx <- loadDefaultContext
      _ <- launchEditorTab ctx $ Just "/xxx/testName.hs"
      tabText <- getActiveEditorTabText ctx
      tabText `shouldBe` "testName.hs"

    it "updates the tab title to reflect if buffer is modified" $ do
      ctx <- launchNewFileAndSetModified
      tabText <- getActiveEditorTabText ctx
      tabText `shouldBe` "testName.hs*"

    it "retrieves active editor" $ do
      ctx <- loadDefaultContext
      editor <- launchEditorTab ctx $ Just "/xxx/testName.hs"
      activeEditor <- getActiveEditor ctx
      fromJust activeEditor == editor `shouldBe` True

    it "registers the new editor in the context on creation" $ do
      ctx <- loadDefaultContext
      _ <- launchEditorTab ctx $ Just "/xxx/testName.hs"
      registeredEditors <- getEditors $ editors ctx
      length registeredEditors `shouldBe` 1

    it "retrieves editor text" $ do
      ctx <- loadDefaultContext
      editor <- launchEditorTab ctx $ Just "/xxx/testName.hs"
      text <- getEditorText editor
      text `shouldBe` pack "initial text"

    it "retrieves active editor text" $ do
      ctx <- loadDefaultContext
      _ <- launchEditorTab ctx $ Just "/xxx/testName.hs"
      text <- getActiveEditorText ctx
      fromJust text `shouldBe` pack "initial text"

    it "retrieves Nothing for active editor text if there is no active editor" $ do
      ctx <- loadDefaultContext
      text <- getActiveEditorText ctx
      text `shouldBe` Nothing

    it "retrieves current editor from notebook" $ do
      ctx <- loadDefaultContext
      editor <- launchEditorTab ctx $ Just "/xxx/testName.hs"
      tab <- getActiveEditorTab ctx
      activeEditor <- getEditorFromNotebookTab $ fromJust tab
      fromJust activeEditor == editor `shouldBe` True

    it "retrieves the set filepath for an editor" $ do
      ctx <- loadDefaultContext
      editor <- launchEditorTab ctx $ Just "/xxx/testName.hs"
      filePath1 <- getEditorFilePath editor
      setEditorFilePath editor $ Just "/tmp/xxx"
      filePath2 <- getEditorFilePath editor
      filePath1 `shouldBe` Just "/xxx/testName.hs"
      filePath2 `shouldBe` Just "/tmp/xxx"


    it "invokes mode teardown on exitMode" $ do
      record <- newIORef False
      ctx <- loadDefaultContext
      editor <- launchEditorTab ctx $ Just "/xxx/testName.hs"
      widgetGrabFocus editor
      runCtxActions ctx $ enterMode $ Mode "testmode" mempty (liftIO $ writeIORef record True)
      runCtxActions ctx exitLastMode
      cleanupInvoked <- readIORef record
      cleanupInvoked `shouldBe` True

launchNewFileAndSetModified :: IO Context
launchNewFileAndSetModified = do
    ctx <- loadDefaultContext
    _ <- launchEditorTab ctx $ Just "/xxx/testName.hs"
    buffer <- textViewGetBuffer . fromJust =<< getActiveEditor ctx
    textBufferSetModified buffer True
    return ctx

launchEditorTab :: Context -> Maybe FilePath -> IO SourceView
launchEditorTab ctx file = do
    let notebook = HC.mainNotebook . uiContext $ ctx
    runCtxActions ctx $ newEditorForText notebook file $ pack "initial text"
    mEditor <- getActiveEditor ctx
    return $ fromJust mEditor

getActiveEditorTabText :: Context  -> IO String
getActiveEditorTabText ctx = do
    let notebook = HC.mainNotebook . uiContext $ ctx
    currentlyActiveEditor <- getActiveEditorTab ctx
    text <- notebookGetTabLabelText notebook $ fromJust currentlyActiveEditor
    return $ fromJust text