github.com/mslmio/cli@v0.0.0-20240214075801-cd0f94804899/lib/complete/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 matches := tt.p.Predict(prefix) 120 121 sort.Strings(matches) 122 sort.Strings(tt.want) 123 124 got := strings.Join(matches, ",") 125 want := strings.Join(tt.want, ",") 126 127 if got != want { 128 t.Errorf("failed %s\ngot = %s\nwant: %s", t.Name(), got, want) 129 } 130 }) 131 } 132 } 133 } 134 135 func TestMatchFile(t *testing.T) { 136 // Change to tests directory for testing completion of 137 // files and directories 138 err := os.Chdir("testdata") 139 if err != nil { 140 panic(err) 141 } 142 defer os.Chdir("..") 143 144 type matcherTest struct { 145 prefix string 146 want bool 147 } 148 149 tests := []struct { 150 long string 151 tests []matcherTest 152 }{ 153 { 154 long: "file.txt", 155 tests: []matcherTest{ 156 {prefix: "", want: true}, 157 {prefix: "f", want: true}, 158 {prefix: "./f", want: true}, 159 {prefix: "./.", want: false}, 160 {prefix: "file.", want: true}, 161 {prefix: "./file.", want: true}, 162 {prefix: "file.txt", want: true}, 163 {prefix: "./file.txt", want: true}, 164 {prefix: "other.txt", want: false}, 165 {prefix: "/other.txt", want: false}, 166 {prefix: "/file.txt", want: false}, 167 {prefix: "/fil", want: false}, 168 {prefix: "/file.txt2", want: false}, 169 {prefix: "/.", want: false}, 170 }, 171 }, 172 { 173 long: "./file.txt", 174 tests: []matcherTest{ 175 {prefix: "", want: true}, 176 {prefix: "f", want: true}, 177 {prefix: "./f", want: true}, 178 {prefix: "./.", want: false}, 179 {prefix: "file.", want: true}, 180 {prefix: "./file.", want: true}, 181 {prefix: "file.txt", want: true}, 182 {prefix: "./file.txt", want: true}, 183 {prefix: "other.txt", want: false}, 184 {prefix: "/other.txt", want: false}, 185 {prefix: "/file.txt", want: false}, 186 {prefix: "/fil", want: false}, 187 {prefix: "/file.txt2", want: false}, 188 {prefix: "/.", want: false}, 189 }, 190 }, 191 { 192 long: "/file.txt", 193 tests: []matcherTest{ 194 {prefix: "", want: true}, 195 {prefix: "f", want: false}, 196 {prefix: "./f", want: false}, 197 {prefix: "./.", want: false}, 198 {prefix: "file.", want: false}, 199 {prefix: "./file.", want: false}, 200 {prefix: "file.txt", want: false}, 201 {prefix: "./file.txt", want: false}, 202 {prefix: "other.txt", want: false}, 203 {prefix: "/other.txt", want: false}, 204 {prefix: "/file.txt", want: true}, 205 {prefix: "/fil", want: true}, 206 {prefix: "/file.txt2", want: false}, 207 {prefix: "/.", want: false}, 208 }, 209 }, 210 { 211 long: "./", 212 tests: []matcherTest{ 213 {prefix: "", want: true}, 214 {prefix: ".", want: true}, 215 {prefix: "./", want: true}, 216 {prefix: "./.", want: false}, 217 }, 218 }, 219 } 220 221 for _, tt := range tests { 222 for _, ttt := range tt.tests { 223 name := fmt.Sprintf("long=%q&prefix=%q", tt.long, ttt.prefix) 224 t.Run(name, func(t *testing.T) { 225 got := matchFile(tt.long, ttt.prefix) 226 if got != ttt.want { 227 t.Errorf("Failed %s: got = %t, want: %t", name, got, ttt.want) 228 } 229 }) 230 } 231 } 232 }