packages feed

iris-0.1.0.0: test/Test/Iris/Colour/Mode.hs

module Test.Iris.Colour.Mode (modeSpec) where

import Data.Foldable (for_)
import System.Environment (setEnv, unsetEnv)
import System.IO (stderr, stdout)
import Test.Hspec (Spec, before_, describe, it, shouldReturn)

import Iris.Cli.Colour (ColourOption (..))
import Iris.Colour.Mode (ColourMode (..), detectColourMode)

import Test.Iris.Common (checkCI)

modeSpec :: Spec
modeSpec = before_ clearAppEnv $ describe "Mode" $ do
    let detectStdoutColour option = detectColourMode stdout option (Just "myapp")
    let detectStderrColour option = detectColourMode stderr option (Just "myapp")

    it "DisableColour when --no-colour" $ do
        detectStdoutColour Never `shouldReturn` DisableColour
        detectStderrColour Never `shouldReturn` DisableColour

    it "EnableColour when --colour" $ do
        detectStdoutColour Always `shouldReturn` EnableColour
        detectStderrColour Always `shouldReturn` EnableColour

    it "EnableColour in clear environment" $ do
        ciColour <- colourWithCI
        detectStdoutColour Auto `shouldReturn` ciColour
        detectStderrColour Auto `shouldReturn` ciColour

    it "DisableColour when NO_COLOR is set" $ do
        setEnv "NO_COLOR" "1"
        detectStdoutColour Auto `shouldReturn` DisableColour
        detectStderrColour Auto `shouldReturn` DisableColour

    it "DisableColour when NO_COLOUR is set" $ do
        setEnv "NO_COLOUR" "1"
        detectStdoutColour Auto `shouldReturn` DisableColour
        detectStderrColour Auto `shouldReturn` DisableColour

    it "DisableColour when MYAPP_NO_COLOR is set" $ do
        setEnv "MYAPP_NO_COLOR" "1"
        detectStdoutColour Auto `shouldReturn` DisableColour
        detectStderrColour Auto `shouldReturn` DisableColour

    it "DisableColour when MYAPP_NO_COLOUR is set" $ do
        setEnv "MYAPP_NO_COLOUR" "1"
        detectStdoutColour Auto `shouldReturn` DisableColour
        detectStderrColour Auto `shouldReturn` DisableColour

    it "DisableColour when TERM=dumb" $ do
        setEnv "TERM" "dumb"
        detectStdoutColour Auto `shouldReturn` DisableColour
        detectStderrColour Auto `shouldReturn` DisableColour

    it "EnableColour when TERM=xterm-256color" $ do
        setEnv "TERM" "xterm-256color"
        ciColour <- colourWithCI
        detectStdoutColour Auto `shouldReturn` ciColour
        detectStderrColour Auto `shouldReturn` ciColour

    it "DisableColour when CI is set" $ do
        ciColour <- colourWithCI
        detectStdoutColour Auto `shouldReturn` ciColour
        detectStderrColour Auto `shouldReturn` ciColour

-- Helper functions

testEnvVars :: [String]
testEnvVars =
    [ "NO_COLOR"
    , "NO_COLOUR"
    , "MYAPP_NO_COLOR"
    , "MYAPP_NO_COLOUR"
    , "TERM"
    ]

clearAppEnv :: IO ()
clearAppEnv = for_ testEnvVars unsetEnv

colourWithCI :: IO ColourMode
colourWithCI = do
    isCi <- checkCI
    pure $ if isCi then DisableColour else EnableColour