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  }