From 28ca46036a3932fa6ca1e562999c163c2c673b2c Mon Sep 17 00:00:00 2001 From: rsteube Date: Mon, 26 Dec 2022 13:15:49 +0100 Subject: [PATCH] example: added flag tests --- example/cmd/flag.go | 6 ++-- example/main_test.go | 72 +++++++++++++++++++++++++++++++++++++ internal/common/traverse.go | 5 +++ 3 files changed, 80 insertions(+), 3 deletions(-) diff --git a/example/cmd/flag.go b/example/cmd/flag.go index d5087b5fd..f9a399236 100644 --- a/example/cmd/flag.go +++ b/example/cmd/flag.go @@ -2,7 +2,6 @@ package cmd import ( "net" - "os" "time" "github.com/rsteube/carapace" @@ -55,8 +54,9 @@ func init() { flagCmd.Flags().Uint("Uint", 0, "Uint") flagCmd.Flags().UintSlice("UintSlice", []uint{}, "UintSlice") + flagCmd.Flags().Bool("optarg", false, "test optarg variant (must be second arg on command line to work)") // TODO quick&dirty toggle for now carapace.Gen(rootCmd).PreRun(func(cmd *cobra.Command, args []string) { - if _, exists := os.LookupEnv("OPTARG"); !exists { + if len(args) < 2 || args[1] != "--optarg" { return } @@ -105,7 +105,7 @@ func init() { "BytesHex": carapace.ActionValues("01", "02", "03"), "Count": carapace.ActionValues(), "Duration": carapace.ActionValues("1h", "2m", "3s"), - "DurationSlice": carapace.ActionValues("1", "2", "3"), + "DurationSlice": carapace.ActionValues("1h", "2m", "3s"), "Float32P": carapace.ActionValues("1", "2", "3"), "Float32Slice": carapace.ActionValues("1", "2", "3"), "Float64P": carapace.ActionValues("1", "2", "3"), diff --git a/example/main_test.go b/example/main_test.go index f37f27bac..b87541305 100644 --- a/example/main_test.go +++ b/example/main_test.go @@ -104,6 +104,78 @@ var tests = map[string]string{ `example multiparts VALUE=`: "one", `example multiparts VALUE=one,`: "DIRECTORY", `example multiparts VALUE=one,DIRECTORY=`: "/", + + // `example flag --Bool `: "", + // `example flag --BoolSlice `: "", + `example flag --BytesBase64 `: "M", + `example flag --BytesHex `: "0", + // `example flag --Count `: "", + `example flag --Duration `: "1h", + `example flag --DurationSlice `: "1h", + `example flag --Float32P `: "1", + `example flag --Float32Slice `: "1", + `example flag --Float64P `: "1", + `example flag --Float64Slice `: "1", + `example flag --Int16 `: "1", + `example flag --Int32 `: "1", + `example flag --Int32Slice `: "1", + `example flag --Int64 `: "1", + `example flag --Int64Slice `: "1", + `example flag --Int8 `: "1", + `example flag --Int `: "1", + `example flag --IntSlice `: "1", + `example flag --IPMask `: "0", + `example flag --IP `: "0", + `example flag --IPNet `: "0", + `example flag --IPSlice `: "0", + `example flag --StringArray `: "1", + `example flag --String `: "1", + `example flag --StringSlice `: "1", + `example flag --StringToInt64 `: "a", + `example flag --StringToInt `: "a", + `example flag --StringToString `: "a", + `example flag --Uint16 `: "1", + `example flag --Uint32 `: "1", + `example flag --Uint64 `: "1", + `example flag --Uint8 `: "1", + `example flag --Uint `: "1", + `example flag --UintSlice `: "1", + + // `example flag --optarg --Bool=`: "", + // `example flag --optarg --BoolSlice=`: "", + `example flag --optarg --BytesBase64=`: "M", + `example flag --optarg --BytesHex=`: "0", + // `example flag --optarg --Count=`: "", + `example flag --optarg --Duration=`: "1h", + `example flag --optarg --DurationSlice=`: "1h", + `example flag --optarg --Float32P=`: "1", + `example flag --optarg --Float32Slice=`: "1", + `example flag --optarg --Float64P=`: "1", + `example flag --optarg --Float64Slice=`: "1", + `example flag --optarg --Int16=`: "1", + `example flag --optarg --Int32=`: "1", + `example flag --optarg --Int32Slice=`: "1", + `example flag --optarg --Int64=`: "1", + `example flag --optarg --Int64Slice=`: "1", + `example flag --optarg --Int8=`: "1", + `example flag --optarg --Int=`: "1", + `example flag --optarg --IntSlice=`: "1", + `example flag --optarg --IPMask=`: "0", + `example flag --optarg --IP=`: "0", + `example flag --optarg --IPNet=`: "0", + `example flag --optarg --IPSlice=`: "0", + `example flag --optarg --StringArray=`: "1", + `example flag --optarg --String=`: "1", + `example flag --optarg --StringSlice=`: "1", + `example flag --optarg --StringToInt64=`: "a", + `example flag --optarg --StringToInt=`: "a", + `example flag --optarg --StringToString=`: "a", + `example flag --optarg --Uint16=`: "1", + `example flag --optarg --Uint32=`: "1", + `example flag --optarg --Uint64=`: "1", + `example flag --optarg --Uint8=`: "1", + `example flag --optarg --Uint=`: "1", + `example flag --optarg --UintSlice=`: "1", } var testsIntegratedMessage = map[string]string{ diff --git a/internal/common/traverse.go b/internal/common/traverse.go index aef7bd618..9a77825a6 100644 --- a/internal/common/traverse.go +++ b/internal/common/traverse.go @@ -89,6 +89,11 @@ func filterError(args []string, err error) error { return nil } + if re := regexp.MustCompile(`invalid argument ".*" for "(?P.*)" flag:.*`); re.MatchString(msg) && strings.SplitN(current, "=", 2)[0] == re.FindStringSubmatch(msg)[1] { + // ignore invalid argument for flag currently being completed (e.g. empty IntSlice) + return nil + } + if len(args) > 1 { previous := args[len(args)-2] if strings.HasPrefix(previous, "--") && msg == fmt.Sprintf("flag needs an argument: %v", previous) {