package cobra import ( "bytes" "strings" "testing" ) func TestPowerShellCompletion(t *testing.T) { tcs := []struct { name string root *Command expectedExpressions []string }{ { name: "trivial", root: &Command{Use: "trivialapp"}, expectedExpressions: []string{ "Register-ArgumentCompleter -Native -CommandName 'trivialapp' -ScriptBlock", "$command = @(\n 'trivialapp'\n", }, }, { name: "tree", root: func() *Command { r := &Command{Use: "tree"} sub1 := &Command{Use: "sub1"} r.AddCommand(sub1) sub11 := &Command{Use: "sub11"} sub12 := &Command{Use: "sub12"} sub1.AddCommand(sub11) sub1.AddCommand(sub12) sub2 := &Command{Use: "sub2"} r.AddCommand(sub2) sub21 := &Command{Use: "sub21"} sub22 := &Command{Use: "sub22"} sub2.AddCommand(sub21) sub2.AddCommand(sub22) return r }(), expectedExpressions: []string{ "'tree'", "[CompletionResult]::new('sub1', 'sub1', [CompletionResultType]::ParameterValue, '')", "[CompletionResult]::new('sub2', 'sub2', [CompletionResultType]::ParameterValue, '')", "'tree;sub1'", "[CompletionResult]::new('sub11', 'sub11', [CompletionResultType]::ParameterValue, '')", "[CompletionResult]::new('sub12', 'sub12', [CompletionResultType]::ParameterValue, '')", "'tree;sub1;sub11'", "'tree;sub1;sub12'", "'tree;sub2'", "[CompletionResult]::new('sub21', 'sub21', [CompletionResultType]::ParameterValue, '')", "[CompletionResult]::new('sub22', 'sub22', [CompletionResultType]::ParameterValue, '')", "'tree;sub2;sub21'", "'tree;sub2;sub22'", }, }, { name: "flags", root: func() *Command { r := &Command{Use: "flags"} r.Flags().StringP("flag1", "a", "", "") r.Flags().String("flag2", "", "") sub1 := &Command{Use: "sub1"} sub1.Flags().StringP("flag3", "c", "", "") r.AddCommand(sub1) return r }(), expectedExpressions: []string{ "'flags'", "[CompletionResult]::new('-a', 'a', [CompletionResultType]::ParameterName, '')", "[CompletionResult]::new('--flag1', 'flag1', [CompletionResultType]::ParameterName, '')", "[CompletionResult]::new('--flag2', 'flag2', [CompletionResultType]::ParameterName, '')", "[CompletionResult]::new('sub1', 'sub1', [CompletionResultType]::ParameterValue, '')", "'flags;sub1'", "[CompletionResult]::new('-c', 'c', [CompletionResultType]::ParameterName, '')", "[CompletionResult]::new('--flag3', 'flag3', [CompletionResultType]::ParameterName, '')", }, }, { name: "usage", root: func() *Command { r := &Command{Use: "usage"} r.Flags().String("flag", "", "this describes the usage of the 'flag' flag") sub1 := &Command{ Use: "sub1", Short: "short describes 'sub1'", } r.AddCommand(sub1) return r }(), expectedExpressions: []string{ "[CompletionResult]::new('--flag', 'flag', [CompletionResultType]::ParameterName, 'this describes the usage of the ''flag'' flag')", "[CompletionResult]::new('sub1', 'sub1', [CompletionResultType]::ParameterValue, 'short describes ''sub1''')", }, }, } for _, tc := range tcs { t.Run(tc.name, func(t *testing.T) { buf := new(bytes.Buffer) tc.root.GenPowerShellCompletion(buf) output := buf.String() for _, expectedExpression := range tc.expectedExpressions { if !strings.Contains(output, expectedExpression) { t.Errorf("Expected completion to contain %q somewhere; got %q", expectedExpression, output) } } }) } }