Gim/internal/theme/loader_test.go
Hayden Hargreaves 4d96c0a531
All checks were successful
Run Test Suite / test (push) Successful in 35s
test: updated colorscheme related tests. tested loader
2026-04-08 12:57:33 -07:00

118 lines
3.5 KiB
Go

package theme
import (
"fmt"
"testing"
)
func TestLoadEmbeddedThemesJSON_LoadsExpectedThemes(t *testing.T) {
themesJSON, err := LoadEmbeddedThemesJSON()
if err != nil {
t.Fatalf("LoadEmbeddedThemesJSON returned error: %v", err)
}
want := []string{"kanagawa", "kanagawa-dragon", "kanagawa-lotus"}
for _, name := range want {
th, ok := themesJSON[name]
if !ok {
t.Fatalf("expected embedded theme %q to be loaded", name)
}
if th.Name == "" {
t.Fatalf("expected embedded theme %q to have a name", name)
}
if th.Line.BG == "" {
t.Fatalf("expected embedded theme %q to include line background", name)
}
}
}
func TestMapEmbeddedThemeToEditorTheme_MapsStylesAndNormalizesSyntaxKeys(t *testing.T) {
in := map[string]ThemeJSON{
"custom": {
Name: "custom",
Line: ColorStyleJSON{FG: "#dddddd", BG: "#101010"},
Background: ColorStyleJSON{BG: "#101010"},
VisualHighlight: ColorStyleJSON{BG: "#202020"},
Cursors: CursorJSON{
Normal: ColorStyleJSON{FG: "#101010", BG: "#dddddd"},
Insert: ColorStyleJSON{FG: "#101010", BG: "#cccccc"},
Command: ColorStyleJSON{FG: "#101010", BG: "#bbbbbb"},
Replace: ColorStyleJSON{FG: "#101010", BG: "#aaaaaa"},
},
Gutter: GutterJSON{
Default: ColorStyleJSON{FG: "#666666", BG: "#0a0a0a"},
CurrentLine: ColorStyleJSON{FG: "#eeeeee", BG: "#0a0a0a"},
},
StatusBar: StatusBarJSON{
Default: ColorStyleJSON{FG: "#cccccc", BG: "#0a0a0a"},
},
CommandLine: CommandLineJSON{
Error: ColorStyleJSON{FG: "#ff0000", BG: "#101010"},
OutputBorder: ColorStyleJSON{FG: "#dddddd", BG: "#0a0a0a"},
ContinueMessage: ColorStyleJSON{FG: "#00aaff", BG: "#101010"},
},
Syntax: SyntaxJSON{
Group: map[string]string{
" String ": "#00ff00",
},
Exact: map[string]string{
" @KEYWORD.Return ": "#ff00ff",
},
},
},
}
out := MapEmbeddedThemeToEditorTheme(in)
th, ok := out["custom"]
if !ok {
t.Fatalf("expected mapped theme with key %q", "custom")
}
if got := colorHex(th.Line.GetForeground()); got != "#dddddd" {
t.Fatalf("line fg mismatch: got %q want %q", got, "#dddddd")
}
if got := colorHex(th.Line.GetBackground()); got != "#101010" {
t.Fatalf("line bg mismatch: got %q want %q", got, "#101010")
}
if got := colorHex(th.Syntax.Exact["keyword.return"].GetForeground()); got != "#ff00ff" {
t.Fatalf("exact capture fg mismatch: got %q want %q", got, "#ff00ff")
}
if got := colorHex(th.Syntax.Exact["keyword.return"].GetBackground()); got != "#101010" {
t.Fatalf("exact capture bg mismatch: got %q want %q", got, "#101010")
}
if got := colorHex(th.Syntax.Group["string"].GetForeground()); got != "#00ff00" {
t.Fatalf("group capture fg mismatch: got %q want %q", got, "#00ff00")
}
if got := colorHex(th.CommandLine.Error.GetForeground()); got != "#ff0000" {
t.Fatalf("command error fg mismatch: got %q want %q", got, "#ff0000")
}
}
func TestMapEmbededThemeToEditorTheme_AliasMatchesPrimary(t *testing.T) {
in := map[string]ThemeJSON{
"x": {
Name: "x",
Line: ColorStyleJSON{FG: "#ffffff", BG: "#000000"},
Syntax: SyntaxJSON{
Group: map[string]string{"keyword": "#123456"},
},
},
}
a := MapEmbededThemeToEditorTheme(in)
b := MapEmbeddedThemeToEditorTheme(in)
if len(a) != len(b) {
t.Fatalf("alias map size mismatch: %d vs %d", len(a), len(b))
}
if colorHex(a["x"].Syntax.Group["keyword"].GetForeground()) != colorHex(b["x"].Syntax.Group["keyword"].GetForeground()) {
t.Fatalf("alias should produce identical mapped styles")
}
}
func colorHex(c any) string {
return fmt.Sprint(c)
}