mirror of
https://github.com/sst/opencode.git
synced 2025-08-24 06:54:09 +00:00
141 lines
3.7 KiB
Go
141 lines
3.7 KiB
Go
package theme
|
|
|
|
import (
|
|
"os"
|
|
"path/filepath"
|
|
"slices"
|
|
"testing"
|
|
)
|
|
|
|
func TestLoadThemesFromJSON(t *testing.T) {
|
|
// Test loading themes
|
|
err := LoadThemesFromJSON()
|
|
if err != nil {
|
|
t.Fatalf("Failed to load themes: %v", err)
|
|
}
|
|
|
|
// Check that themes were loaded
|
|
themes := AvailableThemes()
|
|
if len(themes) == 0 {
|
|
t.Fatal("No themes were loaded")
|
|
}
|
|
|
|
// Check for expected themes
|
|
expectedThemes := []string{"tokyonight", "opencode", "everforest", "ayu"}
|
|
for _, expected := range expectedThemes {
|
|
found := slices.Contains(themes, expected)
|
|
if !found {
|
|
t.Errorf("Expected theme %s not found", expected)
|
|
}
|
|
}
|
|
|
|
// Test getting a specific theme
|
|
tokyonight := GetTheme("tokyonight")
|
|
if tokyonight == nil {
|
|
t.Fatal("Failed to get tokyonight theme")
|
|
}
|
|
|
|
// Test theme colors
|
|
primary := tokyonight.Primary()
|
|
if primary.Dark == nil || primary.Light == nil {
|
|
t.Error("Primary color not properly set")
|
|
}
|
|
}
|
|
|
|
func TestColorReferenceResolution(t *testing.T) {
|
|
// Load themes first
|
|
err := LoadThemesFromJSON()
|
|
if err != nil {
|
|
t.Fatalf("Failed to load themes: %v", err)
|
|
}
|
|
|
|
// Test a theme that uses references (e.g., solarized uses color definitions)
|
|
solarized := GetTheme("solarized")
|
|
if solarized == nil {
|
|
t.Fatal("Failed to get solarized theme")
|
|
}
|
|
|
|
// Check that color references were resolved
|
|
primary := solarized.Primary()
|
|
if primary.Dark == nil || primary.Light == nil {
|
|
t.Error("Primary color reference not resolved")
|
|
}
|
|
|
|
// Check that all colors are properly resolved
|
|
text := solarized.Text()
|
|
if text.Dark == nil || text.Light == nil {
|
|
t.Error("Text color reference not resolved")
|
|
}
|
|
}
|
|
|
|
func TestLoadThemesFromDirectories(t *testing.T) {
|
|
// Create temporary directories for testing
|
|
tempDir := t.TempDir()
|
|
|
|
userConfig := filepath.Join(tempDir, "config")
|
|
projectRoot := filepath.Join(tempDir, "project")
|
|
cwd := filepath.Join(tempDir, "cwd")
|
|
|
|
// Create theme directories
|
|
os.MkdirAll(filepath.Join(userConfig, "opencode", "themes"), 0755)
|
|
os.MkdirAll(filepath.Join(projectRoot, ".opencode", "themes"), 0755)
|
|
os.MkdirAll(filepath.Join(cwd, ".opencode", "themes"), 0755)
|
|
|
|
// Create test themes with same name to test override behavior
|
|
testTheme1 := `{
|
|
"theme": {
|
|
"primary": "#111111",
|
|
"secondary": "#222222",
|
|
"accent": "#333333",
|
|
"text": "#ffffff",
|
|
"textMuted": "#cccccc",
|
|
"background": "#000000"
|
|
}
|
|
}`
|
|
|
|
testTheme2 := `{
|
|
"theme": {
|
|
"primary": "#444444",
|
|
"secondary": "#555555",
|
|
"accent": "#666666",
|
|
"text": "#ffffff",
|
|
"textMuted": "#cccccc",
|
|
"background": "#000000"
|
|
}
|
|
}`
|
|
|
|
testTheme3 := `{
|
|
"theme": {
|
|
"primary": "#777777",
|
|
"secondary": "#888888",
|
|
"accent": "#999999",
|
|
"text": "#ffffff",
|
|
"textMuted": "#cccccc",
|
|
"background": "#000000"
|
|
}
|
|
}`
|
|
|
|
// Write themes to different directories
|
|
os.WriteFile(filepath.Join(userConfig, "opencode", "themes", "override-test.json"), []byte(testTheme1), 0644)
|
|
os.WriteFile(filepath.Join(projectRoot, ".opencode", "themes", "override-test.json"), []byte(testTheme2), 0644)
|
|
os.WriteFile(filepath.Join(cwd, ".opencode", "themes", "override-test.json"), []byte(testTheme3), 0644)
|
|
|
|
// Load themes
|
|
err := LoadThemesFromDirectories(userConfig, projectRoot, cwd)
|
|
if err != nil {
|
|
t.Fatalf("Failed to load themes from directories: %v", err)
|
|
}
|
|
|
|
// Check that the theme from CWD (highest priority) won
|
|
overrideTheme := GetTheme("override-test")
|
|
if overrideTheme == nil {
|
|
t.Fatal("Failed to get override-test theme")
|
|
}
|
|
|
|
// The primary color should be from testTheme3 (#777777)
|
|
primary := overrideTheme.Primary()
|
|
// We can't directly check the color value, but we can verify it was loaded
|
|
if primary.Dark == nil || primary.Light == nil {
|
|
t.Error("Override theme not properly loaded")
|
|
}
|
|
}
|