import { describe, expect, test } from "bun:test"; import { parseAttributes } from "./gitattributes"; import { languageColor, languageOf, parseLanguages, summarizeLanguages } from "./languages"; describe("language detection", () => { test("by extension and well-known filename; data, prose and unknown files don't count", () => { expect(languageOf("src/app.tsx")).toBe("TypeScript"); expect(languageOf("lib/Main.KT")).toBe("Kotlin"); expect(languageOf("Dockerfile")).toBe("Dockerfile"); expect(languageOf("build/CMakeLists.txt")).toBe("CMake"); expect(languageOf("README.md")).toBeNull(); expect(languageOf("package.json")).toBeNull(); expect(languageOf(".bashrc")).toBeNull(); expect(languageOf("LICENSE")).toBeNull(); }); test("vendored, generated and documentation paths are skipped", () => { expect(languageOf("node_modules/x/index.js")).toBeNull(); expect(languageOf("web/vendor/jquery.js")).toBeNull(); expect(languageOf("dist/app.js")).toBeNull(); expect(languageOf("docs/example.py")).toBeNull(); expect(languageOf("public/app.min.js")).toBeNull(); expect(languageOf("api/service.pb.go")).toBeNull(); }); test("linguist attributes override the defaults", () => { const rules = parseAttributes( [ "*.h linguist-language=C++", "scripts/*.js linguist-vendored", "docs/runnable/** -linguist-documentation", "*.sql linguist-language=plpgsql", "src/gen/** linguist-generated=true", "tools/*.sh linguist-detectable=false", ].join("\n"), 100, ); expect(languageOf("include/a.h", rules)).toBe("C++"); expect(languageOf("scripts/build.js", rules)).toBeNull(); expect(languageOf("docs/runnable/demo.py", rules)).toBe("Python"); expect(languageOf("db/schema.sql", rules)).toBe("plpgsql"); expect(languageOf("src/gen/api.ts", rules)).toBeNull(); expect(languageOf("tools/x.sh", rules)).toBeNull(); }); }); describe("language summary", () => { test("largest first, tiny shares folded into Other", () => { const summary = summarizeLanguages( new Map([ ["Go", 9000], ["TypeScript", 990_000], ["Shell", 500], ["Rust", 0], ]), ); expect(summary).toEqual([ { name: "TypeScript", bytes: 990_000 }, { name: "Go", bytes: 9000 }, { name: "Other", bytes: 500 }, ]); expect(parseLanguages(JSON.stringify(summary))).toEqual(summary); expect(parseLanguages("[1]")).toEqual([]); expect(languageColor("Go")).toBe("#00ADD8"); expect(languageColor("Klingon")).toBe("#8b8b8b"); }); });