test(glob): cover double-star, character class and normalization cases
- commit
- 6122611dc3bbfe3aabbcd161b9e240fcec1920aa
- author
- brice · · 2026-10-08 05:44 UTC
- parent
- e785caa
- signature
- GPG Verified
CD88F9E564E0102646FB6077A1A07C7C7C3E349D· arch-gpg Verified for the committer email
1 file · +40 -3
M internal/glob/glob_test.go +40 -3
| @@ -10,15 +10,52 @@ func TestMatch(t *testing.T) { | |||
| 10 | 10 | }{ | |
| 11 | 11 | {"internal/domain/**", "internal/domain/user.go", true}, | |
| 12 | 12 | {"internal/domain/**", "internal/domain/entity/user.go", true}, | |
| 13 | + | {"internal/domain/**", "internal/domain", true}, | |
| 13 | 14 | {"cmd/**", "cmd/hexcheck/main.go", true}, | |
| 14 | 15 | {"cmd/**", "internal/cmd/main.go", false}, | |
| 15 | 16 | {"internal/*/port/**", "internal/application/port/user.go", true}, | |
| 16 | 17 | {"internal/*/port/**", "internal/application/usecase/user.go", false}, | |
| 17 | 18 | {"internal/foo_test.go", "internal/foo_test.go", true}, | |
| 19 | + | {"**/mocks/**", "mocks/m.go", true}, | |
| 20 | + | {"**/mocks/**", "internal/a/b/mocks/m.go", true}, | |
| 21 | + | {"**/mocks/**", "internal/mocksy/m.go", false}, | |
| 22 | + | {"internal/**/repo.go", "internal/repo.go", true}, | |
| 23 | + | {"internal/**/repo.go", "internal/a/b/repo.go", true}, | |
| 24 | + | {"internal/**/repo.go", "internal/a/b/other.go", false}, | |
| 25 | + | {"**/*_gen.go", "a/b/x_gen.go", true}, | |
| 26 | + | {"internal/[ab]*/**", "internal/adapters/x.go", true}, | |
| 27 | + | {"internal/[ab]*/**", "internal/core/x.go", false}, | |
| 28 | + | {"internal/[/**", "internal/x.go", false}, | |
| 29 | + | {"./internal/**/", "internal/x.go", true}, | |
| 30 | + | {`internal\domain\**`, `internal\domain\user.go`, true}, | |
| 31 | + | {"", "", true}, | |
| 32 | + | {"", "x", false}, | |
| 33 | + | {"internal", "internal/x.go", false}, | |
| 18 | 34 | } | |
| 19 | 35 | for _, tt := range tests { | |
| 20 | - | if got := Match(tt.pattern, tt.name); got != tt.want { | |
| 21 | - | t.Fatalf("Match(%q, %q) = %v, want %v", tt.pattern, tt.name, got, tt.want) | |
| 22 | - | } | |
| 36 | + | t.Run(tt.pattern+"|"+tt.name, func(t *testing.T) { | |
| 37 | + | if got := Match(tt.pattern, tt.name); got != tt.want { | |
| 38 | + | t.Fatalf("Match(%q, %q) = %v, want %v", tt.pattern, tt.name, got, tt.want) | |
| 39 | + | } | |
| 40 | + | }) | |
| 41 | + | } | |
| 42 | + | } | |
| 43 | + | ||
| 44 | + | func TestSpecificity(t *testing.T) { | |
| 45 | + | tests := []struct { | |
| 46 | + | pattern string | |
| 47 | + | want int | |
| 48 | + | }{ | |
| 49 | + | {"internal/domain/**", len("internal/domain/")}, | |
| 50 | + | {"internal/domain/user.go", len("internal/domain/user.go")}, | |
| 51 | + | {"**/mocks/**", 0}, | |
| 52 | + | {"./cmd/[ab]", len("cmd/")}, | |
| 53 | + | } | |
| 54 | + | for _, tt := range tests { | |
| 55 | + | t.Run(tt.pattern, func(t *testing.T) { | |
| 56 | + | if got := Specificity(tt.pattern); got != tt.want { | |
| 57 | + | t.Fatalf("Specificity(%q) = %d, want %d", tt.pattern, got, tt.want) | |
| 58 | + | } | |
| 59 | + | }) | |
| 23 | 60 | } | |
| 24 | 61 | } | |
| @@ -10,15 +10,52 @@ func TestMatch(t *testing.T) { | |||||
| 10 | }{ | 10 | }{ | ||
| 11 | {"internal/domain/**", "internal/domain/user.go", true}, | 11 | {"internal/domain/**", "internal/domain/user.go", true}, | ||
| 12 | {"internal/domain/**", "internal/domain/entity/user.go", true}, | 12 | {"internal/domain/**", "internal/domain/entity/user.go", true}, | ||
| 13 | + | {"internal/domain/**", "internal/domain", true}, | |||
| 13 | {"cmd/**", "cmd/hexcheck/main.go", true}, | 14 | {"cmd/**", "cmd/hexcheck/main.go", true}, | ||
| 14 | {"cmd/**", "internal/cmd/main.go", false}, | 15 | {"cmd/**", "internal/cmd/main.go", false}, | ||
| 15 | {"internal/*/port/**", "internal/application/port/user.go", true}, | 16 | {"internal/*/port/**", "internal/application/port/user.go", true}, | ||
| 16 | {"internal/*/port/**", "internal/application/usecase/user.go", false}, | 17 | {"internal/*/port/**", "internal/application/usecase/user.go", false}, | ||
| 17 | {"internal/foo_test.go", "internal/foo_test.go", true}, | 18 | {"internal/foo_test.go", "internal/foo_test.go", true}, | ||
| 19 | + | {"**/mocks/**", "mocks/m.go", true}, | |||
| 20 | + | {"**/mocks/**", "internal/a/b/mocks/m.go", true}, | |||
| 21 | + | {"**/mocks/**", "internal/mocksy/m.go", false}, | |||
| 22 | + | {"internal/**/repo.go", "internal/repo.go", true}, | |||
| 23 | + | {"internal/**/repo.go", "internal/a/b/repo.go", true}, | |||
| 24 | + | {"internal/**/repo.go", "internal/a/b/other.go", false}, | |||
| 25 | + | {"**/*_gen.go", "a/b/x_gen.go", true}, | |||
| 26 | + | {"internal/[ab]*/**", "internal/adapters/x.go", true}, | |||
| 27 | + | {"internal/[ab]*/**", "internal/core/x.go", false}, | |||
| 28 | + | {"internal/[/**", "internal/x.go", false}, | |||
| 29 | + | {"./internal/**/", "internal/x.go", true}, | |||
| 30 | + | {`internal\domain\**`, `internal\domain\user.go`, true}, | |||
| 31 | + | {"", "", true}, | |||
| 32 | + | {"", "x", false}, | |||
| 33 | + | {"internal", "internal/x.go", false}, | |||
| 18 | } | 34 | } | ||
| 19 | for _, tt := range tests { | 35 | for _, tt := range tests { | ||
| 20 | - | if got := Match(tt.pattern, tt.name); got != tt.want { | 36 | + | t.Run(tt.pattern+"|"+tt.name, func(t *testing.T) { |
| 21 | - | t.Fatalf("Match(%q, %q) = %v, want %v", tt.pattern, tt.name, got, tt.want) | 37 | + | if got := Match(tt.pattern, tt.name); got != tt.want { |
| 22 | - | } | 38 | + | t.Fatalf("Match(%q, %q) = %v, want %v", tt.pattern, tt.name, got, tt.want) |
| 39 | + | } | |||
| 40 | + | }) | |||
| 41 | + | } | |||
| 42 | + | } | |||
| 43 | + | ||||
| 44 | + | func TestSpecificity(t *testing.T) { | |||
| 45 | + | tests := []struct { | |||
| 46 | + | pattern string | |||
| 47 | + | want int | |||
| 48 | + | }{ | |||
| 49 | + | {"internal/domain/**", len("internal/domain/")}, | |||
| 50 | + | {"internal/domain/user.go", len("internal/domain/user.go")}, | |||
| 51 | + | {"**/mocks/**", 0}, | |||
| 52 | + | {"./cmd/[ab]", len("cmd/")}, | |||
| 53 | + | } | |||
| 54 | + | for _, tt := range tests { | |||
| 55 | + | t.Run(tt.pattern, func(t *testing.T) { | |||
| 56 | + | if got := Specificity(tt.pattern); got != tt.want { | |||
| 57 | + | t.Fatalf("Specificity(%q) = %d, want %d", tt.pattern, got, tt.want) | |||
| 58 | + | } | |||
| 59 | + | }) | |||
| 23 | } | 60 | } | ||
| 24 | } | 61 | } | ||