github.com/divan/complete@v0.0.0-20170515130636-337e95201af7/complete_test.go (about) 1 package complete 2 3 import ( 4 "os" 5 "sort" 6 "testing" 7 ) 8 9 func TestCompleter_Complete(t *testing.T) { 10 t.Parallel() 11 initTests() 12 13 c := Command{ 14 Sub: map[string]Command{ 15 "sub1": { 16 Flags: map[string]Predictor{ 17 "-flag1": PredictAnything, 18 "-flag2": PredictNothing, 19 }, 20 }, 21 "sub2": { 22 Flags: map[string]Predictor{ 23 "-flag2": PredictNothing, 24 "-flag3": PredictSet("opt1", "opt2", "opt12"), 25 }, 26 Args: PredictFiles("*.md"), 27 }, 28 }, 29 Flags: map[string]Predictor{ 30 "-h": PredictNothing, 31 "-global1": PredictAnything, 32 "-o": PredictFiles("*.txt"), 33 }, 34 } 35 36 allGlobals := []string{} 37 for sub := range c.Sub { 38 allGlobals = append(allGlobals, sub) 39 } 40 for flag := range c.Flags { 41 allGlobals = append(allGlobals, flag) 42 } 43 44 testTXTFiles := []string{"./a.txt", "./b.txt", "./c.txt", "./.dot.txt"} 45 46 tests := []struct { 47 args string 48 want []string 49 }{ 50 { 51 args: "", 52 want: allGlobals, 53 }, 54 { 55 args: "-", 56 want: []string{"-h", "-global1", "-o"}, 57 }, 58 { 59 args: "-h ", 60 want: allGlobals, 61 }, 62 { 63 args: "-global1 ", // global1 is known follow flag 64 want: []string{}, 65 }, 66 { 67 args: "sub", 68 want: []string{"sub1", "sub2"}, 69 }, 70 { 71 args: "sub1", 72 want: []string{"sub1"}, 73 }, 74 { 75 args: "sub2", 76 want: []string{"sub2"}, 77 }, 78 { 79 args: "sub1 ", 80 want: []string{"-flag1", "-flag2", "-h", "-global1", "-o"}, 81 }, 82 { 83 args: "sub2 ", 84 want: []string{"./", "./dir/", "./outer/", "./readme.md", "-flag2", "-flag3", "-h", "-global1", "-o"}, 85 }, 86 { 87 args: "sub2 ./", 88 want: []string{"./", "./readme.md", "./dir/", "./outer/"}, 89 }, 90 { 91 args: "sub2 re", 92 want: []string{"./readme.md"}, 93 }, 94 { 95 args: "sub2 -flag2 ", 96 want: []string{"./", "./dir/", "./outer/", "./readme.md", "-flag2", "-flag3", "-h", "-global1", "-o"}, 97 }, 98 { 99 args: "sub1 -fl", 100 want: []string{"-flag1", "-flag2"}, 101 }, 102 { 103 args: "sub1 -flag1", 104 want: []string{"-flag1"}, 105 }, 106 { 107 args: "sub1 -flag1 ", 108 want: []string{}, // flag1 is unknown follow flag 109 }, 110 { 111 args: "sub1 -flag2 ", 112 want: []string{"-flag1", "-flag2", "-h", "-global1", "-o"}, 113 }, 114 { 115 args: "-no-such-flag", 116 want: []string{}, 117 }, 118 { 119 args: "-no-such-flag ", 120 want: allGlobals, 121 }, 122 { 123 args: "no-such-command", 124 want: []string{}, 125 }, 126 { 127 args: "no-such-command ", 128 want: allGlobals, 129 }, 130 { 131 args: "-o ", 132 want: append(testTXTFiles, "./", "./dir/", "./outer/"), 133 }, 134 { 135 args: "-o ./no-su", 136 want: []string{}, 137 }, 138 { 139 args: "-o ./", 140 want: append(testTXTFiles, "./", "./dir/", "./outer/"), 141 }, 142 { 143 args: "-o ./read", 144 want: []string{}, 145 }, 146 { 147 args: "-o ./readme.md", 148 want: []string{}, 149 }, 150 { 151 args: "-o ./readme.md ", 152 want: allGlobals, 153 }, 154 { 155 args: "-o sub2 -flag3 ", 156 want: []string{"opt1", "opt2", "opt12"}, 157 }, 158 { 159 args: "-o sub2 -flag3 opt1", 160 want: []string{"opt1", "opt12"}, 161 }, 162 { 163 args: "-o sub2 -flag3 opt", 164 want: []string{"opt1", "opt2", "opt12"}, 165 }, 166 } 167 168 for _, tt := range tests { 169 t.Run(tt.args, func(t *testing.T) { 170 171 tt.args = "cmd " + tt.args 172 os.Setenv(envComplete, tt.args) 173 line, _ := getLine() 174 175 got := c.Predict(newArgs(line)) 176 177 sort.Strings(tt.want) 178 sort.Strings(got) 179 180 if !equalSlices(got, tt.want) { 181 t.Errorf("failed '%s'\ngot = %s\nwant: %s", t.Name(), got, tt.want) 182 } 183 }) 184 } 185 } 186 187 func equalSlices(a, b []string) bool { 188 if len(a) != len(b) { 189 return false 190 } 191 for i := range a { 192 if a[i] != b[i] { 193 return false 194 } 195 } 196 return true 197 }