diff options
| author | Eyal Posener <[email protected]> | 2017-05-06 08:24:17 +0300 |
|---|---|---|
| committer | Eyal Posener <[email protected]> | 2017-05-06 09:27:51 +0300 |
| commit | d33bac720bcaf13a5ee9f6f165293183d2e3e24d (patch) | |
| tree | f65d42c434e6b67f53431c0c33c30d0c66774abd /run_test.go | |
| parent | 5dbf53eec0f066e97f443d1d85e1ba9ee288f1b5 (diff) | |
Remove Complete struct
Diffstat (limited to 'run_test.go')
| -rw-r--r-- | run_test.go | 204 |
1 files changed, 204 insertions, 0 deletions
diff --git a/run_test.go b/run_test.go new file mode 100644 index 0000000..8f47431 --- /dev/null +++ b/run_test.go @@ -0,0 +1,204 @@ +package complete + +import ( + "os" + "sort" + "testing" +) + +func TestCompleter_Complete(t *testing.T) { + t.Parallel() + + if testing.Verbose() { + os.Setenv(envDebug, "1") + } + + c := Command{ + Sub: map[string]Command{ + "sub1": { + Flags: map[string]Predicate{ + "-flag1": PredictAnything, + "-flag2": PredictNothing, + }, + }, + "sub2": { + Flags: map[string]Predicate{ + "-flag2": PredictNothing, + "-flag3": PredictSet("opt1", "opt2", "opt12"), + }, + Args: PredictDirs("./tests/").Or(PredictFiles("./tests/*.md")), + }, + }, + Flags: map[string]Predicate{ + "-h": PredictNothing, + "-global1": PredictAnything, + "-o": PredictFiles("./tests/*.txt"), + }, + } + + allGlobals := []string{} + for sub := range c.Sub { + allGlobals = append(allGlobals, sub) + } + for flag := range c.Flags { + allGlobals = append(allGlobals, flag) + } + + testTXTFiles := []string{"./tests/a.txt", "./tests/b.txt", "./tests/c.txt"} + + tests := []struct { + args string + want []string + }{ + { + args: "", + want: allGlobals, + }, + { + args: "-", + want: []string{"-h", "-global1", "-o"}, + }, + { + args: "-h ", + want: allGlobals, + }, + { + args: "-global1 ", // global1 is known follow flag + want: []string{}, + }, + { + args: "sub", + want: []string{"sub1", "sub2"}, + }, + { + args: "sub1", + want: []string{"sub1"}, + }, + { + args: "sub2", + want: []string{"sub2"}, + }, + { + args: "sub1 ", + want: []string{"-flag1", "-flag2", "-h", "-global1", "-o"}, + }, + { + args: "sub2 ", + want: []string{"./tests", "-flag2", "-flag3", "-h", "-global1", "-o"}, + }, + { + args: "sub2 tests", + want: []string{"./tests", "./tests/readme.md", "./tests/dir"}, + }, + { + args: "sub2 tests/re", + want: []string{"./tests/readme.md"}, + }, + { + args: "sub2 -flag2 ", + want: []string{"./tests", "-flag2", "-flag3", "-h", "-global1", "-o"}, + }, + { + args: "sub1 -fl", + want: []string{"-flag1", "-flag2"}, + }, + { + args: "sub1 -flag1", + want: []string{"-flag1"}, + }, + { + args: "sub1 -flag1 ", + want: []string{}, // flag1 is unknown follow flag + }, + { + args: "sub1 -flag2 ", + want: []string{"-flag1", "-flag2", "-h", "-global1", "-o"}, + }, + { + args: "-no-such-flag", + want: []string{}, + }, + { + args: "-no-such-flag ", + want: allGlobals, + }, + { + args: "no-such-command", + want: []string{}, + }, + { + args: "no-such-command ", + want: allGlobals, + }, + { + args: "-o ", + want: []string{}, + }, + { + args: "-o ./tes", + want: []string{}, + }, + { + args: "-o tests/", + want: testTXTFiles, + }, + { + args: "-o tests", + want: testTXTFiles, + }, + { + args: "-o ./compl", + want: []string{}, + }, + { + args: "-o ./complete.go", + want: []string{}, + }, + { + args: "-o ./complete.go ", + want: allGlobals, + }, + { + args: "-o sub2 -flag3 ", + want: []string{"opt1", "opt2", "opt12"}, + }, + { + args: "-o sub2 -flag3 opt1", + want: []string{"opt1", "opt12"}, + }, + { + args: "-o sub2 -flag3 opt", + want: []string{"opt1", "opt2", "opt12"}, + }, + } + + for _, tt := range tests { + t.Run(tt.args, func(t *testing.T) { + + tt.args = "cmd " + tt.args + os.Setenv(envComplete, tt.args) + args := getLine() + + got := complete(c, args) + + sort.Strings(tt.want) + sort.Strings(got) + + if !equalSlices(got, tt.want) { + t.Errorf("failed '%s'\ngot = %s\nwant: %s", t.Name(), got, tt.want) + } + }) + } +} + +func equalSlices(a, b []string) bool { + if len(a) != len(b) { + return false + } + for i := range a { + if a[i] != b[i] { + return false + } + } + return true +} |
