github.com/linux4life798/complete@v1.1.2-0.20180410072631-7426158f3bcb/predict_test.go (about)

     1  package complete
     2  
     3  import (
     4  	"sort"
     5  	"strings"
     6  	"testing"
     7  )
     8  
     9  func TestPredicate(t *testing.T) {
    10  	t.Parallel()
    11  	initTests()
    12  
    13  	tests := []struct {
    14  		name    string
    15  		p       Predictor
    16  		argList []string
    17  		want    []string
    18  	}{
    19  		{
    20  			name: "set",
    21  			p:    PredictSet("a", "b", "c"),
    22  			want: []string{"a", "b", "c"},
    23  		},
    24  		{
    25  			name: "set/empty",
    26  			p:    PredictSet(),
    27  			want: []string{},
    28  		},
    29  		{
    30  			name: "anything",
    31  			p:    PredictAnything,
    32  			want: []string{},
    33  		},
    34  		{
    35  			name: "or: word with nil",
    36  			p:    PredictOr(PredictSet("a"), nil),
    37  			want: []string{"a"},
    38  		},
    39  		{
    40  			name: "or: nil with word",
    41  			p:    PredictOr(nil, PredictSet("a")),
    42  			want: []string{"a"},
    43  		},
    44  		{
    45  			name: "or: nil with nil",
    46  			p:    PredictOr(PredictNothing, PredictNothing),
    47  			want: []string{},
    48  		},
    49  		{
    50  			name: "or: word with word with word",
    51  			p:    PredictOr(PredictSet("a"), PredictSet("b"), PredictSet("c")),
    52  			want: []string{"a", "b", "c"},
    53  		},
    54  		{
    55  			name: "files/txt",
    56  			p:    PredictFiles("*.txt"),
    57  			want: []string{"./", "dir/", "outer/", "a.txt", "b.txt", "c.txt", ".dot.txt"},
    58  		},
    59  		{
    60  			name:    "files/txt",
    61  			p:       PredictFiles("*.txt"),
    62  			argList: []string{"./dir/"},
    63  			want:    []string{"./dir/"},
    64  		},
    65  		{
    66  			name:    "complete files inside dir if it is the only match",
    67  			p:       PredictFiles("foo"),
    68  			argList: []string{"./dir/", "./d"},
    69  			want:    []string{"./dir/", "./dir/foo"},
    70  		},
    71  		{
    72  			name:    "complete files inside dir when argList includes file name",
    73  			p:       PredictFiles("*"),
    74  			argList: []string{"./dir/f", "./dir/foo"},
    75  			want:    []string{"./dir/foo"},
    76  		},
    77  		{
    78  			name:    "files/md",
    79  			p:       PredictFiles("*.md"),
    80  			argList: []string{""},
    81  			want:    []string{"./", "dir/", "outer/", "readme.md"},
    82  		},
    83  		{
    84  			name:    "files/md with ./ prefix",
    85  			p:       PredictFiles("*.md"),
    86  			argList: []string{".", "./"},
    87  			want:    []string{"./", "./dir/", "./outer/", "./readme.md"},
    88  		},
    89  		{
    90  			name:    "dirs",
    91  			p:       PredictDirs("*"),
    92  			argList: []string{"di", "dir", "dir/"},
    93  			want:    []string{"dir/"},
    94  		},
    95  		{
    96  			name:    "dirs with ./ prefix",
    97  			p:       PredictDirs("*"),
    98  			argList: []string{"./di", "./dir", "./dir/"},
    99  			want:    []string{"./dir/"},
   100  		},
   101  		{
   102  			name:    "predict anything in dir",
   103  			p:       PredictFiles("*"),
   104  			argList: []string{"dir", "dir/", "di"},
   105  			want:    []string{"dir/", "dir/foo", "dir/bar"},
   106  		},
   107  		{
   108  			name:    "predict anything in dir with ./ prefix",
   109  			p:       PredictFiles("*"),
   110  			argList: []string{"./dir", "./dir/", "./di"},
   111  			want:    []string{"./dir/", "./dir/foo", "./dir/bar"},
   112  		},
   113  		{
   114  			name:    "root directories",
   115  			p:       PredictDirs("*"),
   116  			argList: []string{""},
   117  			want:    []string{"./", "dir/", "outer/"},
   118  		},
   119  		{
   120  			name:    "root directories with ./ prefix",
   121  			p:       PredictDirs("*"),
   122  			argList: []string{".", "./"},
   123  			want:    []string{"./", "./dir/", "./outer/"},
   124  		},
   125  		{
   126  			name:    "nested directories",
   127  			p:       PredictDirs("*.md"),
   128  			argList: []string{"ou", "outer", "outer/"},
   129  			want:    []string{"outer/", "outer/inner/"},
   130  		},
   131  		{
   132  			name:    "nested directories with ./ prefix",
   133  			p:       PredictDirs("*.md"),
   134  			argList: []string{"./ou", "./outer", "./outer/"},
   135  			want:    []string{"./outer/", "./outer/inner/"},
   136  		},
   137  		{
   138  			name:    "nested inner directory",
   139  			p:       PredictFiles("*.md"),
   140  			argList: []string{"outer/i"},
   141  			want:    []string{"outer/inner/", "outer/inner/readme.md"},
   142  		},
   143  	}
   144  
   145  	for _, tt := range tests {
   146  
   147  		// no args in argList, means an empty argument
   148  		if len(tt.argList) == 0 {
   149  			tt.argList = append(tt.argList, "")
   150  		}
   151  
   152  		for _, arg := range tt.argList {
   153  			t.Run(tt.name+"/arg="+arg, func(t *testing.T) {
   154  
   155  				matches := tt.p.Predict(newArgs(arg))
   156  
   157  				sort.Strings(matches)
   158  				sort.Strings(tt.want)
   159  
   160  				got := strings.Join(matches, ",")
   161  				want := strings.Join(tt.want, ",")
   162  
   163  				if got != want {
   164  					t.Errorf("failed %s\ngot = %s\nwant: %s", t.Name(), got, want)
   165  				}
   166  			})
   167  		}
   168  	}
   169  }