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}