github.com/ladydascalie/elvish@v0.0.0-20170703214355-2964dd3ece7f/glob/glob_test.go (about)

     1  package glob
     2  
     3  import (
     4  	"os"
     5  	"reflect"
     6  	"sort"
     7  	"testing"
     8  
     9  	"github.com/elves/elvish/util"
    10  )
    11  
    12  var (
    13  	mkdirs = []string{"a", "b", "c", "d1", "d1/e", "d1/e/f", "d1/e/f/g",
    14  		"d2", "d2/e", "d2/e/f", "d2/e/f/g"}
    15  	mkdirDots = []string{".el"}
    16  	creates   = []string{"a/X", "a/Y", "b/X", "c/Y",
    17  		"dX", "dXY",
    18  		"lorem", "ipsum",
    19  		"d1/e/f/g/X", "d2/e/f/g/X"}
    20  	createDots = []string{".x", ".el/x"}
    21  )
    22  
    23  var globCases = []struct {
    24  	pattern string
    25  	want    []string
    26  }{
    27  	{"*", []string{"a", "b", "c", "d1", "d2", "dX", "dXY", "lorem", "ipsum"}},
    28  	{".", []string{"."}},
    29  	{"./*", []string{"./a", "./b", "./c", "./d1", "./d2", "./dX", "./dXY", "./lorem", "./ipsum"}},
    30  	{"..", []string{".."}},
    31  	{"a/..", []string{"a/.."}},
    32  	{"a/../*", []string{"a/../a", "a/../b", "a/../c", "a/../d1", "a/../d2", "a/../dX", "a/../dXY", "a/../lorem", "a/../ipsum"}},
    33  	{"*/", []string{"a/", "b/", "c/", "d1/", "d2/"}},
    34  	{"**", append(mkdirs, creates...)},
    35  	{"*/X", []string{"a/X", "b/X"}},
    36  	{"**X", []string{"a/X", "b/X", "dX", "d1/e/f/g/X", "d2/e/f/g/X"}},
    37  	{"*/*/*", []string{"d1/e/f", "d2/e/f"}},
    38  	{"l*m", []string{"lorem"}},
    39  	{"d*", []string{"d1", "d2", "dX", "dXY"}},
    40  	{"d*/", []string{"d1/", "d2/"}},
    41  	{"d**", []string{"d1", "d1/e", "d1/e/f", "d1/e/f/g", "d1/e/f/g/X",
    42  		"d2", "d2/e", "d2/e/f", "d2/e/f/g", "d2/e/f/g/X", "dX", "dXY"}},
    43  	{"?", []string{"a", "b", "c"}},
    44  	{"??", []string{"d1", "d2", "dX"}},
    45  
    46  	// Nonexistent paths.
    47  	{"xxxx", []string{}},
    48  	{"xxxx/*", []string{}},
    49  	{"a/*/", []string{}},
    50  
    51  	// Absolute paths.
    52  	// NOTE: If / or /usr changes during testing, this case will fail.
    53  	{"/*", util.FullNames("/")},
    54  	{"/usr/*", util.FullNames("/usr/")},
    55  
    56  	// TODO Test cases against dotfiles.
    57  }
    58  
    59  func TestGlob(t *testing.T) {
    60  	util.InTempDir(func(string) {
    61  		for _, dir := range append(mkdirs, mkdirDots...) {
    62  			err := os.Mkdir(dir, 0755)
    63  			if err != nil {
    64  				panic(err)
    65  			}
    66  		}
    67  		for _, file := range append(creates, createDots...) {
    68  			f, err := os.Create(file)
    69  			if err != nil {
    70  				panic(err)
    71  			}
    72  			f.Close()
    73  		}
    74  		for _, tc := range globCases {
    75  			names := []string{}
    76  			Glob(tc.pattern, func(name string) bool {
    77  				names = append(names, name)
    78  				return true
    79  			})
    80  			sort.Strings(names)
    81  			sort.Strings(tc.want)
    82  			if !reflect.DeepEqual(names, tc.want) {
    83  				t.Errorf(`Glob(%q, "") => %v, want %v`, tc.pattern, names, tc.want)
    84  			}
    85  		}
    86  	})
    87  }