@@ -5,8 +5,12 @@ import (
55 "errors"
66 "fmt"
77 "io"
8+ "sort"
9+ "strconv"
810 "testing"
911 "time"
12+
13+ "github.com/stretchr/testify/require"
1014)
1115
1216// NOTE: helpers nopCloser, testEmitter, noop and writeCloser are defined in helpers_test.go
@@ -127,6 +131,79 @@ func TestResolving(t *testing.T) {
127131 }
128132}
129133
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+
130207func TestWalking (t * testing.T ) {
131208 cmdA := & Command {
132209 Subcommands : map [string ]* Command {
0 commit comments