github.com/xyproto/u-root@v6.0.1-0.20200302025726-5528e0c77a3c+incompatible/cmds/core/elvish/glob/glob_test.go (about)

     1  package glob
     2  
     3  import (
     4  	"os"
     5  	"reflect"
     6  	"runtime"
     7  	"sort"
     8  	"testing"
     9  
    10  	"github.com/u-root/u-root/cmds/core/elvish/util"
    11  )
    12  
    13  var (
    14  	mkdirs = []string{"a", "b", "c", "d1", "d1/e", "d1/e/f", "d1/e/f/g",
    15  		"d2", "d2/e", "d2/e/f", "d2/e/f/g"}
    16  	mkdirDots = []string{".el"}
    17  	creates   = []string{"a/X", "a/Y", "b/X", "c/Y",
    18  		"dX", "dXY",
    19  		"lorem", "ipsum",
    20  		"d1/e/f/g/X", "d2/e/f/g/X"}
    21  	createDots = []string{".x", ".el/x"}
    22  )
    23  
    24  type globCase struct {
    25  	pattern string
    26  	want    []string
    27  }
    28  
    29  var globCases = []globCase{
    30  	{"*", []string{"a", "b", "c", "d1", "d2", "dX", "dXY", "lorem", "ipsum"}},
    31  	{".", []string{"."}},
    32  	{"./*", []string{"./a", "./b", "./c", "./d1", "./d2", "./dX", "./dXY", "./lorem", "./ipsum"}},
    33  	{"..", []string{".."}},
    34  	{"a/..", []string{"a/.."}},
    35  	{"a/../*", []string{"a/../a", "a/../b", "a/../c", "a/../d1", "a/../d2", "a/../dX", "a/../dXY", "a/../lorem", "a/../ipsum"}},
    36  	{"*/", []string{"a/", "b/", "c/", "d1/", "d2/"}},
    37  	{"**", append(mkdirs, creates...)},
    38  	{"*/X", []string{"a/X", "b/X"}},
    39  	{"**X", []string{"a/X", "b/X", "dX", "d1/e/f/g/X", "d2/e/f/g/X"}},
    40  	{"*/*/*", []string{"d1/e/f", "d2/e/f"}},
    41  	{"l*m", []string{"lorem"}},
    42  	{"d*", []string{"d1", "d2", "dX", "dXY"}},
    43  	{"d*/", []string{"d1/", "d2/"}},
    44  	{"d**", []string{"d1", "d1/e", "d1/e/f", "d1/e/f/g", "d1/e/f/g/X",
    45  		"d2", "d2/e", "d2/e/f", "d2/e/f/g", "d2/e/f/g/X", "dX", "dXY"}},
    46  	{"?", []string{"a", "b", "c"}},
    47  	{"??", []string{"d1", "d2", "dX"}},
    48  
    49  	// Nonexistent paths.
    50  	{"xxxx", []string{}},
    51  	{"xxxx/*", []string{}},
    52  	{"a/*/", []string{}},
    53  
    54  	// TODO Test cases against dotfiles.
    55  }
    56  
    57  func init() {
    58  	// Add tests for absolute paths. This is platform-dependent and may break if
    59  	// the directories used change during testing.
    60  	var dirs []string
    61  	if runtime.GOOS == "windows" {
    62  		dirs = []string{`C:/`, `C:/Windows/`}
    63  	} else {
    64  		dirs = []string{"/", "/usr/"}
    65  	}
    66  	for _, dir := range dirs {
    67  		globCases = append(globCases, globCase{dir + "*", util.FullNames(dir)})
    68  	}
    69  }
    70  
    71  func TestGlob(t *testing.T) {
    72  	util.InTempDir(func(string) {
    73  		for _, dir := range append(mkdirs, mkdirDots...) {
    74  			err := os.Mkdir(dir, 0755)
    75  			if err != nil {
    76  				panic(err)
    77  			}
    78  		}
    79  		for _, file := range append(creates, createDots...) {
    80  			f, err := os.Create(file)
    81  			if err != nil {
    82  				panic(err)
    83  			}
    84  			f.Close()
    85  		}
    86  		for _, tc := range globCases {
    87  			names := []string{}
    88  			Glob(tc.pattern, func(name string) bool {
    89  				names = append(names, name)
    90  				return true
    91  			})
    92  			sort.Strings(names)
    93  			sort.Strings(tc.want)
    94  			if !reflect.DeepEqual(names, tc.want) {
    95  				t.Errorf(`Glob(%q, "") => %v, want %v`, tc.pattern, names, tc.want)
    96  			}
    97  		}
    98  	})
    99  }