opt-env-conf-test-0.0.0.2: test/OptEnvConf/CompletionSpec.hs
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE QuasiQuotes #-}
module OptEnvConf.CompletionSpec (spec) where
import Control.Applicative
import OptEnvConf.Completer
import OptEnvConf.Completion
import OptEnvConf.Parser
import OptEnvConf.Setting
import OptEnvConf.Test
import Path
import Test.Syd
spec :: Spec
spec = do
describe "bash" $ do
it "produces the same bash completion script" $
pureGoldenStringFile "test_resources/completion/bash-completion-script.bash" $
bashCompletionScript [absfile|/usr/bin/example-executable|] "example-executable"
describe "zsh" $ do
it "produces the same zsh completion script" $
pureGoldenStringFile "test_resources/completion/zsh-completion-script.zsh" $
zshCompletionScript [absfile|/usr/bin/example-executable|] "example-executable"
describe "fish" $ do
it "produces the same fish completion script" $
pureGoldenStringFile "test_resources/completion/fish-completion-script.fish" $
fishCompletionScript [absfile|/usr/bin/example-executable|] "example-executable"
describe "pureCompletionQuery" $ do
it "can complete a switch from nothing" $
parserCompletionTest
(setting [switch (), short 'e', long "example"])
0
[]
["--example"] -- Only the long version
it "can complete a short switch from a single dash" $
parserCompletionTest
(setting [switch (), short 'e'])
0
["-"]
["-e"]
it "can complete a long switch from a single dash" $
parserCompletionTest
(setting [switch (), long "example"])
0
["-"]
["--example"]
it "can complete a long switch from a double dash" $
parserCompletionTest
(setting [switch (), long "example"])
0
["--"]
["--example"]
it "can complete a short option's dashed" $
parserCompletionTest
(setting [option, short 'e', completer $ listCompleter ["hi"]])
0
[]
["-e"]
it "can complete a long option's dashed" $
parserCompletionTest
(setting [option, long "example", completer $ listCompleter ["hi"]])
0
[]
["--example"]
it "can complete a short option with a separate arg" $
parserCompletionTest
(setting [option, short 'e', completer $ listCompleter ["hi"]])
1
["-e"]
["hi"]
-- Don't think we want to support this.
-- pending "can complete a short option in short-hand mode.
it "can complete a long option" $
parserCompletionTest
(setting [option, long "example", completer $ listCompleter ["hi"]])
1
["--example"]
["hi"]
-- Don't think we want to support this
-- pending "can complete a long option with equals sign"
it "can complete both switches of a tuple" $
parserCompletionTest
((,) <$> setting [switch (), long "foo"] <*> setting [switch (), long "bar"])
0
[]
["--foo", "--bar"]
it "can complete both switches of a tuple, with a prefix" $
parserCompletionTest
((,) <$> setting [switch (), long "bar"] <*> setting [switch (), long "baz"])
0
["--b"]
["--bar", "--baz"]
it "can complete both switches of an either" $
parserCompletionTest
(setting [switch (), long "foo"] <|> setting [switch (), long "bar"])
0
[]
["--foo", "--bar"]
it "can complete both switches of an either wrapped in optionals" $
parserCompletionTest
(optional (setting [switch (), long "foo"]) <|> optional (setting [switch (), long "bar"]))
0
[]
["--foo", "--bar"]
describe "commands" $ do
let p =
commands
[ command "foo" "1" $ pure (),
command "bar" "2" $ pure (),
command "baz" "3" $ pure ()
]
it "can complete a command argument" $
parserCompletionTest
p
0
[]
[Completion "foo" (Just "1"), Completion "bar" (Just "2"), Completion "baz" (Just "3")]
it "can complete a command argument when it's been partially provided" $
parserCompletionTest
p
0
["b"]
[Completion "bar" (Just "2"), Completion "baz" (Just "3")]
describe "completion after a command" $ do
it "can complete a command with a switch" $
parserCompletionTest
(commands [command "foo" "1" $ setting [help "ex", switch (), short 'e', long "example"]])
1
["foo"]
[Completion "--example" (Just "ex")] -- Only the long version
it "can complete a command's short switch" $
parserCompletionTest
(commands [command "foo" "1" $ setting [switch (), short 'e']])
1
["foo", "-"]
["-e"]
it "can complete a command's long switch from a single dash" $
parserCompletionTest
(commands [command "foo" "1" $ setting [switch (), long "example"]])
1
["foo", "-"]
["--example"]
it "can complete a command's long switch from a double dash" $
parserCompletionTest
(commands [command "foo" "1" $ setting [switch (), long "example"]])
1
["foo", "--"]
["--example"]
it "can complete a command's short option" $
parserCompletionTest
(commands [command "foo" "1" $ setting [option, short 'e', completer $ listCompleter ["hi"]]])
2
["foo", "-e"]
["hi"]
it "can complete a command's long option" $
parserCompletionTest
(commands [command "foo" "1" $ setting [option, long "example", completer $ listCompleter ["hi"]]])
2
["foo", "--example"]
["hi"]
it "can complete a file argument" $
parserCompletionDescriptionTest
(filePathSetting [help "file arg", argument])
0
[]
["file arg"]
it "can complete a file option" $
parserCompletionDescriptionTest
(filePathSetting [help "file arg", option, long "file"])
1
["--file"]
["file arg"]
it "can complete a directory argument" $
parserCompletionDescriptionTest
(directoryPathSetting [help "dir arg", argument])
0
[]
["dir arg"]
it "can complete a directory option" $
parserCompletionDescriptionTest
(directoryPathSetting [help "dir arg", option, long "file"])
1
["--file"]
["dir arg"]
it "no longer suggests a switch that has already been parsed" $
parserCompletionTest
((,) <$> setting [switch (), long "foo"] <*> setting [switch (), long "bar"])
1
["--foo"]
["--bar"]
it "no longer suggests an option that has already been parsed" $
parserCompletionTest
( (,,)
<$> setting [option, reader (str :: Reader String), long "foo"]
<*> setting [option, reader (str :: Reader String), long "bar"]
<*> setting [switch (), long "quux"]
)
2
["--foo", "foo"]
["--bar", "--quux"]
it "no longer suggests an argument that has already been parsed" $
parserCompletionDescriptionTest
( (,,)
<$> setting [argument, reader (str :: Reader String), help "hi", completer $ listCompleter ["hi"]]
<*> setting [argument, reader (str :: Reader String), help "ho", completer $ listCompleter ["ho"]]
<*> setting [switch (), long "bar", help "hu"]
)
1
["foo"]
["ho", "hu"]