github.com/ryicoh/gitignore@v0.0.0-20220510063239-92217ecbc0c1/gitignore_test.go (about) 1 package gitignore 2 3 import ( 4 "github.com/stretchr/testify/assert" 5 "io/fs" 6 "os" 7 "path/filepath" 8 "sort" 9 "strings" 10 "testing" 11 ) 12 13 func giFromStr(root string, s string) (*Gitignore, error) { 14 builder, err := NewGitignoreBuilder(root) 15 if err != nil { 16 return nil, err 17 } 18 if err := builder.AddString(nil, s); err != nil { 19 return nil, err 20 } 21 return builder.Build() 22 } 23 24 const ROOT = "/home/foobar/rust/rg" 25 26 func TestIgnored(t *testing.T) { 27 testCases := []struct { 28 desc string 29 root string 30 gi string 31 path string 32 isDir bool 33 expected bool 34 }{ 35 {"ig1", ROOT, "months", "months", false, true}, 36 {"ig2", ROOT, "*.lock", "Cargo.lock", false, true}, 37 {"ig3", ROOT, "*.rs", "src/main.rs", false, true}, 38 {"ig4", ROOT, "src/*.rs", "src/main.rs", false, true}, 39 {"ig5", ROOT, "/*.c", "cat-file.c", false, true}, 40 {"ig6", ROOT, "/src/*.rs", "src/main.rs", false, true}, 41 {"ig7", ROOT, "!src/main.rs\n*.rs", "src/main.rs", false, true}, 42 {"ig8", ROOT, "foo/", "foo", true, true}, 43 {"ig9", ROOT, "**/foo", "foo", false, true}, 44 {"ig10", ROOT, "**/foo", "src/foo", false, true}, 45 {"ig11", ROOT, "**/foo/**", "src/foo/bar", false, true}, 46 {"ig12", ROOT, "**/foo/**", "wat/src/foo/bar/baz", false, true}, 47 {"ig13", ROOT, "**/foo/bar", "foo/bar", false, true}, 48 {"ig14", ROOT, "**/foo/bar", "src/foo/bar", false, true}, 49 {"ig15", ROOT, "abc/**", "abc/x", false, true}, 50 {"ig16", ROOT, "abc/**", "abc/x/y", false, true}, 51 {"ig17", ROOT, "abc/**", "abc/x/y/z", false, true}, 52 {"ig18", ROOT, "a/**/b", "a/b", false, true}, 53 {"ig19", ROOT, "a/**/b", "a/x/b", false, true}, 54 {"ig20", ROOT, "a/**/b", "a/x/y/b", false, true}, 55 {"ig21", ROOT, "\\!xy", "!xy", false, true}, 56 {"ig22", ROOT, "\\#foo", "#foo", false, true}, 57 {"ig23", ROOT, "foo", "./foo", false, true}, 58 {"ig24", ROOT, "target", "grep/target", false, true}, 59 {"ig25", ROOT, "Cargo.lock", "./tabwriter-bin/Cargo.lock", false, true}, 60 {"ig26", ROOT, "/foo/bar/baz", "./foo/bar/baz", false, true}, 61 {"ig27", ROOT, "foo/", "xyz/foo", true, true}, 62 {"ig28", "./src", "/llvm/", "./src/llvm", true, true}, 63 {"ig29", ROOT, "node_modules/ ", "node_modules", true, true}, 64 {"ig30", ROOT, "**/", "foo/bar", true, true}, 65 {"ig31", ROOT, "path1/*", "path1/foo", false, true}, 66 {"ig32", ROOT, ".a/b", ".a/b", false, true}, 67 {"ig33", "./", ".a/b", ".a/b", false, true}, 68 {"ig34", ".", ".a/b", ".a/b", false, true}, 69 {"ig35", "./.", ".a/b", ".a/b", false, true}, 70 {"ig36", "././", ".a/b", ".a/b", false, true}, 71 {"ig37", "././.", ".a/b", ".a/b", false, true}, 72 {"ig38", ROOT, "\\[", "[", false, true}, 73 {"ig39", ROOT, "\\?", "?", false, true}, 74 {"ig40", ROOT, "\\*", "*", false, true}, 75 {"ig41", ROOT, "\\a", "a", false, true}, 76 {"ig42", ROOT, "s*.rs", "sfoo.rs", false, true}, 77 {"ig43", ROOT, "**", "foo.rs", false, true}, 78 {"ig44", ROOT, "**/**/*", "a/foo.rs", false, true}, 79 {"ignot1", ROOT, "amonths", "months", false, false}, 80 {"ignot2", ROOT, "monthsa", "months", false, false}, 81 {"ignot3", ROOT, "/src/*.rs", "src/grep/src/main.rs", false, false}, 82 {"ignot4", ROOT, "/*.c", "mozilla-sha1/sha1.c", false, false}, 83 {"ignot5", ROOT, "/src/*.rs", "src/grep/src/main.rs", false, false}, 84 {"ignot6", ROOT, "*.rs\n!src/main.rs", "src/main.rs", false, false}, 85 {"ignot7", ROOT, "foo/", "foo", false, false}, 86 {"ignot8", ROOT, "**/foo/**", "wat/src/afoo/bar/baz", false, false}, 87 {"ignot9", ROOT, "**/foo/**", "wat/src/fooa/bar/baz", false, false}, 88 {"ignot10", ROOT, "**/foo/bar", "foo/src/bar", false, false}, 89 {"ignot11", ROOT, "#foo", "#foo", false, false}, 90 {"ignot12", ROOT, "\n\n\n", "foo", false, false}, 91 {"ignot13", ROOT, "foo/**", "foo", true, false}, 92 {"ignot14", "./third_party/protobuf", "m4/ltoptions.m4", "./third_party/protobuf/csharp/src/packages/repositories.config", false, false}, 93 {"ignot15", ROOT, "!/bar", "foo/bar", false, false}, 94 {"ignot16", ROOT, "*\n!**/", "foo", true, false}, 95 {"ignot17", ROOT, "src/*.rs", "src/grep/src/main.rs", false, false}, 96 {"ignot18", ROOT, "path1/*", "path2/path1/foo", false, false}, 97 {"ignot19", ROOT, "s*.rs", "src/foo.rs", false, false}, 98 } 99 100 for _, tC := range testCases { 101 t.Run(tC.desc, func(t *testing.T) { 102 gi, err := giFromStr(tC.root, tC.gi) 103 if err != nil { 104 t.Fatal(err) 105 } 106 actual := gi.Ignored(tC.path, tC.isDir) 107 if actual != tC.expected { 108 t.Fatalf("%s: root(%s), gi(%s), path(%s) actual(%v), expect(%v)\n", 109 tC.desc, tC.root, tC.gi, tC.path, actual, tC.expected) 110 } 111 }) 112 } 113 } 114 115 func TestIgnoredRails(t *testing.T) { 116 testIgnoredRepo(t, "testdata/railsapp", "../railsapp_ignored.txt") 117 } 118 119 func TestIgnoredReact(t *testing.T) { 120 testIgnoredRepo(t, "testdata/reactapp", "../reactapp_ignored.txt") 121 } 122 123 func TestIgnoredRepo1(t *testing.T) { 124 testIgnoredRepo(t, "testdata/repo1", "../repo1_ignored.txt") 125 } 126 127 func testIgnoredRepo(t *testing.T, dir, expectedFile string) { 128 undo := move(t, dir) 129 defer undo() 130 131 gitignore, err := NewGitignoreFromDir(".") 132 if err != nil { 133 t.Fatal(err) 134 } 135 136 ignoredFiles := make([]string, 0) 137 err = filepath.WalkDir(".", func(path string, d fs.DirEntry, err error) error { 138 if err != nil { 139 return err 140 } 141 if d.IsDir() { 142 return err 143 } 144 145 if gitignore.Ignored(path, d.IsDir()) { 146 ignoredFiles = append(ignoredFiles, path) 147 } 148 149 return nil 150 }) 151 152 if err != nil { 153 t.Fatal(err) 154 } 155 156 bytes, err := os.ReadFile(expectedFile) 157 if err != nil { 158 t.Fatal(err) 159 } 160 161 var expects []string 162 for _, str := range strings.Split(string(bytes), "\n") { 163 if str != "" { 164 expects = append(expects, str) 165 } 166 } 167 sort.Strings(ignoredFiles) 168 sort.Strings(expects) 169 170 assert.Equal(t, expects, ignoredFiles) 171 } 172 173 func move(t *testing.T, dir string) func() { 174 wd, err := os.Getwd() 175 if err != nil { 176 t.Fatal(err) 177 } 178 if err := os.Chdir(dir); err != nil { 179 t.Fatal(err) 180 } 181 return func() { 182 if err := os.Chdir(wd); err != nil { 183 t.Fatal(err) 184 } 185 } 186 }