github.com/posener/complete/v2@v2.1.0/predict/files_test.go (about) 1 package predict 2 3 import ( 4 "fmt" 5 "os" 6 "sort" 7 "strings" 8 "testing" 9 ) 10 11 func TestFiles(t *testing.T) { 12 err := os.Chdir("testdata") 13 if err != nil { 14 panic(err) 15 } 16 defer os.Chdir("..") 17 18 tests := []struct { 19 name string 20 p FilesPredictor 21 prefixes []string 22 want []string 23 }{ 24 { 25 name: "files/txt", 26 p: Files("*.txt"), 27 prefixes: []string{""}, 28 want: []string{"./", "dir/", "outer/", "a.txt", "b.txt", "c.txt", ".dot.txt"}, 29 }, 30 { 31 name: "files/txt", 32 p: Files("*.txt"), 33 prefixes: []string{"./dir/"}, 34 want: []string{"./dir/"}, 35 }, 36 { 37 name: "complete files inside dir if it is the only match", 38 p: Files("foo"), 39 prefixes: []string{"./dir/", "./d"}, 40 want: []string{"./dir/", "./dir/foo"}, 41 }, 42 { 43 name: "complete files inside dir when argList includes file name", 44 p: Files("*"), 45 prefixes: []string{"./dir/f", "./dir/foo"}, 46 want: []string{"./dir/foo"}, 47 }, 48 { 49 name: "files/md", 50 p: Files("*.md"), 51 prefixes: []string{""}, 52 want: []string{"./", "dir/", "outer/", "readme.md"}, 53 }, 54 { 55 name: "files/md with ./ prefix", 56 p: Files("*.md"), 57 prefixes: []string{".", "./"}, 58 want: []string{"./", "./dir/", "./outer/", "./readme.md"}, 59 }, 60 { 61 name: "dirs", 62 p: Dirs("*"), 63 prefixes: []string{"di", "dir", "dir/"}, 64 want: []string{"dir/"}, 65 }, 66 { 67 name: "dirs with ./ prefix", 68 p: Dirs("*"), 69 prefixes: []string{"./di", "./dir", "./dir/"}, 70 want: []string{"./dir/"}, 71 }, 72 { 73 name: "predict anything in dir", 74 p: Files("*"), 75 prefixes: []string{"dir", "dir/", "di"}, 76 want: []string{"dir/", "dir/foo", "dir/bar"}, 77 }, 78 { 79 name: "predict anything in dir with ./ prefix", 80 p: Files("*"), 81 prefixes: []string{"./dir", "./dir/", "./di"}, 82 want: []string{"./dir/", "./dir/foo", "./dir/bar"}, 83 }, 84 { 85 name: "root directories", 86 p: Dirs("*"), 87 prefixes: []string{""}, 88 want: []string{"./", "dir/", "outer/"}, 89 }, 90 { 91 name: "root directories with ./ prefix", 92 p: Dirs("*"), 93 prefixes: []string{".", "./"}, 94 want: []string{"./", "./dir/", "./outer/"}, 95 }, 96 { 97 name: "nested directories", 98 p: Dirs("*.md"), 99 prefixes: []string{"ou", "outer", "outer/"}, 100 want: []string{"outer/", "outer/inner/"}, 101 }, 102 { 103 name: "nested directories with ./ prefix", 104 p: Dirs("*.md"), 105 prefixes: []string{"./ou", "./outer", "./outer/"}, 106 want: []string{"./outer/", "./outer/inner/"}, 107 }, 108 { 109 name: "nested inner directory", 110 p: Files("*.md"), 111 prefixes: []string{"outer/i"}, 112 want: []string{"outer/inner/", "outer/inner/readme.md"}, 113 }, 114 } 115 116 for _, tt := range tests { 117 for _, prefix := range tt.prefixes { 118 t.Run(tt.name+"/prefix="+prefix, func(t *testing.T) { 119 120 matches := tt.p.Predict(prefix) 121 122 sort.Strings(matches) 123 sort.Strings(tt.want) 124 125 got := strings.Join(matches, ",") 126 want := strings.Join(tt.want, ",") 127 128 if got != want { 129 t.Errorf("failed %s\ngot = %s\nwant: %s", t.Name(), got, want) 130 } 131 }) 132 } 133 } 134 } 135 136 func TestMatchFile(t *testing.T) { 137 // Change to tests directory for testing completion of 138 // files and directories 139 err := os.Chdir("testdata") 140 if err != nil { 141 panic(err) 142 } 143 defer os.Chdir("..") 144 145 type matcherTest struct { 146 prefix string 147 want bool 148 } 149 150 tests := []struct { 151 long string 152 tests []matcherTest 153 }{ 154 { 155 long: "file.txt", 156 tests: []matcherTest{ 157 {prefix: "", want: true}, 158 {prefix: "f", want: true}, 159 {prefix: "./f", want: true}, 160 {prefix: "./.", want: false}, 161 {prefix: "file.", want: true}, 162 {prefix: "./file.", want: true}, 163 {prefix: "file.txt", want: true}, 164 {prefix: "./file.txt", want: true}, 165 {prefix: "other.txt", want: false}, 166 {prefix: "/other.txt", want: false}, 167 {prefix: "/file.txt", want: false}, 168 {prefix: "/fil", want: false}, 169 {prefix: "/file.txt2", want: false}, 170 {prefix: "/.", want: false}, 171 }, 172 }, 173 { 174 long: "./file.txt", 175 tests: []matcherTest{ 176 {prefix: "", want: true}, 177 {prefix: "f", want: true}, 178 {prefix: "./f", want: true}, 179 {prefix: "./.", want: false}, 180 {prefix: "file.", want: true}, 181 {prefix: "./file.", want: true}, 182 {prefix: "file.txt", want: true}, 183 {prefix: "./file.txt", want: true}, 184 {prefix: "other.txt", want: false}, 185 {prefix: "/other.txt", want: false}, 186 {prefix: "/file.txt", want: false}, 187 {prefix: "/fil", want: false}, 188 {prefix: "/file.txt2", want: false}, 189 {prefix: "/.", want: false}, 190 }, 191 }, 192 { 193 long: "/file.txt", 194 tests: []matcherTest{ 195 {prefix: "", want: true}, 196 {prefix: "f", want: false}, 197 {prefix: "./f", want: false}, 198 {prefix: "./.", want: false}, 199 {prefix: "file.", want: false}, 200 {prefix: "./file.", want: false}, 201 {prefix: "file.txt", want: false}, 202 {prefix: "./file.txt", want: false}, 203 {prefix: "other.txt", want: false}, 204 {prefix: "/other.txt", want: false}, 205 {prefix: "/file.txt", want: true}, 206 {prefix: "/fil", want: true}, 207 {prefix: "/file.txt2", want: false}, 208 {prefix: "/.", want: false}, 209 }, 210 }, 211 { 212 long: "./", 213 tests: []matcherTest{ 214 {prefix: "", want: true}, 215 {prefix: ".", want: true}, 216 {prefix: "./", want: true}, 217 {prefix: "./.", want: false}, 218 }, 219 }, 220 } 221 222 for _, tt := range tests { 223 for _, ttt := range tt.tests { 224 name := fmt.Sprintf("long=%q&prefix=%q", tt.long, ttt.prefix) 225 t.Run(name, func(t *testing.T) { 226 got := matchFile(tt.long, ttt.prefix) 227 if got != ttt.want { 228 t.Errorf("Failed %s: got = %t, want: %t", name, got, ttt.want) 229 } 230 }) 231 } 232 } 233 }