2016-11-21 18:56:35 +00:00
|
|
|
package filepathfilter
|
|
|
|
|
|
|
|
import (
|
|
|
|
"testing"
|
|
|
|
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
|
|
)
|
|
|
|
|
2016-11-21 21:57:51 +00:00
|
|
|
func TestPatternMatch(t *testing.T) {
|
2018-02-28 00:38:08 +00:00
|
|
|
for _, wildcard := range []string{`*`, `.`, `./`, `.\`} {
|
2017-11-17 16:23:37 +00:00
|
|
|
assertPatternMatch(t, wildcard,
|
|
|
|
"a",
|
|
|
|
"a/",
|
|
|
|
"a.a",
|
|
|
|
"a/b",
|
|
|
|
"a/b/",
|
|
|
|
"a/b.b",
|
|
|
|
"a/b/c",
|
|
|
|
"a/b/c/",
|
|
|
|
"a/b/c.c",
|
|
|
|
)
|
|
|
|
}
|
|
|
|
|
2017-05-18 14:04:53 +00:00
|
|
|
assertPatternMatch(t, "filename.txt", "filename.txt")
|
|
|
|
assertPatternMatch(t, "*.txt", "filename.txt")
|
|
|
|
refutePatternMatch(t, "*.tx", "filename.txt")
|
|
|
|
assertPatternMatch(t, "f*.txt", "filename.txt")
|
|
|
|
refutePatternMatch(t, "g*.txt", "filename.txt")
|
|
|
|
assertPatternMatch(t, "file*", "filename.txt")
|
|
|
|
refutePatternMatch(t, "file", "filename.txt")
|
2016-11-21 21:57:51 +00:00
|
|
|
|
|
|
|
// With no path separators, should match in subfolders
|
2017-05-18 14:04:53 +00:00
|
|
|
assertPatternMatch(t, "*.txt", "sub/filename.txt")
|
|
|
|
refutePatternMatch(t, "*.tx", "sub/filename.txt")
|
|
|
|
assertPatternMatch(t, "f*.txt", "sub/filename.txt")
|
|
|
|
refutePatternMatch(t, "g*.txt", "sub/filename.txt")
|
|
|
|
assertPatternMatch(t, "file*", "sub/filename.txt")
|
|
|
|
refutePatternMatch(t, "file", "sub/filename.txt")
|
|
|
|
|
|
|
|
// matches only in subdir
|
|
|
|
assertPatternMatch(t, "sub/*.txt", "sub/filename.txt")
|
2017-11-17 16:15:23 +00:00
|
|
|
refutePatternMatch(t, "sub/*.txt",
|
|
|
|
"top/sub/filename.txt",
|
|
|
|
"sub/filename.dat",
|
|
|
|
"other/filename.txt",
|
|
|
|
)
|
2017-05-18 14:04:53 +00:00
|
|
|
|
2016-11-21 21:57:51 +00:00
|
|
|
// Needs wildcard for exact filename
|
2017-05-18 14:04:53 +00:00
|
|
|
assertPatternMatch(t, "**/filename.txt", "sub/sub/sub/filename.txt")
|
2016-11-21 21:57:51 +00:00
|
|
|
|
|
|
|
// Should not match dots to subparts
|
2017-05-18 14:04:53 +00:00
|
|
|
refutePatternMatch(t, "*.ign", "sub/shouldignoreme.txt")
|
2016-11-21 21:57:51 +00:00
|
|
|
|
|
|
|
// Path specific
|
2017-11-17 16:15:23 +00:00
|
|
|
assertPatternMatch(t, "sub",
|
|
|
|
"sub/",
|
|
|
|
"sub",
|
|
|
|
"sub/filename.txt",
|
|
|
|
"top/sub/",
|
|
|
|
"top/sub",
|
|
|
|
"top/sub/filename.txt",
|
|
|
|
)
|
|
|
|
|
|
|
|
assertPatternMatch(t, "sub/", "sub/filename.txt", "top/sub/filename.txt")
|
|
|
|
assertPatternMatch(t, "/sub", "sub/", "sub", "sub/filename.txt")
|
2017-05-18 17:27:04 +00:00
|
|
|
assertPatternMatch(t, "/sub/", "sub/filename.txt")
|
2017-11-17 16:15:23 +00:00
|
|
|
refutePatternMatch(t, "/sub", "subfilename.txt", "top/sub/", "top/sub", "top/sub/filename.txt")
|
2017-05-18 14:04:53 +00:00
|
|
|
refutePatternMatch(t, "sub", "subfilename.txt")
|
|
|
|
refutePatternMatch(t, "sub/", "subfilename.txt")
|
2017-11-17 16:15:23 +00:00
|
|
|
refutePatternMatch(t, "/sub/", "subfilename.txt", "top/sub/filename.txt")
|
2017-05-18 14:04:53 +00:00
|
|
|
|
|
|
|
// nested path
|
2017-11-17 16:15:23 +00:00
|
|
|
assertPatternMatch(t, "top/sub",
|
|
|
|
"top/sub/filename.txt",
|
|
|
|
"top/sub/",
|
|
|
|
"top/sub",
|
|
|
|
"root/top/sub/filename.txt",
|
|
|
|
"root/top/sub/",
|
|
|
|
"root/top/sub",
|
|
|
|
)
|
2017-05-18 14:04:53 +00:00
|
|
|
assertPatternMatch(t, "top/sub/", "top/sub/filename.txt")
|
|
|
|
assertPatternMatch(t, "top/sub/", "root/top/sub/filename.txt")
|
2017-11-17 16:15:23 +00:00
|
|
|
|
|
|
|
assertPatternMatch(t, "/top/sub", "top/sub/", "top/sub", "top/sub/filename.txt")
|
2017-05-18 17:27:04 +00:00
|
|
|
assertPatternMatch(t, "/top/sub/", "top/sub/filename.txt")
|
2017-11-17 16:15:23 +00:00
|
|
|
|
2017-05-18 17:27:04 +00:00
|
|
|
refutePatternMatch(t, "top/sub", "top/subfilename.txt")
|
|
|
|
refutePatternMatch(t, "top/sub/", "top/subfilename.txt")
|
2017-11-17 16:15:23 +00:00
|
|
|
refutePatternMatch(t, "/top/sub",
|
|
|
|
"top/subfilename.txt",
|
|
|
|
"root/top/sub/filename.txt",
|
|
|
|
"root/top/sub/",
|
|
|
|
"root/top/sub",
|
|
|
|
)
|
|
|
|
|
|
|
|
refutePatternMatch(t, "/top/sub/",
|
|
|
|
"root/top/sub/filename.txt",
|
|
|
|
"top/subfilename.txt",
|
|
|
|
)
|
2016-11-21 21:57:51 +00:00
|
|
|
|
|
|
|
// Absolute
|
2017-05-18 14:04:53 +00:00
|
|
|
assertPatternMatch(t, "*.dat", "/path/to/sub/.git/test.dat")
|
|
|
|
assertPatternMatch(t, "**/.git", "/path/to/sub/.git")
|
2016-11-21 21:57:51 +00:00
|
|
|
|
|
|
|
// Match anything
|
2017-05-18 14:04:53 +00:00
|
|
|
assertPatternMatch(t, ".", "path.txt")
|
|
|
|
assertPatternMatch(t, "./", "path.txt")
|
|
|
|
assertPatternMatch(t, ".\\", "path.txt")
|
|
|
|
}
|
|
|
|
|
2017-11-17 16:15:23 +00:00
|
|
|
func assertPatternMatch(t *testing.T, pattern string, filenames ...string) {
|
|
|
|
p := NewPattern(pattern)
|
2018-02-14 23:45:07 +00:00
|
|
|
for _, filename := range filenames {
|
2017-11-17 16:15:23 +00:00
|
|
|
assert.True(t, p.Match(filename), "%q should match pattern %q", filename, pattern)
|
|
|
|
}
|
2016-11-21 21:57:51 +00:00
|
|
|
}
|
|
|
|
|
2017-11-17 16:15:23 +00:00
|
|
|
func refutePatternMatch(t *testing.T, pattern string, filenames ...string) {
|
|
|
|
p := NewPattern(pattern)
|
2018-02-14 23:45:07 +00:00
|
|
|
for _, filename := range filenames {
|
2017-11-17 16:15:23 +00:00
|
|
|
assert.False(t, p.Match(filename), "%q should not match pattern %q", filename, pattern)
|
|
|
|
}
|
2016-11-21 21:57:51 +00:00
|
|
|
}
|
|
|
|
|
2016-11-21 18:56:35 +00:00
|
|
|
type filterTest struct {
|
2017-06-20 23:34:44 +00:00
|
|
|
expectedResult bool
|
|
|
|
expectedPattern string
|
|
|
|
includes []string
|
|
|
|
excludes []string
|
2016-11-21 18:56:35 +00:00
|
|
|
}
|
|
|
|
|
2017-06-23 18:05:46 +00:00
|
|
|
func TestFilterReportsIncludePatterns(t *testing.T) {
|
|
|
|
filter := New([]string{"*.foo", "*.bar"}, nil)
|
|
|
|
|
|
|
|
assert.Equal(t, []string{"*.foo", "*.bar"}, filter.Include())
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestFilterReportsExcludePatterns(t *testing.T) {
|
|
|
|
filter := New(nil, []string{"*.baz", "*.quux"})
|
|
|
|
|
|
|
|
assert.Equal(t, []string{"*.baz", "*.quux"}, filter.Exclude())
|
|
|
|
}
|