github.com/Arneball/complete@v1.1.2/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 }