244 lines
5.9 KiB
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")
|
|
}
|
|
}
|