| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141 |
- 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")
- }
- }
|