mirror of
https://github.com/JanDeDobbeleer/oh-my-posh.git
synced 2024-11-14 23:14:05 -08:00
9ecd7c09a4
introducing a map of named standard color values that can be referenced in theme segments
234 lines
7 KiB
Go
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)
|
|
}
|
|
}
|