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  }