diff --git a/src/GitParamTabExpansion.ps1 b/src/GitParamTabExpansion.ps1 index a3839bc5c..c5cfa999c 100644 --- a/src/GitParamTabExpansion.ps1 +++ b/src/GitParamTabExpansion.ps1 @@ -23,7 +23,7 @@ $shortGitParams = @{ mv = 'f k n v' notes = 'f m F C c n s q v' prune = 'n v' - pull = 'q v e n s X r a f k u' + pull = 'q v e n s X r a f k' push = 'n f u q v' rebase = 'm s X S q v n C f i p x' remote = 'v' @@ -53,20 +53,20 @@ $longGitParams = @{ commit = 'all patch reuse-message reedit-message fixup squash reset-author short branch porcelain long null file author date message template signoff no-verify allow-empty allow-empty-message cleanup= edit no-edit amend no-post-rewrite include only untracked-files verbose quiet dry-run status no-status gpg-sign no-gpg-sign' config = 'replace-all add get get-all get-regexp get-urlmatch global system local file blob remove-section rename-section unset unset-all list bool int bool-or-int path null get-colorbool get-color edit includes no-includes' describe = 'dirty all tags contains abbrev candidates= exact-match debug long match always first-parent' - diff = 'cached patch no-patch unified= raw patch-with-raw minimal patience histogram diff-algorithm= stat numstat shortstat dirstat summary patch-with-stat name-only name-status submodule color no-color word-diff word-diff-regex color-words no-renames check full-index binary apprev break-rewrites find-renames find-copies find-copies-harder irreversible-delete diff-filter= pickaxe-all pickaxe-regex relative text ignore-space-at-eol ignore-space-change ignore-all-space ignore-blank-lines inter-hunk-context= function-context exit-code quiet ext-diff no-ext-diff textconv no-textconv ignore-submodules src-prefix dst-prefix no-prefix staged' + diff = 'cached patch no-patch unified= raw patch-with-raw minimal patience histogram diff-algorithm= stat numstat shortstat dirstat summary patch-with-stat name-only name-status submodule color no-color word-diff word-diff-regex color-words no-renames check full-index binary break-rewrites find-renames find-copies find-copies-harder irreversible-delete diff-filter= pickaxe-all pickaxe-regex relative text ignore-space-at-eol ignore-space-change ignore-all-space ignore-blank-lines inter-hunk-context= function-context exit-code quiet ext-diff no-ext-diff textconv no-textconv ignore-submodules src-prefix dst-prefix no-prefix staged' difftool = 'dir-diff no-prompt prompt tool= tool-help no-symlinks symlinks extcmd= gui' fetch = 'all append depth= unshallow update-shallow dry-run force keep multiple prune no-tags tags recurse-submodules= no-recurse-submodules submodule-prefix= recurse-submodules-default= update-head-ok upload-pack quiet verbose progress' gc = 'aggressive auto prune= no-prune quiet force' - grep = 'cached no-index untracked no-exclude-standard exclude-standard text textconv no-textconv ignore-case max-depth word-regexp invert-match full-name extended-regexp basic-regexp perl-regexp fixed-strings line-number files-with-matches open-file-in-pager null count color no-color break heading show-function context after-context before-context function-context and or not all-match quiet' + grep = 'cached no-index untracked no-exclude-standard exclude-standard text textconv no-textconv ignore-case max-depth word-regexp invert-match full-name extended-regexp basic-regexp perl-regexp fixed-strings line-number files-with-matches open-files-in-pager null count color no-color break heading show-function context after-context before-context function-context and or not all-match quiet' help = 'all guides info man web' init = 'quiet bare template= separate-git-dir= shared=' - log = 'follow no-decorate decorate source use-mailmap full-diff log-size max-count skip since after until before author committer grep-reflog grep all-match regexp-ignore-case basic-regexp extended-regexp fixed-strings perl-regexp remove-empty merges no-merges min-parents max-parents no-min-parents no-max-parents first-parent not all branches tags remote glob= exclude= ignore-missing bisect stdin cherry-mark cherry-pick left-only right-only cherry walk-reflogs merge boundary simplify-by-decoration full-history dense sparse simplify-merges ancestry-path date-order author-date-order topo-order reverse objects objects-edge unpacked no-walk= do-walk pretty format= abbrev-commit no-abbrev-commit oneline encoding= notes no-notes standard-notes no-standard-notes show-signature relative-date date= parents children left-right graph show-linear-break patch stat' + log = 'follow no-decorate decorate source use-mailmap full-diff log-size max-count skip since after until before author committer grep-reflog grep all-match regexp-ignore-case basic-regexp extended-regexp fixed-strings perl-regexp remove-empty merges no-merges min-parents= max-parents= no-min-parents no-max-parents first-parent not all branches tags remotes glob= exclude= ignore-missing bisect stdin cherry-mark cherry-pick left-only right-only cherry walk-reflogs merge boundary simplify-by-decoration full-history dense sparse simplify-merges ancestry-path date-order author-date-order topo-order reverse objects objects-edge unpacked no-walk= do-walk pretty format= abbrev-commit no-abbrev-commit oneline encoding= notes no-notes standard-notes no-standard-notes show-signature relative-date date= parents children left-right graph show-linear-break patch stat' merge = 'commit no-commit edit no-edit ff no-ff ff-only log no-log stat no-stat squash no-squash strategy strategy-option verify-signatures no-verify-signatures summary no-summary quiet verbose progress no-progress gpg-sign rerere-autoupdate no-rerere-autoupdate abort allow-unrelated-histories' mergetool = 'tool= tool-help no-prompt prompt' mv = 'force dry-run verbose' notes = 'force message file reuse-message reedit-message ref ignore-missing stdin dry-run strategy= commit abort quiet verbose' prune = 'dry-run verbose expire' - pull = 'quiet verbose recurse-submodules= no-recurse-submodules= commit no-commit edit no-edit ff no-ff ff-only log no-log stat no-stat squash no-squash strategy= strategy-option= verify-signatures no-verify-signatures summary no-summary rebase= no-rebase all append depth= unshallow update-shallow force keep no-tags update-head-ok upload-pack progress' + pull = 'quiet verbose recurse-submodules= no-recurse-submodules= commit no-commit edit no-edit ff no-ff ff-only log no-log stat no-stat squash no-squash strategy= strategy-option= verify-signatures no-verify-signatures summary no-summary rebase= no-rebase all append depth= unshallow update-shallow force keep no-tags upload-pack progress' push = 'all prune mirror dry-run porcelain delete tags follow-tags receive-pack= exec= force-with-lease no-force-with-lease force repo= set-upstream thin no-thin quiet verbose progress recurse-submodules= verify no-verify' rebase = 'onto continue abort keep-empty skip edit-todo merge strategy= strategy-option= gpg-sign quiet verbose stat no-stat no-verify verify force-rebase fork-point no-fork-point ignore-whitespace whitespace= committer-date-is-author-date ignore-date interactive preserve-merges exec root autosquash no-autosquash autostash no-autostash no-ff' reflog = 'stale-fix expire= expire-unreachable= all updateref rewrite verbose' diff --git a/test/GitParamTabExpansionValid.Tests.ps1 b/test/GitParamTabExpansionValid.Tests.ps1 new file mode 100644 index 000000000..1d8a56ce4 --- /dev/null +++ b/test/GitParamTabExpansionValid.Tests.ps1 @@ -0,0 +1,487 @@ +BeforeAll { + . $PSScriptRoot\Shared.ps1 + . $PSScriptRoot\ParamValidationUtils.ps1 +} + +Describe 'TabExpansion Tests' { + BeforeAll { + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseDeclaredVarsMoreThanAssigments', '')] + $repoPath = NewGitTempRepo -MakeInitialCommit + } + + AfterAll { + RemoveGitTempRepo $repoPath + } + + Context 'TabExpansion suggest valid long params' { + It 'Suggest only valid long params for "add" subcommand' { + $invalidOptions = GetInvalidLongParams -subcommand 'add' -paramsToSkip @('--edit', '--interactive') + + $invalidOptions | Should -BeNullOrEmpty + } + + It 'Suggest only valid long params for "bisect" subcommand' { + $invalidOptions = GetInvalidLongParams -subcommand 'bisect' + + $invalidOptions | Should -BeNullOrEmpty + } + + It 'Suggest only valid long params for "branch" subcommand' { + $invalidOptions = GetInvalidLongParams -subcommand 'branch' -paramsToSkip @('--edit-description') + + $invalidOptions | Should -BeNullOrEmpty + } + + It 'Suggest only valid long params for "checkout" subcommand' { + $invalidOptions = GetInvalidLongParams -subcommand 'checkout' + + $invalidOptions | Should -BeNullOrEmpty + } + + It 'Suggest only valid long params for "cherry-pick" subcommand' { + $invalidOptions = GetInvalidLongParams -subcommand 'cherry-pick' + + $invalidOptions | Should -BeNullOrEmpty + } + + It 'Suggest only valid long params for "clean" subcommand' { + $invalidOptions = GetInvalidLongParams -subcommand 'clean' + + $invalidOptions | Should -BeNullOrEmpty + } + + It 'Suggest only valid long params for "clone" subcommand' { + $invalidOptions = GetInvalidLongParams -subcommand 'clone' + + $invalidOptions | Should -BeNullOrEmpty + } + + It 'Suggest only valid long params for "commit" subcommand' { + $invalidOptions = GetInvalidLongParams -subcommand 'commit' -paramsToSkip @('--allow-empty', '--amend', '--edit') + + $invalidOptions | Should -BeNullOrEmpty + } + + It 'Suggest only valid long params for "config" subcommand' { + $invalidOptions = GetInvalidLongParams -subcommand 'config' -paramsToSkip @('--edit') + + $invalidOptions | Should -BeNullOrEmpty + } + + It 'Suggest only valid long params for "describe" subcommand' { + $invalidOptions = GetInvalidLongParams -subcommand 'describe' + + $invalidOptions | Should -BeNullOrEmpty + } + + It 'Suggest only valid long params for "diff" subcommand' { + $invalidOptions = GetInvalidLongParams -subcommand 'diff' + + $invalidOptions | Should -BeNullOrEmpty + } + + It 'Suggest only valid long params for "difftool" subcommand' { + $invalidOptions = GetInvalidLongParams -subcommand 'difftool' + + $invalidOptions | Should -BeNullOrEmpty + } + + It 'Suggest only valid long params for "fetch" subcommand' { + $invalidOptions = GetInvalidLongParams -subcommand 'fetch' + + $invalidOptions | Should -BeNullOrEmpty + } + + It 'Suggest only valid long params for "gc" subcommand' { + $invalidOptions = GetInvalidLongParams -subcommand 'gc' + + $invalidOptions | Should -BeNullOrEmpty + } + + It 'Suggest only valid long params for "grep" subcommand' { + $invalidOptions = GetInvalidLongParams -subcommand 'grep' + + $invalidOptions | Should -BeNullOrEmpty + } + + It 'Suggest only valid long params for "help" subcommand' { + $invalidOptions = GetInvalidLongParams -subcommand 'help' + + $invalidOptions | Should -BeNullOrEmpty + } + + It 'Suggest only valid long params for "init" subcommand' { + $invalidOptions = GetInvalidLongParams -subcommand 'init' + + $invalidOptions | Should -BeNullOrEmpty + } + + It 'Suggest only valid long params for "log" subcommand' { + $invalidOptions = GetInvalidLongParams -subcommand 'log' -paramsToSkip @('--stdin') + + $invalidOptions | Should -BeNullOrEmpty + } + + It 'Suggest only valid long params for "merge" subcommand' { + $invalidOptions = GetInvalidLongParams -subcommand 'merge' + + $invalidOptions | Should -BeNullOrEmpty + } + + It 'Suggest only valid long params for "mergetool" subcommand' { + $invalidOptions = GetInvalidLongParams -subcommand 'mergetool' + + $invalidOptions | Should -BeNullOrEmpty + } + + It 'Suggest only valid long params for "mv" subcommand' { + $invalidOptions = GetInvalidLongParams -subcommand 'mv' + + $invalidOptions | Should -BeNullOrEmpty + } + + It 'Suggest only valid long params for "prune" subcommand' { + $invalidOptions = GetInvalidLongParams -subcommand 'prune' + + $invalidOptions | Should -BeNullOrEmpty + } + + It 'Suggest only valid long params for "pull" subcommand' { + $invalidOptions = GetInvalidLongParams -subcommand 'pull' + + $invalidOptions | Should -BeNullOrEmpty + } + + It 'Suggest only valid long params for "push" subcommand' { + $invalidOptions = GetInvalidLongParams -subcommand 'push' + + $invalidOptions | Should -BeNullOrEmpty + } + + It 'Suggest only valid long params for "rebase" subcommand' { + $invalidOptions = GetInvalidLongParams -subcommand 'rebase' + + $invalidOptions | Should -BeNullOrEmpty + } + + It 'Suggest only valid long params for "reflog" subcommand' { + $invalidOptions = GetInvalidLongParams -subcommand 'reflog' @('--expire=', '--expire-unreachable=', '--rewrite', '--stale-fix', '--updateref', '--verbose') + + $invalidOptions | Should -BeNullOrEmpty + } + + It 'Suggest only valid long params for "remote" subcommand' { + $invalidOptions = GetInvalidLongParams -subcommand 'remote' + + $invalidOptions | Should -BeNullOrEmpty + } + + It 'Suggest only valid long params for "reset" subcommand' { + $invalidOptions = GetInvalidLongParams -subcommand 'reset' + + $invalidOptions | Should -BeNullOrEmpty + } + + It 'Suggest only valid long params for "restore" subcommand' { + $invalidOptions = GetInvalidLongParams -subcommand 'restore' + + $invalidOptions | Should -BeNullOrEmpty + } + + It 'Suggest only valid long params for "revert" subcommand' { + $invalidOptions = GetInvalidLongParams -subcommand 'revert' + + $invalidOptions | Should -BeNullOrEmpty + } + + It 'Suggest only valid long params for "rm" subcommand' { + $invalidOptions = GetInvalidLongParams -subcommand 'rm' + + $invalidOptions | Should -BeNullOrEmpty + } + + It 'Suggest only valid long params for "shortlog" subcommand' { + $invalidOptions = GetInvalidLongParams -subcommand 'shortlog' + + $invalidOptions | Should -BeNullOrEmpty + } + + It 'Suggest only valid long params for "show" subcommand' { + $invalidOptions = GetInvalidLongParams -subcommand 'show' + + $invalidOptions | Should -BeNullOrEmpty + } + + It 'Suggest only valid long params for "stash" subcommand' { + $invalidOptions = GetInvalidLongParams -subcommand 'stash' -paramsToSkip @('--index') + + $invalidOptions | Should -BeNullOrEmpty + } + + It 'Suggest only valid long params for "status" subcommand' { + $invalidOptions = GetInvalidLongParams -subcommand 'status' + + $invalidOptions | Should -BeNullOrEmpty + } + + It 'Suggest only valid long params for "submodule" subcommand' { + $invalidOptions = GetInvalidLongParams -subcommand 'submodule' + + $invalidOptions | Should -BeNullOrEmpty + } + + It 'Suggest only valid long params for "switch" subcommand' { + $invalidOptions = GetInvalidLongParams -subcommand 'switch' + + $invalidOptions | Should -BeNullOrEmpty + } + + It 'Suggest only valid long params for "tag" subcommand' { + $invalidOptions = GetInvalidLongParams -subcommand 'tag' + + $invalidOptions | Should -BeNullOrEmpty + } + + It 'Suggest only valid long params for "whatchanged" subcommand' { + $invalidOptions = GetInvalidLongParams -subcommand 'whatchanged' + + $invalidOptions | Should -BeNullOrEmpty + } + } + + Context 'TabExpansion suggest valid short params' { + It 'Suggest only valid short params for "add" subcommand' { + $invalidOptions = GetInvalidShortParams -subcommand 'add' -paramsToSkip @('-e', '-i') + + $invalidOptions | Should -BeNullOrEmpty + } + + It 'Suggest only valid short params for "bisect" subcommand' { + $invalidOptions = GetInvalidShortParams -subcommand 'bisect' + + $invalidOptions | Should -BeNullOrEmpty + } + + It 'Suggest only valid short params for "blame" subcommand' { + $invalidOptions = GetInvalidShortParams -subcommand 'blame' + + $invalidOptions | Should -BeNullOrEmpty + } + + It 'Suggest only valid short params for "branch" subcommand' { + $invalidOptions = GetInvalidShortParams -subcommand 'branch' + + $invalidOptions | Should -BeNullOrEmpty + } + + It 'Suggest only valid short params for "checkout" subcommand' { + $invalidOptions = GetInvalidShortParams -subcommand 'checkout' + + $invalidOptions | Should -BeNullOrEmpty + } + + It 'Suggest only valid short params for "cherry" subcommand' { + $invalidOptions = GetInvalidShortParams -subcommand 'cherry' + + $invalidOptions | Should -BeNullOrEmpty + } + + It 'Suggest only valid short params for "cherry-pick" subcommand' { + $invalidOptions = GetInvalidShortParams -subcommand 'cherry-pick' + + $invalidOptions | Should -BeNullOrEmpty + } + + It 'Suggest only valid short params for "clean" subcommand' { + $invalidOptions = GetInvalidShortParams -subcommand 'clean' + + $invalidOptions | Should -BeNullOrEmpty + } + + It 'Suggest only valid short params for "clone" subcommand' { + $invalidOptions = GetInvalidShortParams -subcommand 'clone' + + $invalidOptions | Should -BeNullOrEmpty + } + + It 'Suggest only valid short params for "commit" subcommand' { + $invalidOptions = GetInvalidShortParams -subcommand 'commit' + + $invalidOptions | Should -BeNullOrEmpty + } + + It 'Suggest only valid short params for "config" subcommand' { + $invalidOptions = GetInvalidShortParams -subcommand 'config' -paramsToSkip @('-e') + + $invalidOptions | Should -BeNullOrEmpty + } + + It 'Suggest only valid short params for "diff" subcommand' { + $invalidOptions = GetInvalidShortParams -subcommand 'diff' + + $invalidOptions | Should -BeNullOrEmpty + } + + It 'Suggest only valid short params for "difftool" subcommand' { + $invalidOptions = GetInvalidShortParams -subcommand 'difftool' + + $invalidOptions | Should -BeNullOrEmpty + } + + It 'Suggest only valid short params for "fetch" subcommand' { + $invalidOptions = GetInvalidShortParams -subcommand 'fetch' + + $invalidOptions | Should -BeNullOrEmpty + } + + It 'Suggest only valid short params for "grep" subcommand' { + $invalidOptions = GetInvalidShortParams -subcommand 'grep' + + $invalidOptions | Should -BeNullOrEmpty + } + + It 'Suggest only valid short params for "help" subcommand' { + $invalidOptions = GetInvalidShortParams -subcommand 'help' + + $invalidOptions | Should -BeNullOrEmpty + } + + It 'Suggest only valid short params for "init" subcommand' { + $invalidOptions = GetInvalidShortParams -subcommand 'init' + + $invalidOptions | Should -BeNullOrEmpty + } + + It 'Suggest only valid short params for "log" subcommand' { + $invalidOptions = GetInvalidShortParams -subcommand 'log' + + $invalidOptions | Should -BeNullOrEmpty + } + + It 'Suggest only valid short params for "merge" subcommand' { + $invalidOptions = GetInvalidShortParams -subcommand 'merge' + + $invalidOptions | Should -BeNullOrEmpty + } + + It 'Suggest only valid short params for "mergetool" subcommand' { + $invalidOptions = GetInvalidShortParams -subcommand 'mergetool' + + $invalidOptions | Should -BeNullOrEmpty + } + + It 'Suggest only valid short params for "mv" subcommand' { + $invalidOptions = GetInvalidShortParams -subcommand 'mv' + + $invalidOptions | Should -BeNullOrEmpty + } + + It 'Suggest only valid short params for "prune" subcommand' { + $invalidOptions = GetInvalidShortParams -subcommand 'prune' + + $invalidOptions | Should -BeNullOrEmpty + } + + It 'Suggest only valid short params for "pull" subcommand' { + $invalidOptions = GetInvalidShortParams -subcommand 'pull' -paramsToSkip @('-e') + + $invalidOptions | Should -BeNullOrEmpty + } + + It 'Suggest only valid short params for "push" subcommand' { + $invalidOptions = GetInvalidShortParams -subcommand 'push' + + $invalidOptions | Should -BeNullOrEmpty + } + + It 'Suggest only valid short params for "rebase" subcommand' { + $invalidOptions = GetInvalidShortParams -subcommand 'rebase' + + $invalidOptions | Should -BeNullOrEmpty + } + + It 'Suggest only valid short params for "reflog" subcommand' { + $invalidOptions = GetInvalidShortParams -subcommand 'reflog' + + $invalidOptions | Should -BeNullOrEmpty + } + + It 'Suggest only valid short params for "remote" subcommand' { + $invalidOptions = GetInvalidShortParams -subcommand 'remote' + + $invalidOptions | Should -BeNullOrEmpty + } + + It 'Suggest only valid short params for "reset" subcommand' { + $invalidOptions = GetInvalidShortParams -subcommand 'reset' + + $invalidOptions | Should -BeNullOrEmpty + } + + It 'Suggest only valid short params for "restore" subcommand' { + $invalidOptions = GetInvalidShortParams -subcommand 'restore' + + $invalidOptions | Should -BeNullOrEmpty + } + + It 'Suggest only valid short params for "revert" subcommand' { + $invalidOptions = GetInvalidShortParams -subcommand 'revert' + + $invalidOptions | Should -BeNullOrEmpty + } + + It 'Suggest only valid short params for "rm" subcommand' { + $invalidOptions = GetInvalidShortParams -subcommand 'rm' + + $invalidOptions | Should -BeNullOrEmpty + } + + It 'Suggest only valid short params for "shortlog" subcommand' { + $invalidOptions = GetInvalidShortParams -subcommand 'shortlog' + + $invalidOptions | Should -BeNullOrEmpty + } + + It 'Suggest only valid short params for "show" subcommand' { + $invalidOptions = GetInvalidShortParams -subcommand 'show' + + $invalidOptions | Should -BeNullOrEmpty + } + + It 'Suggest only valid short params for "stash" subcommand' { + $invalidOptions = GetInvalidShortParams -subcommand 'stash' + + $invalidOptions | Should -BeNullOrEmpty + } + + It 'Suggest only valid short params for "status" subcommand' { + $invalidOptions = GetInvalidShortParams -subcommand 'status' + + $invalidOptions | Should -BeNullOrEmpty + } + + It 'Suggest only valid short params for "submodule" subcommand' { + $invalidOptions = GetInvalidShortParams -subcommand 'submodule' + + $invalidOptions | Should -BeNullOrEmpty + } + + It 'Suggest only valid short params for "switch" subcommand' { + $invalidOptions = GetInvalidShortParams -subcommand 'switch' + + $invalidOptions | Should -BeNullOrEmpty + } + + It 'Suggest only valid short params for "tag" subcommand' { + $invalidOptions = GetInvalidShortParams -subcommand 'tag' + + $invalidOptions | Should -BeNullOrEmpty + } + + It 'Suggest only valid short params for "whatchanged" subcommand' { + $invalidOptions = GetInvalidShortParams -subcommand 'whatchanged' + + $invalidOptions | Should -BeNullOrEmpty + } + } +} diff --git a/test/ParamValidationUtils.Tests.ps1 b/test/ParamValidationUtils.Tests.ps1 new file mode 100644 index 000000000..de4cc820d --- /dev/null +++ b/test/ParamValidationUtils.Tests.ps1 @@ -0,0 +1,109 @@ +BeforeAll { + . $PSScriptRoot\Shared.ps1 + . $PSScriptRoot\ParamValidationUtils.ps1 +} + +Describe 'ParamValidationUtils Tests' { + BeforeAll { + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseDeclaredVarsMoreThanAssigments', '')] + $repoPath = NewGitTempRepo -MakeInitialCommit + } + + AfterAll { + RemoveGitTempRepo $repoPath + } + + Context 'Catching long params errors' { + It 'Command with correct long param does not contains params errors' { + $errorStream = GetErrorStream -command "$gitbin help --info" + $result = IsStreamContainsInvalidParamsErrors -errorStream $errorStream + + $result | Should -be $false + } + + It 'Incorrect command usage with valid long param does not contains params errors' { + # Returns usage info + $errorStream = GetErrorStream -command "$gitbin bisect --no-checkout" + $result = IsStreamContainsInvalidParamsErrors -errorStream $errorStream + + $result | Should -be $false + } + + It 'Failed command with valid long params does not contains params errors' { + # Returns: fatal: There is no merge to abort (MERGE_HEAD missing). + $errorStream = GetErrorStream -command "$gitbin merge --abort" + $result = IsStreamContainsInvalidParamsErrors -errorStream $errorStream + + $result | Should -be $false + } + + It 'Command with invalid long param contains errors' { + # Returns: error: invalid option: --bad-param-option + $errorStream = GetErrorStream -command "$gitbin diff --bad-param-option" + $result = IsStreamContainsInvalidParamsErrors -errorStream $errorStream + + $result | Should -be $true + } + + It 'Command with unknow long param contains errors' { + # Returns: error: unknown option `--bad-param-option' + # and usage info + $errorStream = GetErrorStream -command "$gitbin blame --bad-param-option" + $result = IsStreamContainsInvalidParamsErrors -errorStream $errorStream + + $result | Should -be $true + } + + It 'Command with unrecognized long param contains error' { + # Returns: fatal: unrecognized argument: --bad-param-option + $errorStream = GetErrorStream -command "$gitbin show --bad-param-option" + $result = IsStreamContainsInvalidParamsErrors -errorStream $errorStream + + $result | Should -be $true + } + } + + Context 'Catching short params error' { + It 'Correct command with correct short param does not contains params errors' { + $errorStream = GetErrorStream -command "$gitbin help -h" + $result = IsStreamContainsInvalidParamsErrors -errorStream $errorStream + + $result | Should -be $false + } + + It 'Command with invalid short param contains errors' { + # Returns: error: invalid option: -Z + $errorStream = GetErrorStream -command "$gitbin diff -Z" + $result = IsStreamContainsInvalidParamsErrors -errorStream $errorStream + + $result | Should -be $true + } + + It 'Command with unknow short param contains errors' { + # Returns: error: unknown option `-Z' + # and usage info + $errorStream = GetErrorStream -command "$gitbin blame -Z" + $result = IsStreamContainsInvalidParamsErrors -errorStream $errorStream + + $result | Should -be $true + } + + It 'Command with unrecognized short param contains error' { + # Returns: fatal: unrecognized argument: -Z + $errorStream = GetErrorStream -command "$gitbin show -Z" + $result = IsStreamContainsInvalidParamsErrors -errorStream $errorStream + + $result | Should -be $true + } + + It 'Command with unknown switch short param contains error' { + # Returns: error: unknown switch `e' + # and usage info + + $errorStream = GetErrorStream -command "$gitbin pull -e" + $result = IsStreamContainsInvalidParamsErrors -errorStream $errorStream + + $result | Should -be $true + } + } +} diff --git a/test/ParamValidationUtils.ps1 b/test/ParamValidationUtils.ps1 new file mode 100644 index 000000000..2747d27df --- /dev/null +++ b/test/ParamValidationUtils.ps1 @@ -0,0 +1,102 @@ +$script:badMessages = @('fatal: unrecognized argument', 'error: unknown option', 'error: invalid option', 'error: unknown switch') +$script:VerboseCommands = $false +$script:VerboseErrors = $false + +function SetVerbosityForParamValidation($verboseCommands = $false, $verboseErrors = $false) { + $script:VerboseCommands = $verboseCommands + $script:VerboseErrors = $verboseErrors +} + +function GetErrorStream($command) { + Invoke-Expression $("& $command 2>''") -ErrorVariable errStream + return $errStream +} + +function ConvertErrorToString($errorStream) { + if ($null -eq $errorStream) { + return "" + } + + $type = $errorStream.GetType() + + if ($type -eq [System.String]) { + return $errorStream + } + + if ($type -eq [System.Management.Automation.ErrorRecord]) { + return $errorStream.Exception.Message + } + + if ($type -ne [System.Object[]]) { + throw "Can't match type of result $type" + } + + $element = $errorStream[0] + $elementType = $element.GetType() + + if ($elementType -eq [System.String]) { + return $element + } + if ($elementType -eq [System.Management.Automation.ErrorRecord]) { + return $element.Exception.Message + } + + throw "Can't match type of element $elementType" +} + +function IsStreamContainsInvalidParamsErrors($errorStream) { + if ($null -eq $errorStream) { + return $false + } + + $streamOutput = ConvertErrorToString -errorStream $errorStream + + foreach ($errorText in $badMessages) { + if ($streamOutput.StartsWith($errorText)) { + return $true + } + } + + return $false +} + +function GetInvalidParams($subcommand, $paramsPrefix, $paramsToSkip = @()) { + $command = $('git ' + $subcommand + ' ' + $paramsPrefix) + $gitStatus = Get-GitStatus + $completions = & $module GitTabExpansionInternal $command $gitStatus + $invalidCompletions = @() + + foreach ($completion in $completions) { + if ($paramsToSkip -contains $completion) { + continue + } + + $commandUnderTest = "$gitbin $subcommand $completion" + + if ($script:VerboseCommands) { + Write-Host $commandUnderTest + } + + $commandErrorOutput = GetErrorStream -command $commandUnderTest + $hasErrors = IsStreamContainsInvalidParamsErrors -errorStream $commandErrorOutput + + if ($script:VerboseErrors) { + $printableError = ConvertErrorToString -errorStream $commandErrorOutput + Write-Host $printableError -ForegroundColor Red + } + + if ($hasErrors) { + $invalidCompletions += $completion + } + } + + return $invalidCompletions +} + +function GetInvalidLongParams($subcommand, $paramsToSkip = @()) { + return GetInvalidParams -subcommand $subcommand -paramsPrefix '--' -paramsToSkip $paramsToSkip +} + +function GetInvalidShortParams($subcommand, $paramsToSkip = @()) { + return GetInvalidParams -subcommand $subcommand -paramsPrefix '-' -paramsToSkip $paramsToSkip +}