src.elv.sh@v0.21.0-dev.0.20240515223629-06979efb9a2a/pkg/ui/style_test.go (about) 1 package ui 2 3 import ( 4 "testing" 5 6 "src.elv.sh/pkg/testutil" 7 ) 8 9 func TestStyleSGR(t *testing.T) { 10 // Test the SGR sequences of style attributes indirectly via VTString of 11 // Text, since that is how they are used. 12 testTextVTString(t, []textVTStringTest{ 13 {T("foo", Bold), "\033[;1mfoo\033[m"}, 14 {T("foo", Dim), "\033[;2mfoo\033[m"}, 15 {T("foo", Italic), "\033[;3mfoo\033[m"}, 16 {T("foo", Underlined), "\033[;4mfoo\033[m"}, 17 {T("foo", Blink), "\033[;5mfoo\033[m"}, 18 {T("foo", Inverse), "\033[;7mfoo\033[m"}, 19 {T("foo", FgRed), "\033[;31mfoo\033[m"}, 20 {T("foo", BgRed), "\033[;41mfoo\033[m"}, 21 {T("foo", Bold, FgRed, BgBlue), "\033[;1;31;44mfoo\033[m"}, 22 }) 23 } 24 25 func TestStyleSGR_NoColor(t *testing.T) { 26 testutil.Set(t, &NoColor, true) 27 testTextVTString(t, []textVTStringTest{ 28 {T("foo", FgRed), "\033[mfoo"}, 29 {T("foo", BgRed), "\033[mfoo"}, 30 {T("foo", FgRed, BgBlue), "\033[mfoo"}, 31 }) 32 } 33 34 type mergeFromOptionsTest struct { 35 style Style 36 options map[string]any 37 wantStyle Style 38 wantErr string 39 } 40 41 var mergeFromOptionsTests = []mergeFromOptionsTest{ 42 // Parsing of each possible key. 43 kv("fg-color", "red", Style{Fg: Red}), 44 kv("bg-color", "red", Style{Bg: Red}), 45 kv("bold", true, Style{Bold: true}), 46 kv("dim", true, Style{Dim: true}), 47 kv("italic", true, Style{Italic: true}), 48 kv("underlined", true, Style{Underlined: true}), 49 kv("blink", true, Style{Blink: true}), 50 kv("inverse", true, Style{Inverse: true}), 51 // Merging with existing options. 52 { 53 style: Style{Bold: true, Dim: true}, 54 options: map[string]any{ 55 "bold": false, "fg-color": "red", 56 }, 57 wantStyle: Style{Dim: true, Fg: Red}, 58 }, 59 // Bad key. 60 { 61 options: map[string]any{"bad": true}, 62 wantErr: "unrecognized option 'bad'", 63 }, 64 // Bad type for color field. 65 { 66 options: map[string]any{"fg-color": true}, 67 wantErr: "value for option 'fg-color' must be a valid color string", 68 }, 69 // Bad type for bool field. 70 { 71 options: map[string]any{"bold": ""}, 72 wantErr: "value for option 'bold' must be a bool value", 73 }, 74 } 75 76 // A helper for constructing a test case whose input is a single key-value pair. 77 func kv(k string, v any, s Style) mergeFromOptionsTest { 78 return mergeFromOptionsTest{ 79 options: map[string]any{k: v}, wantStyle: s, 80 } 81 } 82 83 func TestMergeFromOptions(t *testing.T) { 84 for _, test := range mergeFromOptionsTests { 85 style := test.style 86 err := style.MergeFromOptions(test.options) 87 if style != test.wantStyle { 88 t.Errorf("(%v).MergeFromOptions(%v) -> %v, want %v", 89 test.style, test.options, style, test.wantStyle) 90 } 91 if err == nil { 92 if test.wantErr != "" { 93 t.Errorf("got error nil, want %v", test.wantErr) 94 } 95 } else { 96 if err.Error() != test.wantErr { 97 t.Errorf("got error %v, want error with message %s", err, test.wantErr) 98 } 99 } 100 } 101 }