diff --git a/predicate.go b/predicate.go index e377429..5b0dcc0 100644 --- a/predicate.go +++ b/predicate.go @@ -13,8 +13,11 @@ type Predicate func(last string) []Matcher // Or unions two predicate functions, so that the result predicate // returns the union of their predication func (p Predicate) Or(other Predicate) Predicate { - if p == nil || other == nil { - return nil + if p == nil { + return other + } + if other == nil { + return p } return func(last string) []Matcher { return append(p.predict(last), other.predict(last)...) } } diff --git a/predicate_test.go b/predicate_test.go new file mode 100644 index 0000000..d376d76 --- /dev/null +++ b/predicate_test.go @@ -0,0 +1,124 @@ +package complete + +import ( + "os" + "sort" + "strings" + "testing" +) + +func TestPredicate(t *testing.T) { + t.Parallel() + + // Change to tests directory for testing completion of files and directories + err := os.Chdir("./tests") + if err != nil { + t.Fatal(err) + } + + tests := []struct { + name string + p Predicate + arg string + want []string + }{ + { + name: "set", + p: PredictSet("a", "b", "c"), + want: []string{"a", "b", "c"}, + }, + { + name: "set/empty", + p: PredictSet(), + want: []string{}, + }, + { + name: "anything", + p: PredictAnything, + want: []string{}, + }, + { + name: "nothing", + p: PredictNothing, + want: []string{}, + }, + { + name: "or: word with nil", + p: PredictSet("a").Or(PredictNothing), + want: []string{"a"}, + }, + { + name: "or: nil with word", + p: PredictNothing.Or(PredictSet("a")), + want: []string{"a"}, + }, + { + name: "or: nil with nil", + p: PredictNothing.Or(PredictNothing), + want: []string{}, + }, + { + name: "or: word with word with word", + p: PredictSet("a").Or(PredictSet("b")).Or(PredictSet("c")), + want: []string{"a", "b", "c"}, + }, + { + name: "files/txt", + p: PredictFiles("*.txt"), + want: []string{"./a.txt", "./b.txt", "./c.txt"}, + }, + { + name: "files/txt", + p: PredictFiles("*.txt"), + arg: "./dir/", + want: []string{}, + }, + { + name: "files/x", + p: PredictFiles("x"), + arg: "./dir/", + want: []string{"./dir/x"}, + }, + { + name: "files/*", + p: PredictFiles("x*"), + arg: "./dir/", + want: []string{"./dir/x"}, + }, + { + name: "files/md", + p: PredictFiles("*.md"), + want: []string{"./readme.md"}, + }, + { + name: "dirs", + p: PredictDirs, + arg: "./dir/", + want: []string{"./dir"}, + }, + { + name: "dirs", + p: PredictDirs, + want: []string{"./", "./dir"}, + }, + } + + for _, tt := range tests { + t.Run(tt.name+"/"+tt.arg, func(t *testing.T) { + matchers := tt.p.predict(tt.arg) + matchersString := []string{} + for _, m := range matchers { + matchersString = append(matchersString, m.String()) + } + sort.Strings(matchersString) + sort.Strings(tt.want) + + got := strings.Join(matchersString, ",") + want := strings.Join(tt.want, ",") + + if got != want { + t.Errorf("failed %s\ngot = %s\nwant: %s", tt.name, got, want) + } + }) + } +} diff --git a/run_test.go b/run_test.go index 4cbf36d..95b48b3 100644 --- a/run_test.go +++ b/run_test.go @@ -12,6 +12,8 @@ func TestCompleter_Complete(t *testing.T) { // Set debug environment variable so logs will be printed if testing.Verbose() { os.Setenv(envDebug, "1") + // refresh the logger with environment variable set + Log = getLogger() } // Change to tests directory for testing completion of files and directories