| // Copyright 2020 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| package fs_test |
| |
| import ( |
| . "io/fs" |
| "os" |
| "path" |
| "testing" |
| ) |
| |
| var globTests = []struct { |
| fs FS |
| pattern, result string |
| }{ |
| {os.DirFS("."), "glob.go", "glob.go"}, |
| {os.DirFS("."), "gl?b.go", "glob.go"}, |
| {os.DirFS("."), `gl\ob.go`, "glob.go"}, |
| {os.DirFS("."), "*", "glob.go"}, |
| // This test fails on gofrontend because the directory structure |
| // is different. |
| // {os.DirFS(".."), "*/glob.go", "fs/glob.go"}, |
| } |
| |
| func TestGlob(t *testing.T) { |
| for _, tt := range globTests { |
| matches, err := Glob(tt.fs, tt.pattern) |
| if err != nil { |
| t.Errorf("Glob error for %q: %s", tt.pattern, err) |
| continue |
| } |
| if !contains(matches, tt.result) { |
| t.Errorf("Glob(%#q) = %#v want %v", tt.pattern, matches, tt.result) |
| } |
| } |
| for _, pattern := range []string{"no_match", "../*/no_match", `\*`} { |
| matches, err := Glob(os.DirFS("."), pattern) |
| if err != nil { |
| t.Errorf("Glob error for %q: %s", pattern, err) |
| continue |
| } |
| if len(matches) != 0 { |
| t.Errorf("Glob(%#q) = %#v want []", pattern, matches) |
| } |
| } |
| } |
| |
| func TestGlobError(t *testing.T) { |
| bad := []string{`[]`, `nonexist/[]`} |
| for _, pattern := range bad { |
| _, err := Glob(os.DirFS("."), pattern) |
| if err != path.ErrBadPattern { |
| t.Errorf("Glob(fs, %#q) returned err=%v, want path.ErrBadPattern", pattern, err) |
| } |
| } |
| } |
| |
| // contains reports whether vector contains the string s. |
| func contains(vector []string, s string) bool { |
| for _, elem := range vector { |
| if elem == s { |
| return true |
| } |
| } |
| return false |
| } |
| |
| type globOnly struct{ GlobFS } |
| |
| func (globOnly) Open(name string) (File, error) { return nil, ErrNotExist } |
| |
| func TestGlobMethod(t *testing.T) { |
| check := func(desc string, names []string, err error) { |
| t.Helper() |
| if err != nil || len(names) != 1 || names[0] != "hello.txt" { |
| t.Errorf("Glob(%s) = %v, %v, want %v, nil", desc, names, err, []string{"hello.txt"}) |
| } |
| } |
| |
| // Test that ReadDir uses the method when present. |
| names, err := Glob(globOnly{testFsys}, "*.txt") |
| check("readDirOnly", names, err) |
| |
| // Test that ReadDir uses Open when the method is not present. |
| names, err = Glob(openOnly{testFsys}, "*.txt") |
| check("openOnly", names, err) |
| } |