Skip to content

Commit

Permalink
Test v1 completion protocol
Browse files Browse the repository at this point in the history
(cherry picked from commit 9934680)
  • Loading branch information
roberth committed Jan 17, 2024
1 parent fa008aa commit 77d7248
Show file tree
Hide file tree
Showing 3 changed files with 37 additions and 0 deletions.
1 change: 1 addition & 0 deletions src/Options/Applicative.hs
Original file line number Diff line number Diff line change
Expand Up @@ -215,6 +215,7 @@ module Options.Applicative (
Completer,
mkCompleter,
CompletionItem(..),
CompletionItemOptions(..),
mkCompleterWithOptions,
listIOCompleter,

Expand Down
6 changes: 6 additions & 0 deletions src/Options/Applicative/BashCompletion.hs
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,12 @@ data Features = Features
, protocolVersion :: Int
}

-- | Version of the output format that the shell integration script
-- expects optparse-applicative to write to stdout.
--
-- Version increases should be rare, because most changes
-- can be handled by adding a new % keyword. Unknown keywords
-- are ignored by the shell integration scripts.
currentProtocolVerson :: Int
currentProtocolVerson = 1

Expand Down
30 changes: 30 additions & 0 deletions tests/test.hs
Original file line number Diff line number Diff line change
Expand Up @@ -468,6 +468,36 @@ prop_completion_rich_lengths = once . ioProperty $
Failure _ -> return $ counterexample "unexpected failure" failed
Success val -> return $ counterexample ("unexpected result " ++ show val) failed

prop_completion_v1_default :: Property
prop_completion_v1_default = once . ioProperty $
let p :: Parser String
p = strArgument (completer (mkCompleterWithOptions (pure (pure [CompletionItem mempty "reachable"]))))
i = info p idm
result = run i [ "--optparse-completion-version", "1"
, "--bash-completion-index=0"
]
in case result of
CompletionInvoked (CompletionResult err) -> do
completions <- lines <$> err "test"
return $ ["%addspace", "%files", "%value", "reachable"] === completions
Failure _ -> return $ counterexample "unexpected failure" failed
Success val -> return $ counterexample ("unexpected result " ++ show val) failed

prop_completion_v1_minimal :: Property
prop_completion_v1_minimal = once . ioProperty $
let p :: Parser String
p = strArgument (completer (mkCompleterWithOptions (pure (pure [CompletionItem (mempty { cioAddSpace = False, cioFiles = False }) "reachable"]))))
i = info p idm
result = run i [ "--optparse-completion-version", "1"
, "--bash-completion-index=0"
]
in case result of
CompletionInvoked (CompletionResult err) -> do
completions <- lines <$> err "test"
return $ ["%value", "reachable"] === completions
Failure _ -> return $ counterexample "unexpected failure" failed
Success val -> return $ counterexample ("unexpected result " ++ show val) failed

prop_bind_usage :: Property
prop_bind_usage = once $
let p :: Parser [String]
Expand Down

0 comments on commit 77d7248

Please sign in to comment.