gitlab.com/thomasboni/go-enry/v2@v2.8.3-0.20220418031202-30b0d7a3de98/utils_test.go (about) 1 package enry 2 3 import ( 4 "bytes" 5 "fmt" 6 "io/ioutil" 7 "path/filepath" 8 "testing" 9 10 "github.com/stretchr/testify/assert" 11 "github.com/stretchr/testify/require" 12 ) 13 14 func TestIsVendor(t *testing.T) { 15 tests := []struct { 16 path string 17 expected bool 18 }{ 19 {"cache/", true}, 20 {"random/cache/", true}, 21 {"cache", false}, 22 {"dependencies/", true}, 23 {"Dependencies/", true}, 24 {"dependency/", false}, 25 {"dist/", true}, 26 {"dist", false}, 27 {"random/dist/", true}, 28 {"random/dist", false}, 29 {"deps/", true}, 30 {"configure", true}, 31 {"a/configure", true}, 32 {"config.guess", true}, 33 {"config.guess/", false}, 34 {".vscode/", true}, 35 {"doc/_build/", true}, 36 {"a/docs/_build/", true}, 37 {"a/dasdocs/_build-vsdoc.js", true}, 38 {"a/dasdocs/_build-vsdoc.j", false}, 39 {"foo/bar", false}, 40 {".sublime-project", true}, 41 {"foo/vendor/foo", true}, 42 {"leaflet.draw-src.js", true}, 43 {"foo/bar/MochiKit.js", true}, 44 {"foo/bar/dojo.js", true}, 45 {"foo/env/whatever", true}, 46 {"foo/.imageset/bar", true}, 47 {"Vagrantfile", true}, 48 } 49 for _, tt := range tests { 50 t.Run(tt.path, func(t *testing.T) { 51 if got := IsVendor(tt.path); got != tt.expected { 52 t.Errorf("IsVendor() = %v, expected %v", got, tt.expected) 53 } 54 }) 55 } 56 } 57 58 func BenchmarkIsVendor(b *testing.B) { 59 for i := 0; i < b.N; i++ { 60 IsVendor(".vscode/") 61 IsVendor("cache/") 62 IsVendor("foo/bar") 63 IsVendor("foo/bar/MochiKit.js") 64 } 65 } 66 67 func TestIsDocumentation(t *testing.T) { 68 tests := []struct { 69 name string 70 path string 71 expected bool 72 }{ 73 {name: "TestIsDocumentation_1", path: "foo", expected: false}, 74 {name: "TestIsDocumentation_2", path: "README", expected: true}, 75 } 76 77 for _, test := range tests { 78 is := IsDocumentation(test.path) 79 assert.Equal(t, is, test.expected, fmt.Sprintf("%v: is = %v, expected: %v", test.name, is, test.expected)) 80 } 81 } 82 83 func TestIsImage(t *testing.T) { 84 tests := []struct { 85 name string 86 path string 87 expected bool 88 }{ 89 {name: "TestIsImage_1", path: "invalid.txt", expected: false}, 90 {name: "TestIsImage_2", path: "image.png", expected: true}, 91 {name: "TestIsImage_3", path: "image.jpg", expected: true}, 92 {name: "TestIsImage_4", path: "image.jpeg", expected: true}, 93 {name: "TestIsImage_5", path: "image.gif", expected: true}, 94 } 95 96 for _, test := range tests { 97 is := IsImage(test.path) 98 assert.Equal(t, is, test.expected, fmt.Sprintf("%v: is = %v, expected: %v", test.name, is, test.expected)) 99 } 100 } 101 102 func TestGetMimeType(t *testing.T) { 103 tests := []struct { 104 name string 105 path string 106 lang string 107 expected string 108 }{ 109 {name: "TestGetMimeType_1", path: "text.txt", lang: "", expected: "text/plain"}, 110 {name: "TestGetMimeType_2", path: "file.go", lang: "Go", expected: "text/x-go"}, 111 {name: "TestGetMimeType_3", path: "image.png", lang: "", expected: "image/png"}, 112 } 113 114 for _, test := range tests { 115 is := GetMIMEType(test.path, test.lang) 116 assert.Equal(t, is, test.expected, fmt.Sprintf("%v: is = %v, expected: %v", test.name, is, test.expected)) 117 } 118 } 119 120 func TestIsConfiguration(t *testing.T) { 121 tests := []struct { 122 name string 123 path string 124 expected bool 125 }{ 126 {name: "TestIsConfiguration_1", path: "foo", expected: false}, 127 {name: "TestIsConfiguration_2", path: "foo.ini", expected: true}, 128 {name: "TestIsConfiguration_3", path: "/test/path/foo.json", expected: true}, 129 } 130 131 for _, test := range tests { 132 is := IsConfiguration(test.path) 133 assert.Equal(t, is, test.expected, fmt.Sprintf("%v: is = %v, expected: %v", test.name, is, test.expected)) 134 } 135 } 136 137 func TestIsBinary(t *testing.T) { 138 tests := []struct { 139 name string 140 data []byte 141 expected bool 142 }{ 143 {name: "TestIsBinary_1", data: []byte("foo"), expected: false}, 144 {name: "TestIsBinary_2", data: []byte{0}, expected: true}, 145 {name: "TestIsBinary_3", data: bytes.Repeat([]byte{'o'}, 8000), expected: false}, 146 } 147 148 for _, test := range tests { 149 is := IsBinary(test.data) 150 assert.Equal(t, is, test.expected, fmt.Sprintf("%v: is = %v, expected: %v", test.name, is, test.expected)) 151 } 152 } 153 154 func TestIsDotFile(t *testing.T) { 155 tests := []struct { 156 name string 157 path string 158 expected bool 159 }{ 160 {name: "TestIsDotFile_1", path: "foo/bar/./", expected: false}, 161 {name: "TestIsDotFile_2", path: "./", expected: false}, 162 } 163 164 for _, test := range tests { 165 is := IsDotFile(test.path) 166 assert.Equal(t, test.expected, is, fmt.Sprintf("%v: is = %v, expected: %v", test.name, is, test.expected)) 167 } 168 } 169 func TestIsTestFile(t *testing.T) { 170 tests := []struct { 171 name string 172 path string 173 expected bool 174 }{ 175 {name: "TestPHP_Is", path: "tests/FooTest.php", expected: true}, 176 {name: "TestPHP_Not", path: "foo/FooTest.php", expected: false}, 177 {name: "TestJava_Is_1", path: "test/FooTest.java", expected: true}, 178 {name: "TestJava_Is_2", path: "test/FooTests.java", expected: true}, 179 {name: "TestJava_Is_3", path: "test/TestFoo.java", expected: true}, 180 {name: "TestJava_Is_4", path: "test/qux/TestFoo.java", expected: true}, 181 {name: "TestJava_Not", path: "foo/FooTest.java", expected: false}, 182 {name: "TestScala_Is_1", path: "test/FooTest.scala", expected: true}, 183 {name: "TestScala_Is_2", path: "test/FooTests.scala", expected: true}, 184 {name: "TestScala_Is_3", path: "test/FooSpec.scala", expected: true}, 185 {name: "TestScala_Is_4", path: "test/qux/FooSpecs.scala", expected: true}, 186 {name: "TestScala_Not", path: "foo/FooTest.scala", expected: false}, 187 {name: "TestPython_Is", path: "test_foo.py", expected: true}, 188 {name: "TestPython_Not", path: "foo_test.py", expected: false}, 189 {name: "TestGo_Is", path: "foo_test.go", expected: true}, 190 {name: "TestGo_Not", path: "test_foo.go", expected: false}, 191 {name: "TestRuby_Is_1", path: "foo_test.rb", expected: true}, 192 {name: "TestRuby_Is_1", path: "foo_spec.rb", expected: true}, 193 {name: "TestRuby_Not", path: "foo_specs.rb", expected: false}, 194 {name: "TestCSharp_Is_1", path: "FooTest.cs", expected: true}, 195 {name: "TestCSharp_Is_2", path: "foo/FooTests.cs", expected: true}, 196 {name: "TestCSharp_Not", path: "foo/TestFoo.cs", expected: false}, 197 {name: "TestJavaScript_Is_1", path: "foo.test.js", expected: true}, 198 {name: "TestJavaScript_Is_2", path: "foo.spec.js", expected: true}, 199 {name: "TestJavaScript_Not", path: "footest.js", expected: false}, 200 {name: "TestTypeScript_Is_1", path: "foo.test.ts", expected: true}, 201 {name: "TestTypeScript_Is_2", path: "foo.spec.ts", expected: true}, 202 {name: "TestTypeScript_Not", path: "footest.ts", expected: false}, 203 } 204 205 for _, test := range tests { 206 is := IsTest(test.path) 207 assert.Equal(t, test.expected, is, fmt.Sprintf("%v: is = %v, expected: %v", test.name, is, test.expected)) 208 } 209 } 210 211 func TestGetColor(t *testing.T) { 212 tests := []struct { 213 name string 214 language string 215 expected string 216 }{ 217 {name: "TestGetColor_1", language: "Go", expected: "#00ADD8"}, 218 {name: "TestGetColor_2", language: "SomeRandom", expected: "#cccccc"}, 219 {name: "TestGetColor_3", language: "HTML", expected: "#e34c26"}, 220 {name: "TestGetColor_4", language: "HTML+PHP", expected: "#4f5d95"}, 221 } 222 223 for _, test := range tests { 224 color := GetColor(test.language) 225 assert.Equal(t, test.expected, color, fmt.Sprintf("%v: is = %v, expected: %v", test.name, color, test.expected)) 226 } 227 } 228 229 func TestIsGenerated(t *testing.T) { 230 testCases := []struct { 231 file string 232 load bool 233 generated bool 234 }{ 235 // Xcode project files 236 {"Binary/MainMenu.nib", false, true}, 237 {"Dummy/foo.xcworkspacedata", false, true}, 238 {"Dummy/foo.xcuserstate", false, true}, 239 240 //Cocoapods 241 {"Pods/Pods.xcodeproj", false, true}, 242 {"Pods/SwiftDependency/foo.swift", false, true}, 243 {"Pods/ObjCDependency/foo.h", false, true}, 244 {"Pods/ObjCDependency/foo.m", false, true}, 245 {"Dummy/Pods/Pods.xcodeproj", false, true}, 246 {"Dummy/Pods/SwiftDependency/foo.swift", false, true}, 247 {"Dummy/Pods/ObjCDependency/foo.h", false, true}, 248 {"Dummy/Pods/ObjCDependency/foo.m", false, true}, 249 250 //Carthage 251 {"Carthage/Build/.Dependency.version", false, true}, 252 {"Carthage/Build/iOS/Dependency.framework", false, true}, 253 {"Carthage/Build/Mac/Dependency.framework", false, true}, 254 {"src/Carthage/Build/.Dependency.version", false, true}, 255 {"src/Carthage/Build/iOS/Dependency.framework", false, true}, 256 {"src/Carthage/Build/Mac/Dependency.framework", false, true}, 257 258 //Go-specific vendored paths 259 {"go/vendor/github.com/foo.go", false, true}, 260 {"go/vendor/golang.org/src/foo.c", false, true}, 261 {"go/vendor/gopkg.in/some/nested/path/foo.go", false, true}, 262 263 //.NET designer file 264 {"Dummy/foo.designer.cs", false, true}, 265 {"Dummy/foo.Designer.cs", false, true}, 266 {"Dummy/foo.designer.vb", false, true}, 267 {"Dummy/foo.Designer.vb", false, true}, 268 269 //Composer generated composer.lock file 270 {"JSON/composer.lock", false, true}, 271 272 //Node modules 273 {"Dummy/node_modules/foo.js", false, true}, 274 275 //npm shrinkwrap file 276 {"Dummy/npm-shrinkwrap.json", false, true}, 277 {"Dummy/package-lock.json", false, true}, 278 {"JavaScript/jquery-1.6.1.min.js", true, true}, 279 280 //Yarn Plug'n'Play file 281 {".pnp.js", false, true}, 282 {".pnp.cjs", false, true}, 283 {".pnp.mjs", false, true}, 284 285 //Godep saved dependencies 286 {"Godeps/Godeps.json", false, true}, 287 {"Godeps/_workspace/src/github.com/kr/s3/sign.go", false, true}, 288 289 //Generated by Zephir 290 {"C/exception.zep.c", false, true}, 291 {"C/exception.zep.h", false, true}, 292 {"PHP/exception.zep.php", false, true}, 293 294 //Minified files 295 {"JavaScript/jquery-1.6.1.min.js", true, true}, 296 297 //JavaScript with source-maps 298 {"JavaScript/namespace.js", true, true}, 299 {"Generated/inline.js", true, true}, 300 301 //CSS with source-maps 302 {"Generated/linked.css", true, true}, 303 {"Generated/inline.css", true, true}, 304 305 //Source-map 306 {"Data/bootstrap.css.map", true, true}, 307 {"Generated/linked.css.map", true, true}, 308 {"Data/sourcemap.v3.map", true, true}, 309 {"Data/sourcemap.v1.map", true, true}, 310 311 //Specflow 312 {"Features/BindingCulture.feature.cs", false, true}, 313 314 //JFlex 315 {"Java/JFlexLexer.java", true, true}, 316 317 //GrammarKit 318 {"Java/GrammarKit.java", true, true}, 319 320 //roxygen2 321 {"R/import.Rd", true, true}, 322 323 //PostScript 324 {"PostScript/lambda.pfa", true, true}, 325 326 //Perl ppport.h 327 {"Generated/ppport.h", true, true}, 328 329 //Graphql Relay 330 {"Javascript/__generated__/App_user.graphql.js", false, true}, 331 332 //Game Maker Studio 2 333 {"JSON/GMS2_Project.yyp", true, true}, 334 {"JSON/2ea73365-b6f1-4bd1-a454-d57a67e50684.yy", true, true}, 335 {"Generated/options_main.inherited.yy", true, true}, 336 337 //Pipenv 338 {"Dummy/Pipfile.lock", false, true}, 339 340 //HTML 341 {"HTML/attr-swapped.html", true, true}, 342 {"HTML/extra-attr.html", true, true}, 343 {"HTML/extra-spaces.html", true, true}, 344 {"HTML/extra-tags.html", true, true}, 345 {"HTML/grohtml.html", true, true}, 346 {"HTML/grohtml.xhtml", true, true}, 347 {"HTML/makeinfo.html", true, true}, 348 {"HTML/mandoc.html", true, true}, 349 {"HTML/node78.html", true, true}, 350 {"HTML/org-mode.html", true, true}, 351 {"HTML/quotes-double.html", true, true}, 352 {"HTML/quotes-none.html", true, true}, 353 {"HTML/quotes-single.html", true, true}, 354 {"HTML/uppercase.html", true, true}, 355 {"HTML/ronn.html", true, true}, 356 {"HTML/unknown.html", true, false}, 357 {"HTML/no-content.html", true, false}, 358 {"HTML/pages.html", true, true}, 359 360 //GIMP 361 {"C/image.c", true, true}, 362 {"C/image.h", true, true}, 363 364 //Haxe 365 {"Generated/Haxe/main.js", true, true}, 366 {"Generated/Haxe/main.py", true, true}, 367 {"Generated/Haxe/main.lua", true, true}, 368 {"Generated/Haxe/Main.cpp", true, true}, 369 {"Generated/Haxe/Main.h", true, true}, 370 {"Generated/Haxe/Main.java", true, true}, 371 {"Generated/Haxe/Main.cs", true, true}, 372 {"Generated/Haxe/Main.php", true, true}, 373 374 //Poetry lock file 375 {"Dummy/poetry.lock", false, true}, 376 } 377 378 for _, tt := range testCases { 379 t.Run(tt.file, func(t *testing.T) { 380 var content []byte 381 if tt.load { 382 var err error 383 content, err = ioutil.ReadFile(filepath.Join("_testdata", tt.file)) 384 require.NoError(t, err) 385 } 386 387 result := IsGenerated(tt.file, content) 388 require.Equal(t, tt.generated, result) 389 }) 390 } 391 } 392 393 func TestFoo(t *testing.T) { 394 file := "HTML/uppercase.html" 395 content, err := ioutil.ReadFile("_testdata/" + file) 396 require.NoError(t, err) 397 require.True(t, IsGenerated(file, content)) 398 }