68 lines · 2.6 KB
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");