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  }