add predicate tests

This commit is contained in:
Eyal Posener 2017-05-06 22:48:34 +03:00
parent c20bec01d6
commit 91a264bb40
3 changed files with 131 additions and 2 deletions

View File

@ -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)...) }
}

124
predicate_test.go Normal file
View File

@ -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)
}
})
}
}

View File

@ -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