Skip to content
This repository has been archived by the owner on Oct 7, 2020. It is now read-only.

Commit

Permalink
Browse files Browse the repository at this point in the history
move more files to PluginUtilsSpec
  • Loading branch information
Tobias Gulbrandsen Waaler committed Nov 25, 2015
1 parent bf4b19f commit eb32bf6
Show file tree
Hide file tree
Showing 4 changed files with 62 additions and 44 deletions.
16 changes: 12 additions & 4 deletions hie-plugin-api/Haskell/Ide/Engine/PluginUtils.hs
Expand Up @@ -10,6 +10,7 @@ module Haskell.Ide.Engine.PluginUtils
, missingParameter
, incorrectParameter
, validatePlugins
, PluginDescriptionError(..)
) where

import Data.Aeson
Expand Down Expand Up @@ -88,13 +89,20 @@ incorrectParameter name expected value = IdeResponseFail
-- ---------------------------------------------------------------------

type ParamNameCollision = (PluginId, [(CommandName, [ParamName])])
data PluginDescriptionError =
PluginDescriptionError {
paramNameCollisions :: [ParamNameCollision]
, paramNameCollisionErrorMsg :: String
} deriving Eq

-- throw an error if the parameter names are colliding in any of the plugins
validatePlugins :: Plugins -> IO ()
validatePlugins :: Plugins -> Maybe PluginDescriptionError
validatePlugins plugins =
case findParameterNameCollisions plugins of
[] -> return ()
collisions -> error (formatParamNameCollisionErrorMsg collisions)
[] -> Nothing
collisions -> Just PluginDescriptionError {
paramNameCollisions = collisions
, paramNameCollisionErrorMsg = formatParamNameCollisionErrorMsg collisions
}

formatParamNameCollisionErrorMsg :: [ParamNameCollision] -> String
formatParamNameCollisionErrorMsg = show -- TODO
Expand Down
4 changes: 3 additions & 1 deletion src/Haskell/Ide/Engine/Monad.hs
Expand Up @@ -47,7 +47,9 @@ data IdeState = IdeState

runIdeM :: IdeState -> IdeM a -> IO a
runIdeM initState f = do
validatePlugins (idePlugins initState)
case validatePlugins (idePlugins initState) of
Just err -> error (paramNameCollisionErrorMsg err)
Nothing -> return ()
initializedRef <- newIORef False
let inner' = GM.runGmOutT opts $ GM.runGhcModT opts $ do
liftIO $ writeIORef initializedRef True
Expand Down
32 changes: 0 additions & 32 deletions test/DispatcherSpec.hs
Expand Up @@ -252,38 +252,6 @@ dispatcherSpec = do

-- ---------------------------------------------------------------------

testPluginWithoutParamNameCollison :: Plugins
testPluginWithoutParamNameCollison = Map.fromList [("plugin1", PluginDescriptor
{
pdCommands =
[
Command
{ cmdDesc = CommandDesc
{ cmdName = "cmd1"
, cmdUiDescription = "description"
, cmdFileExtensions = []
, cmdContexts = [CtxRegion, CtxPoint] -- ["file", "start_pos", "file", "start_pos", "end_pos"]
, cmdAdditionalParams =
[
RP
{ pName = "uniqueParamName1"
, pHelp = "shoud not collide"
, pType = PtText
}
, RP
{ pName = "uniqueParamName2"
, pHelp = "shoud not collide"
, pType = PtText
}
]
}
, cmdFunc = CmdSync $ \_ _ -> return (IdeResponseOk ("" :: T.Text))
}
]
, pdExposedServices = []
, pdUsedServices = []
})]

testPluginWithParamNameCollison :: Plugins
testPluginWithParamNameCollison = Map.fromList [("plugin1", PluginDescriptor
{
Expand Down
54 changes: 47 additions & 7 deletions test/PluginUtilsSpec.hs
@@ -1,7 +1,13 @@
{-# LANGUAGE OverloadedStrings #-}
module PluginUtilsSpec where

import Haskell.Ide.Engine.PluginUtils
import Test.Hspec
import Haskell.Ide.Engine.PluginUtils
import Haskell.Ide.Engine.PluginDescriptor

import qualified Data.Map as Map
import qualified Data.Text as T

import Test.Hspec

main :: IO ()
main = hspec spec
Expand All @@ -10,9 +16,43 @@ spec :: Spec
spec = do
describe "PluginUtils" pluginUtilsSpec

dispatcherSpec :: Spec
dispatcherSpec = do
describe "" $ do
pluginUtilsSpec :: Spec
pluginUtilsSpec = do
describe "validatePlugins" $ do

it "accepts plugins without parameter name collisions" $ do
validatePlugins pluginsWithoutCollisions `shouldBe` Nothing



it "" $ do
validatePlugins pluginsWithoutCollisions `shouldBe` []
pluginsWithoutCollisions :: Plugins
pluginsWithoutCollisions = Map.fromList [("plugin1", PluginDescriptor
{
pdCommands =
[
Command
{ cmdDesc = CommandDesc
{ cmdName = "cmd1"
, cmdUiDescription = "description"
, cmdFileExtensions = []
, cmdContexts = [CtxRegion, CtxPoint] -- ["file", "start_pos", "file", "start_pos", "end_pos"]
, cmdAdditionalParams =
[
RP
{ pName = "uniqueParamName1"
, pHelp = "shoud not collide"
, pType = PtText
}
, RP
{ pName = "uniqueParamName2"
, pHelp = "shoud not collide"
, pType = PtText
}
]
}
, cmdFunc = CmdSync $ \_ _ -> return (IdeResponseOk ("" :: T.Text))
}
]
, pdExposedServices = []
, pdUsedServices = []
})]

0 comments on commit eb32bf6

Please sign in to comment.