oh-my-posh/src/palette_test.go
Yehor Borkov 9ecd7c09a4
feat(palette): a map of named color values
introducing a map of named standard color
values that can be referenced in theme segments
2021-11-22 15:25:56 +01:00

234 lines
7 KiB
Go

package main
import (
"testing"
"github.com/alecthomas/assert"
)
var (
testPalette = Palette{
"red": "#FF0000",
"green": "#00FF00",
"blue": "#0000FF",
"white": "#FFFFFF",
"black": "#000000",
}
)
type TestPaletteRequest struct {
Case string
Request string
ExpectedError bool
Expected string
}
func TestPaletteShouldResolveColorFromTestPalette(t *testing.T) {
cases := []TestPaletteRequest{
{Case: "Palette red", Request: "p:red", Expected: "#FF0000"},
{Case: "Palette green", Request: "p:green", Expected: "#00FF00"},
{Case: "Palette blue", Request: "p:blue", Expected: "#0000FF"},
{Case: "Palette white", Request: "p:white", Expected: "#FFFFFF"},
{Case: "Palette black", Request: "p:black", Expected: "#000000"},
}
for _, tc := range cases {
testPaletteRequest(t, tc)
}
}
func testPaletteRequest(t *testing.T, tc TestPaletteRequest) {
actual, err := testPalette.ResolveColor(tc.Request)
if !tc.ExpectedError {
assert.Nil(t, err, tc.Case)
assert.Equal(t, tc.Expected, actual, "expected different color value")
} else {
assert.NotNil(t, err, tc.Case)
assert.Equal(t, tc.Expected, err.Error())
}
}
func TestPaletteShouldIgnoreNonPaletteColors(t *testing.T) {
cases := []TestPaletteRequest{
{Case: "Deep puprple", Request: "#1F1137", Expected: "#1F1137"},
{Case: "Light red", Request: "#D55252", Expected: "#D55252"},
{Case: "ANSI black", Request: "black", Expected: "black"},
{Case: "Foreground", Request: "foreground", Expected: "foreground"},
}
for _, tc := range cases {
testPaletteRequest(t, tc)
}
}
func TestPaletteShouldReturnErrorOnMissingColor(t *testing.T) {
cases := []TestPaletteRequest{
{
Case: "Palette deep purple",
Request: "p:deep-purple",
ExpectedError: true,
Expected: "palette: requested color deep-purple does not exist in palette of colors black,blue,green,red,white",
},
{
Case: "Palette cyan",
Request: "p:cyan",
ExpectedError: true,
Expected: "palette: requested color cyan does not exist in palette of colors black,blue,green,red,white",
},
{
Case: "Palette foreground",
Request: "p:foreground",
ExpectedError: true,
Expected: "palette: requested color foreground does not exist in palette of colors black,blue,green,red,white",
},
}
for _, tc := range cases {
testPaletteRequest(t, tc)
}
}
func TestPaletteShouldHandleMixedCases(t *testing.T) {
cases := []TestPaletteRequest{
{Case: "Palette red", Request: "p:red", Expected: "#FF0000"},
{Case: "ANSI black", Request: "black", Expected: "black"},
{Case: "Cyan", Request: "#05E6FA", Expected: "#05E6FA"},
{Case: "Palette black", Request: "p:black", Expected: "#000000"},
{Case: "Palette pink", Request: "p:pink", ExpectedError: true, Expected: "palette: requested color pink does not exist in palette of colors black,blue,green,red,white"},
}
for _, tc := range cases {
testPaletteRequest(t, tc)
}
}
func TestPaletteShouldUseEmptyColorByDefault(t *testing.T) {
cases := []TestPaletteRequest{
{Case: "Palette magenta", Request: "p:magenta", Expected: ""},
{Case: "Palette gray", Request: "p:gray", Expected: ""},
{Case: "Palette rose", Request: "p:rose", Expected: ""},
}
for _, tc := range cases {
actual := testPalette.MaybeResolveColor(tc.Request)
assert.Equal(t, tc.Expected, actual, "expected different color value")
}
}
func TestPaletteShouldResolveRecursiveReference(t *testing.T) {
tp := Palette{
"light-blue": "#CAF0F8",
"dark-blue": "#023E8A",
"foreground": "p:light-blue",
"background": "p:dark-blue",
"text": "p:foreground",
"icon": "p:background",
"void": "p:void", // infinite recursion - error
"1": "white",
"2": "p:1",
"3": "p:2",
"4": "p:3", // 3 recursive lookups - allowed
"5": "p:4", // 4 recursive lookups - error
}
cases := []TestPaletteRequest{
{
Case: "Palette light-blue",
Request: "p:light-blue",
Expected: "#CAF0F8",
},
{
Case: "Palette foreground",
Request: "p:foreground",
Expected: "#CAF0F8",
},
{
Case: "Palette background",
Request: "p:background",
Expected: "#023E8A",
},
{
Case: "Palette text (2 recursive lookups)",
Request: "p:text",
Expected: "#CAF0F8",
},
{
Case: "Palette icon (2 recursive lookups)",
Request: "p:icon",
Expected: "#023E8A",
},
{
Case: "Palette void (infinite recursion)",
Request: "p:void",
ExpectedError: true,
Expected: "palette: recursive resolution of color p:void returned palette reference p:void and reached recursion depth 4",
},
{
Case: "Palette p:4 (3 recursive lookups)",
Request: "p:4",
Expected: "white",
},
{
Case: "Palette p:5 (4 recursive lookups)",
Request: "p:5",
ExpectedError: true,
Expected: "palette: recursive resolution of color p:5 returned palette reference p:1 and reached recursion depth 4",
},
}
for _, tc := range cases {
actual, err := tp.ResolveColor(tc.Request)
if !tc.ExpectedError {
assert.Nil(t, err, "expected no error")
assert.Equal(t, tc.Expected, actual, "expected different color value")
} else {
assert.NotNil(t, err, "expected error")
assert.Equal(t, tc.Expected, err.Error())
}
}
}
func TestPaletteShouldHandleEmptyKey(t *testing.T) {
tp := Palette{
"": "#000000",
}
actual, err := tp.ResolveColor("p:")
assert.Nil(t, err, "expected no error")
assert.Equal(t, "#000000", actual, "expected different color value")
}
func BenchmarkPaletteMixedCaseResolution(b *testing.B) {
for i := 0; i < b.N; i++ {
benchmarkPaletteMixedCaseResolution()
}
}
func benchmarkPaletteMixedCaseResolution() {
cases := []TestPaletteRequest{
{Case: "Palette red", Request: "p:red", Expected: "#FF0000"},
{Case: "ANSI black", Request: "black", Expected: "black"},
{Case: "Cyan", Request: "#05E6FA", Expected: "#05E6FA"},
{Case: "Palette black", Request: "p:black", Expected: "#000000"},
{Case: "Palette pink", Request: "p:pink", ExpectedError: true, Expected: "palette: requested color pink does not exist in palette of colors black,blue,green,red,white"},
{Case: "Palette blue", Request: "p:blue", Expected: "#0000FF"},
// repeating the same set to have longer benchmarks
{Case: "Palette red", Request: "p:red", Expected: "#FF0000"},
{Case: "ANSI black", Request: "black", Expected: "black"},
{Case: "Cyan", Request: "#05E6FA", Expected: "#05E6FA"},
{Case: "Palette black", Request: "p:black", Expected: "#000000"},
{Case: "Palette pink", Request: "p:pink", ExpectedError: true, Expected: "palette: requested color pink does not exist in palette of colors black,blue,green,red,white"},
{Case: "Palette blue", Request: "p:blue", Expected: "#0000FF"},
}
for _, tc := range cases {
// both value and error values are irrelevant, but such assignment calms down
// golangci-lint "return value of `testPalette.ResolveColor` is not checked" error
_, _ = testPalette.ResolveColor(tc.Request)
}
}