- Add github.com/go-enry/go-enry/v2 dependency to go.mod - guessLang: JSON fast path, then enry strategies (shebangs, XML, modelines, content heuristics), then enry's Linguist-trained Bayesian classifier over regex-hint candidate languages; curated dropdown expanded with typescript, html, css, xml, php, ruby, perl, lua, dockerfile, toml, ini, diff, csharp - enry display names normalized to lowercase stored ids (Dockerfile->dockerfile, Shell->bash, C#->csharp); unsupported languages render unhighlighted - Tests: existing languages, all new languages, magic markers (enry shebang/ DOCTYPE/FROM/diff handling), canonical mapping
93 lines
4.4 KiB
Go
93 lines
4.4 KiB
Go
package main
|
|
|
|
import (
|
|
"strings"
|
|
"testing"
|
|
)
|
|
|
|
// TestGuessLangExisting covers languages detected before the enry switch and
|
|
// still expected to work after it.
|
|
func TestGuessLangExisting(t *testing.T) {
|
|
cases := map[string]string{
|
|
"package main\n\nfunc main() {}\n": "go",
|
|
"def foo():\n return 1\n": "python",
|
|
"const x = 1;\nconsole.log(x);\n": "javascript",
|
|
"{\"a\": 1, \"b\": [2, 3]}\n": "json",
|
|
"hello world just some text": "text",
|
|
"": "",
|
|
"fn main() {\n let x = 1;\n}\n": "rust",
|
|
"#include <stdio.h>\nint main() { printf(\"hi\"); }\n": "c",
|
|
"SELECT id, name FROM users WHERE active = 1;\n": "sql",
|
|
"title: demo\nitems:\n - one\n - two\n": "yaml",
|
|
"# Demo\n\nsome *markdown* text with a [link](http://x)\n": "markdown",
|
|
"#!/bin/bash\nset -euo pipefail\necho hi\n": "bash",
|
|
}
|
|
for src, want := range cases {
|
|
if got := guessLang(src); got != want {
|
|
t.Errorf("guessLang(%q) = %q, want %q", src, got, want)
|
|
}
|
|
}
|
|
}
|
|
|
|
// TestGuessLangNewLanguages covers the languages added to the dropdown as part
|
|
// of the enry integration (#41).
|
|
func TestGuessLangNewLanguages(t *testing.T) {
|
|
cases := map[string]string{
|
|
"interface User {\n name: string;\n age: number;\n}\n": "typescript",
|
|
"<!DOCTYPE html>\n<html>\n<head><title>hi</title></head>\n</html>\n": "html",
|
|
".container {\n display: flex;\n padding: 4px;\n}\n": "css",
|
|
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<root><item>x</item></root>\n": "xml",
|
|
"<?php\nfunction hi() { echo 'x'; }\n": "php",
|
|
"def greet(name)\n puts \"hi #{name}\"\nend\n": "ruby",
|
|
"use strict;\nmy $x = 5;\nprint \"x is $x\\n\";\n": "perl",
|
|
"local x = 10\nfunction add(a, b)\n return a + b\nend\n": "lua",
|
|
"FROM golang:1.22\nRUN go build -o app .\nCMD [\"./app\"]\n": "dockerfile",
|
|
"[package]\nname = \"demo\"\nversion = \"0.1.0\"\n": "toml",
|
|
"[server]\nhost = 127.0.0.1\nport = 8080\n": "ini",
|
|
"diff --git a/main.go b/main.go\n--- a/main.go\n+++ b/main.go\n@@ -1 +1 @@\n": "diff",
|
|
}
|
|
for src, want := range cases {
|
|
if got := guessLang(src); got != want {
|
|
t.Errorf("guessLang(%q) = %q, want %q", src, got, want)
|
|
}
|
|
}
|
|
}
|
|
|
|
// TestGuessLangMagicMarkers verifies enry's built-in shebang / signature
|
|
// handling that replaced the hand-rolled magic-marker pre-checks (#41).
|
|
func TestGuessLangMagicMarkers(t *testing.T) {
|
|
cases := map[string]string{
|
|
"#!/usr/bin/env node\nconsole.log('hi');\n": "javascript",
|
|
"#!/usr/bin/env python3\nimport sys\nprint(sys.argv)\n": "python",
|
|
"#!/usr/bin/python\nprint('x')\n": "python",
|
|
"#!/bin/bash\nset -euo pipefail\necho hi\n": "bash",
|
|
"#!/bin/sh\necho hi\n": "bash",
|
|
"<?php\necho 'x';\n": "php",
|
|
"<!DOCTYPE html>\n<html><body></body></html>": "html",
|
|
"FROM alpine:3.19\nCOPY app /app\n": "dockerfile",
|
|
"FROM ubuntu:24.04\nRUN apt-get update\n": "dockerfile",
|
|
"diff --git a/x.txt b/x.txt\nindex 123..456 100644\n": "diff",
|
|
"--- a/config.yml\n+++ b/config.yml\n@@ -1,2 +1,3 @@\n": "diff",
|
|
}
|
|
for src, want := range cases {
|
|
if got := guessLang(src); got != want {
|
|
t.Errorf("guessLang(%q) = %q, want %q", src, got, want)
|
|
}
|
|
}
|
|
}
|
|
|
|
// TestGuessLangCanonical verifies enry display names are mapped/lowercased to
|
|
// our stored ids.
|
|
func TestGuessLangCanonical(t *testing.T) {
|
|
if got := guessLang("FROM debian:12\nCMD [\"sh\"]\n"); got != "dockerfile" {
|
|
t.Errorf("Dockerfile canonical mapping failed: got %q", got)
|
|
}
|
|
if got := guessLang("#!/bin/sh\necho hi\n"); got != "bash" {
|
|
t.Errorf("Shell canonical mapping failed: got %q", got)
|
|
}
|
|
// uncurated languages still come back lowercase
|
|
if got := guessLang("<h1>{{.Name}}</h1>\n"); got != strings.ToLower(got) {
|
|
t.Errorf("expected lowercase output, got %q", got)
|
|
}
|
|
}
|