package ui
import (
"strings"
"testing"
"github.com/charmbracelet/lipgloss"
)
func TestNoStyleUnderlines(t *testing.T) {
// lipgloss emits an escape sequence per rune to underline: 200 characters
// cost 2800 bytes against 209 plain. No style may carry it back.
text := strings.Repeat("x", 200)
for name, render := range map[string]func(string) string{
"Warn": func(s string) string { return Warn.Render(s) },
"Alert": func(s string) string { return Alert.Render(s) },
"Err": func(s string) string { return Err.Render(s) },
"OK": func(s string) string { return OK.Render(s) },
} {
got := len(render(text))
if got > 400 {
t.Errorf("%s renders %d bytes for 200 characters; underline is back",
name, got)
}
}
}
func TestWarnAndAlertStayDistinguishableFromTheirNeighbours(t *testing.T) {
// The second channel has to survive for a theme whose slots look alike.
for _, pair := range [][2]func(string) string{
{func(s string) string { return Alert.Render(s) },
func(s string) string { return Err.Render(s) }},
{func(s string) string { return Warn.Render(s) },
func(s string) string { return OK.Render(s) }},
} {
if pair[0]("x") == pair[1]("x") {
t.Errorf("two roles render identically: %q", pair[0]("x"))
}
}
}
func TestAdvisoriesAreColouredBySeverityNotFixability(t *testing.T) {
// Fixability has its own channel -- the "fixed in X" text. Colouring the
// severity label by it made Critical and Low the same shade, which is the
// one distinction a security list exists to make.
seen := map[string]lipgloss.Style{}
for _, sev := range []string{"Critical", "High", "Medium", "Low", "Unknown"} {
seen[sev] = StylesByRole(advisoryRole(sev))
}
if seen["Critical"].Render("x") == seen["Low"].Render("x") {
t.Error("Critical and Low render identically")
}
if seen["Critical"].Render("x") == seen["Medium"].Render("x") {
t.Error("Critical and Medium render identically")
}
if seen["Medium"].Render("x") == seen["Low"].Render("x") {
t.Error("Medium and Low render identically")
}
if seen["Critical"].Render("x") != Alert.Render("x") {
t.Error("Critical is not the alert role")
}
}