Files
code-utils/scanner_test.go
李琦 7c4109f687 feat: 提交详情能看 diff,也能丢给 AI 审这一次改动。文件检查可单独排除路径,TODO 只认大写,避免把 todo 表和模块当成待办标记。
热力图按容器宽度铺满一年,不再横向滚动。托盘右键换成可换皮肤的弹层;更新下载显示进度,退出后再由脚本拉起安装器,避免还占着 exe。
2026-08-19 15:46:03 +08:00

87 lines
2.5 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package main
import (
"context"
"os"
"path/filepath"
"testing"
)
func TestScannerCountsAndExcludes(t *testing.T) {
root := t.TempDir()
if err := os.WriteFile(filepath.Join(root, "main.go"), []byte("package main\n\n// note\nfunc main() {}\n"), 0644); err != nil {
t.Fatal(err)
}
if err := os.Mkdir(filepath.Join(root, "node_modules"), 0755); err != nil {
t.Fatal(err)
}
if err := os.WriteFile(filepath.Join(root, "node_modules", "bad.js"), []byte("alert(1)\n"), 0644); err != nil {
t.Fatal(err)
}
langs, files, err := (Scanner{}).Analyze(context.Background(), root, []ExclusionRule{{Pattern: "node_modules"}}, func(int, string) {})
if err != nil {
t.Fatal(err)
}
if len(langs) != 1 || langs[0].Name != "Go" {
t.Fatalf("unexpected languages: %#v", langs)
}
if langs[0].Code != 2 || langs[0].Comments != 1 || langs[0].Blanks != 1 {
t.Fatalf("unexpected count: %#v", langs[0])
}
for _, f := range files {
if f.Name == "bad.js" {
t.Fatal("excluded file was scanned")
}
}
}
func TestWildcardMatch(t *testing.T) {
cases := []struct {
p, s string
want bool
}{
{"*.log", "storage/app.log", true},
{"vendor", "vendor/a.php", true},
{"dist", "src/main.js", false},
{"src/todo", "src/todo", true},
{"src/todo", "src/todo/list.go", true},
{"src/todo", "src/other/list.go", false},
}
for _, c := range cases {
if got := wildcardMatch(c.p, c.s); got != c.want {
t.Errorf("%s %s = %v", c.p, c.s, got)
}
}
}
func TestNestedGitignoreDoesNotExcludeSiblingSource(t *testing.T) {
root := t.TempDir()
dependency := filepath.Join(root, "vendor", "package")
if err := os.MkdirAll(dependency, 0755); err != nil {
t.Fatal(err)
}
// 依赖包中的局部规则只应作用于 vendor/package不能过滤项目根目录。
if err := os.WriteFile(filepath.Join(dependency, ".gitignore"), []byte("*\n"), 0644); err != nil {
t.Fatal(err)
}
if err := os.WriteFile(filepath.Join(dependency, "ignored.go"), []byte("package ignored\n"), 0644); err != nil {
t.Fatal(err)
}
if err := os.WriteFile(filepath.Join(root, "main.go"), []byte("package main\nfunc main() {}\n"), 0644); err != nil {
t.Fatal(err)
}
langs, files, err := (Scanner{}).Analyze(context.Background(), root, nil, func(int, string) {})
if err != nil {
t.Fatal(err)
}
if len(langs) != 1 || langs[0].Name != "Go" || langs[0].Files != 1 {
t.Fatalf("嵌套 .gitignore 错误影响了同级源码: %#v", langs)
}
for _, file := range files {
if file.Name == "ignored.go" {
t.Fatal("嵌套 .gitignore 未排除自身目录中的文件")
}
}
}