github.com/git-lfs/git-lfs@v2.5.2+incompatible/filepathfilter/filepathfilter_test.go (about)

     1  package filepathfilter
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/stretchr/testify/assert"
     7  )
     8  
     9  func TestPatternMatch(t *testing.T) {
    10  	for _, wildcard := range []string{`*`, `.`, `./`, `.\`} {
    11  		assertPatternMatch(t, wildcard,
    12  			"a",
    13  			"a/",
    14  			"a.a",
    15  			"a/b",
    16  			"a/b/",
    17  			"a/b.b",
    18  			"a/b/c",
    19  			"a/b/c/",
    20  			"a/b/c.c",
    21  		)
    22  	}
    23  
    24  	assertPatternMatch(t, "filename.txt", "filename.txt")
    25  	assertPatternMatch(t, "*.txt", "filename.txt")
    26  	refutePatternMatch(t, "*.tx", "filename.txt")
    27  	assertPatternMatch(t, "f*.txt", "filename.txt")
    28  	refutePatternMatch(t, "g*.txt", "filename.txt")
    29  	assertPatternMatch(t, "file*", "filename.txt")
    30  	refutePatternMatch(t, "file", "filename.txt")
    31  
    32  	// With no path separators, should match in subfolders
    33  	assertPatternMatch(t, "*.txt", "sub/filename.txt")
    34  	refutePatternMatch(t, "*.tx", "sub/filename.txt")
    35  	assertPatternMatch(t, "f*.txt", "sub/filename.txt")
    36  	refutePatternMatch(t, "g*.txt", "sub/filename.txt")
    37  	assertPatternMatch(t, "file*", "sub/filename.txt")
    38  	refutePatternMatch(t, "file", "sub/filename.txt")
    39  
    40  	// matches only in subdir
    41  	assertPatternMatch(t, "sub/*.txt", "sub/filename.txt")
    42  	refutePatternMatch(t, "sub/*.txt",
    43  		"top/sub/filename.txt",
    44  		"sub/filename.dat",
    45  		"other/filename.txt",
    46  	)
    47  
    48  	// Needs wildcard for exact filename
    49  	assertPatternMatch(t, "**/filename.txt", "sub/sub/sub/filename.txt")
    50  
    51  	// Should not match dots to subparts
    52  	refutePatternMatch(t, "*.ign", "sub/shouldignoreme.txt")
    53  
    54  	// Path specific
    55  	assertPatternMatch(t, "sub",
    56  		"sub/",
    57  		"sub",
    58  		"sub/filename.txt",
    59  		"top/sub/",
    60  		"top/sub",
    61  		"top/sub/filename.txt",
    62  	)
    63  
    64  	assertPatternMatch(t, "sub/", "sub/filename.txt", "top/sub/filename.txt")
    65  	assertPatternMatch(t, "/sub", "sub/", "sub", "sub/filename.txt")
    66  	assertPatternMatch(t, "/sub/", "sub/filename.txt")
    67  	refutePatternMatch(t, "/sub", "subfilename.txt", "top/sub/", "top/sub", "top/sub/filename.txt")
    68  	refutePatternMatch(t, "sub", "subfilename.txt")
    69  	refutePatternMatch(t, "sub/", "subfilename.txt")
    70  	refutePatternMatch(t, "/sub/", "subfilename.txt", "top/sub/filename.txt")
    71  
    72  	// nested path
    73  	assertPatternMatch(t, "top/sub",
    74  		"top/sub/filename.txt",
    75  		"top/sub/",
    76  		"top/sub",
    77  		"root/top/sub/filename.txt",
    78  		"root/top/sub/",
    79  		"root/top/sub",
    80  	)
    81  	assertPatternMatch(t, "top/sub/", "top/sub/filename.txt")
    82  	assertPatternMatch(t, "top/sub/", "root/top/sub/filename.txt")
    83  
    84  	assertPatternMatch(t, "/top/sub", "top/sub/", "top/sub", "top/sub/filename.txt")
    85  	assertPatternMatch(t, "/top/sub/", "top/sub/filename.txt")
    86  
    87  	refutePatternMatch(t, "top/sub", "top/subfilename.txt")
    88  	refutePatternMatch(t, "top/sub/", "top/subfilename.txt")
    89  	refutePatternMatch(t, "/top/sub",
    90  		"top/subfilename.txt",
    91  		"root/top/sub/filename.txt",
    92  		"root/top/sub/",
    93  		"root/top/sub",
    94  	)
    95  
    96  	refutePatternMatch(t, "/top/sub/",
    97  		"root/top/sub/filename.txt",
    98  		"top/subfilename.txt",
    99  	)
   100  
   101  	// Absolute
   102  	assertPatternMatch(t, "*.dat", "/path/to/sub/.git/test.dat")
   103  	assertPatternMatch(t, "**/.git", "/path/to/sub/.git")
   104  
   105  	// Match anything
   106  	assertPatternMatch(t, ".", "path.txt")
   107  	assertPatternMatch(t, "./", "path.txt")
   108  	assertPatternMatch(t, ".\\", "path.txt")
   109  }
   110  
   111  func assertPatternMatch(t *testing.T, pattern string, filenames ...string) {
   112  	p := NewPattern(pattern)
   113  	for _, filename := range filenames {
   114  		assert.True(t, p.Match(filename), "%q should match pattern %q", filename, pattern)
   115  	}
   116  }
   117  
   118  func refutePatternMatch(t *testing.T, pattern string, filenames ...string) {
   119  	p := NewPattern(pattern)
   120  	for _, filename := range filenames {
   121  		assert.False(t, p.Match(filename), "%q should not match pattern %q", filename, pattern)
   122  	}
   123  }
   124  
   125  type filterTest struct {
   126  	expectedResult  bool
   127  	expectedPattern string
   128  	includes        []string
   129  	excludes        []string
   130  }
   131  
   132  func TestFilterReportsIncludePatterns(t *testing.T) {
   133  	filter := New([]string{"*.foo", "*.bar"}, nil)
   134  
   135  	assert.Equal(t, []string{"*.foo", "*.bar"}, filter.Include())
   136  }
   137  
   138  func TestFilterReportsExcludePatterns(t *testing.T) {
   139  	filter := New(nil, []string{"*.baz", "*.quux"})
   140  
   141  	assert.Equal(t, []string{"*.baz", "*.quux"}, filter.Exclude())
   142  }