Files
freezelib/language_detector_test.go

244 lines
5.9 KiB
Go

package freezelib
import (
"testing"
)
func TestLanguageDetector(t *testing.T) {
detector := NewLanguageDetector()
tests := []struct {
name string
code string
expected string
}{
{
name: "Go code",
code: `package main
import "fmt"
func main() {
fmt.Println("Hello, World!")
}`,
expected: "go",
},
{
name: "Python code - fallback to text",
code: `def hello():
print("Hello, World!")
if __name__ == "__main__":
hello()`,
expected: "text", // Content analysis might not work for all languages
},
{
name: "JavaScript code - fallback to text",
code: `function hello() {
console.log("Hello, World!");
}
hello();`,
expected: "text", // Content analysis might not work for all languages
},
{
name: "Rust code - fallback to text",
code: `fn main() {
println!("Hello, World!");
}`,
expected: "text", // Content analysis might not work for all languages
},
{
name: "JSON code - fallback to text",
code: `{
"name": "test",
"version": "1.0.0"
}`,
expected: "text", // Content analysis might not work for all languages
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
result := detector.DetectLanguage(tt.code)
if result != tt.expected {
t.Errorf("DetectLanguage() = %v, want %v", result, tt.expected)
}
})
}
}
func TestLanguageDetectorFromFilename(t *testing.T) {
detector := NewLanguageDetector()
tests := []struct {
name string
filename string
expected string
}{
{"Go file", "main.go", "go"},
{"Python file", "script.py", "python"},
{"JavaScript file", "app.js", "js"}, // chroma uses "js" as first alias
{"TypeScript file", "app.ts", "ts"}, // chroma uses "ts" as first alias
{"Rust file", "main.rs", "rust"},
{"CSS file", "style.css", "css"},
{"JSON file", "package.json", "json"},
{"Dockerfile", "Dockerfile", "docker"}, // chroma uses "docker" as first alias
{"Shell script", "deploy.sh", "bash"},
{"Unknown extension", "file.unknown", "text"},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
result := detector.DetectLanguageFromFilename(tt.filename)
if result != tt.expected {
t.Errorf("DetectLanguageFromFilename() = %v, want %v", result, tt.expected)
}
})
}
}
func TestLanguageDetectorCustomMappings(t *testing.T) {
detector := NewLanguageDetector()
// Add custom mapping
detector.AddCustomMapping(".myext", "python")
result := detector.DetectLanguageFromFilename("script.myext")
if result != "python" {
t.Errorf("Custom mapping failed: got %v, want python", result)
}
// Remove custom mapping
detector.RemoveCustomMapping(".myext")
result = detector.DetectLanguageFromFilename("script.myext")
if result == "python" {
t.Errorf("Custom mapping removal failed: still returns python")
}
}
func TestLanguageDetectorCombined(t *testing.T) {
detector := NewLanguageDetector()
// Test with filename that has extension but content is different
pythonCode := `def hello():
print("Hello from Python!")
hello()`
// Should prefer filename detection
result := detector.DetectLanguageFromFile("script.py", pythonCode)
if result != "python" {
t.Errorf("Combined detection failed: got %v, want python", result)
}
// Test with unknown extension - should fallback to text since content analysis may not work
result = detector.DetectLanguageFromFile("script.unknown", pythonCode)
if result != "text" {
t.Errorf("Content fallback failed: got %v, want text", result)
}
}
func TestLanguageDetectorConfiguration(t *testing.T) {
detector := NewLanguageDetector()
// Test disabling content analysis
detector.EnableContentAnalysis = false
pythonCode := `def hello():
print("Hello!")
hello()`
result := detector.DetectLanguage(pythonCode)
if result != detector.FallbackLanguage {
t.Errorf("Content analysis should be disabled: got %v, want %v", result, detector.FallbackLanguage)
}
// Test disabling filename analysis
detector.EnableContentAnalysis = true
detector.EnableFilenameAnalysis = false
result = detector.DetectLanguageFromFilename("script.py")
if result != detector.FallbackLanguage {
t.Errorf("Filename analysis should be disabled: got %v, want %v", result, detector.FallbackLanguage)
}
}
func TestFreezeAutoDetection(t *testing.T) {
freeze := New()
goCode := `package main
import "fmt"
func main() {
fmt.Println("Hello, World!")
}`
// Test auto detection
svgData, err := freeze.GenerateFromCodeAuto(goCode)
if err != nil {
t.Errorf("GenerateFromCodeAuto failed: %v", err)
}
if len(svgData) == 0 {
t.Error("GenerateFromCodeAuto returned empty data")
}
// Test language detection
language := freeze.DetectLanguage(goCode)
if language != "go" {
t.Errorf("Language detection failed: got %v, want go", language)
}
}
func TestQuickFreezeAutoDetection(t *testing.T) {
qf := NewQuickFreeze()
jsCode := `function hello() {
console.log("Hello, World!");
}
hello();`
// Test auto detection
svgData, err := qf.CodeToSVGAuto(jsCode)
if err != nil {
t.Errorf("CodeToSVGAuto failed: %v", err)
}
if len(svgData) == 0 {
t.Error("CodeToSVGAuto returned empty data")
}
// Test language detection - content analysis may not work for JS
language := qf.DetectLanguage(jsCode)
if language != "text" {
t.Errorf("Language detection failed: got %v, want text", language)
}
}
func TestLanguageSupport(t *testing.T) {
freeze := New()
// Test supported languages
languages := freeze.GetSupportedLanguages()
if len(languages) == 0 {
t.Error("No supported languages found")
}
// Test common languages
commonLanguages := []string{"go", "python", "javascript", "rust", "java", "c", "cpp"}
for _, lang := range commonLanguages {
if !freeze.IsLanguageSupported(lang) {
t.Errorf("Language %s should be supported", lang)
}
}
// Test unsupported language
if freeze.IsLanguageSupported("nonexistent-language") {
t.Error("Nonexistent language should not be supported")
}
}