@@ -5,8 +5,12 @@ import (
5
5
"errors"
6
6
"fmt"
7
7
"io"
8
+ "sort"
9
+ "strconv"
8
10
"testing"
9
11
"time"
12
+
13
+ "github.com/stretchr/testify/require"
10
14
)
11
15
12
16
// NOTE: helpers nopCloser, testEmitter, noop and writeCloser are defined in helpers_test.go
@@ -127,6 +131,79 @@ func TestResolving(t *testing.T) {
127
131
}
128
132
}
129
133
134
+ func fullCmdTree (numberOfSubs int , depth int ) * Command {
135
+ cmd := & Command {}
136
+ cmd .Subcommands = make (map [string ]* Command )
137
+ for i := 0 ; i < numberOfSubs ; i ++ {
138
+ var sub * Command
139
+ if depth == 0 {
140
+ sub = & Command {}
141
+ } else {
142
+ sub = fullCmdTree (numberOfSubs , depth - 1 )
143
+ }
144
+ cmd .Subcommands [strconv .FormatInt (int64 (i ), 10 )] = sub
145
+ }
146
+ return cmd
147
+ }
148
+
149
+ func listAllCmds (cmd * Command , prefix string ) []string {
150
+ if cmd .Subcommands == nil || len (cmd .Subcommands ) == 0 {
151
+ if prefix == "" {
152
+ return []string {}
153
+ }
154
+ return []string {prefix }
155
+ }
156
+
157
+ subStr := make ([]string , 0 )
158
+ for k , s := range cmd .Subcommands {
159
+ newPrefix := k
160
+ if prefix != "" {
161
+ newPrefix = prefix + "/" + newPrefix
162
+ }
163
+ subStr = append (subStr , listAllCmds (s , newPrefix )... )
164
+ }
165
+ sort .Strings (subStr )
166
+ return subStr
167
+ }
168
+
169
+ func TestFilterSubCommands (t * testing.T ) {
170
+ cmd := fullCmdTree (2 , 2 )
171
+ all := []string {
172
+ "0/0/0" ,
173
+ "0/0/1" ,
174
+ "0/1/0" ,
175
+ "0/1/1" ,
176
+ "1/0/0" ,
177
+ "1/0/1" ,
178
+ "1/1/0" ,
179
+ "1/1/1" }
180
+ require .Equal (t , all , listAllCmds (cmd , "" ))
181
+
182
+ checkFilter := func (filter []string , expected []string ) {
183
+ filtered , err := cmd .FilterSubcommands (filter )
184
+ require .NoError (t , err )
185
+ require .Equal (t , expected , listAllCmds (& Command {Subcommands : filtered }, "" ))
186
+ }
187
+
188
+ checkFilter (nil , []string {})
189
+ checkFilter (all , all )
190
+ checkFilter ([]string {"0/0/0" }, []string {"0/0/0" })
191
+ checkFilter ([]string {"0/0" }, []string { // implicit subcommands
192
+ "0/0/0" ,
193
+ "0/0/1" })
194
+ checkFilter ([]string {"0" }, []string { // even more implicit subcommands
195
+ "0/0/0" ,
196
+ "0/0/1" ,
197
+ "0/1/0" ,
198
+ "0/1/1" })
199
+ checkFilter ([]string {"1" , "1/1" }, []string { // redundant second filter
200
+ "1/0/0" ,
201
+ "1/0/1" ,
202
+ "1/1/0" ,
203
+ "1/1/1" })
204
+ checkFilter ([]string {"0/0/0" , "1/1/1" }, []string {"0/0/0" , "1/1/1" }) // independent
205
+ }
206
+
130
207
func TestWalking (t * testing.T ) {
131
208
cmdA := & Command {
132
209
Subcommands : map [string ]* Command {
0 commit comments