internal/control/flags_test.go
49 lines · 1724 bytes
2 symbols in this file
1package control
2
3import (
4 "strings"
5 "testing"
6)
7
8func TestParseFlags(t *testing.T) {
9 spec := flagSpec{Values: []string{"--title", "--file"}, Multi: []string{"--add"}, Bools: []string{"--private"}, MaxPos: 1, Usage: "cmd <owner/name> [--title <t>]"}
10 f, err := parseFlags([]string{"a/b", "--title", "-x", "--add", "one", "--private", "--add", "two", "--file", "-"}, spec)
11 if err != nil {
12 t.Fatal(err)
13 }
14 if f.pos(0) != "a/b" || f.Value("--title") != "-x" || f.Value("--file") != "-" || !f.Has("--private") ||
15 strings.Join(f.List("--add"), ",") != "one,two" || f.Has("--nope") || f.pos(1) != "" {
16 t.Fatalf("parsed wrong: %+v", f)
17 }
18 for _, bad := range [][]string{
19 {"a/b", "--bogus"}, // unknown flag
20 {"a/b", "--title"}, // missing value
21 {"a/b", "c/d"}, // too many positionals
22 {"--private", "a/b", "x"}, // too many, flags first
23 } {
24 if _, err := parseFlags(bad, spec); err == nil || !strings.Contains(err.Error(), "usage: cmd") {
25 t.Errorf("%v: err=%v", bad, err)
26 }
27 }
28 // "--" ends flags; MaxPos -1 takes any number.
29 f, err = parseFlags([]string{"--", "--title", "x"}, flagSpec{Values: []string{"--title"}, MaxPos: -1})
30 if err != nil || strings.Join(f.Pos, " ") != "--title x" || f.Has("--title") {
31 t.Fatalf("-- handling: %v %+v", err, f)
32 }
33}
34
35func TestNearestFlag(t *testing.T) {
36 known := map[string]byte{"--state": 'v', "--label": 'm', "--limit": 'v', "--json": 'b'}
37 cases := map[string]string{
38 "--stat": "--state",
39 "--lable": "--label",
40 "--l": "",
41 "--jsno": "--json",
42 "--nothing": "",
43 }
44 for in, want := range cases {
45 if got := nearestFlag(in, known); got != want {
46 t.Errorf("nearestFlag(%q) = %q, want %q", in, got, want)
47 }
48 }
49}