packages feed

iris-0.0.0.0: test/Test/Iris/Tool.hs

module Test.Iris.Tool (toolSpec) where

import Data.Text (Text)
import Data.Version (Version, makeVersion, parseVersion)
import Test.Hspec (Spec, describe, it, shouldReturn, shouldSatisfy)
import Text.ParserCombinators.ReadP (readP_to_S)

import Iris.Tool (Tool (..), ToolCheckResult (..), ToolSelector (..), checkTool,
                  defaultToolSelector)

import qualified Data.Text as Text


toolSpec :: Spec
toolSpec = describe "Tool" $ do
    it "should find 'curl'" $ do
        checkTool () "curl" `shouldReturn` ToolOk

    it "shouldn't find 'xxx_unknown_executable'" $ do
        checkTool () "xxx_unknown_executable"
            `shouldReturn` ToolNotFound "xxx_unknown_executable"

    it "shouldn't find 'ghc' version 100" $ do
        let tool :: Tool ()
            tool = "ghc"
                { toolSelector = Just defaultToolSelector
                    { toolSelectorFunction = \_cmd version -> case getVersion version of
                          Nothing -> False
                          Just v  -> v >= makeVersion [100]
                    , toolSelectorVersionArg = Just "--numeric-version"
                    }
                }

        let isToolWrongVersion :: ToolCheckResult -> Bool
            isToolWrongVersion (ToolWrongVersion _) = True
            isToolWrongVersion _other               = False

        checkTool () tool >>= (`shouldSatisfy` isToolWrongVersion)

getVersion :: Text -> Maybe Version
getVersion = extractVersion . readP_to_S parseVersion . Text.unpack
  where
    extractVersion :: [(Version, String)] -> Maybe Version
    extractVersion [(version, "")] = Just version
    extractVersion _               = Nothing