github.com/markusbkk/elvish@v0.0.0-20231204143114-91dc52438621/pkg/ui/text_test.go (about)

     1  package ui
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/markusbkk/elvish/pkg/eval/vals"
     7  	"github.com/markusbkk/elvish/pkg/tt"
     8  )
     9  
    10  var Args = tt.Args
    11  
    12  func TestT(t *testing.T) {
    13  	tt.Test(t, tt.Fn("T", T), tt.Table{
    14  		Args("test").Rets(Text{&Segment{Text: "test"}}),
    15  		Args("test red", FgRed).Rets(Text{&Segment{
    16  			Text: "test red", Style: Style{Foreground: Red}}}),
    17  		Args("test red", FgRed, Bold).Rets(Text{&Segment{
    18  			Text: "test red", Style: Style{Foreground: Red, Bold: true}}}),
    19  	})
    20  }
    21  
    22  func TestTextAsElvishValue(t *testing.T) {
    23  	vals.TestValue(t, T("text")).
    24  		Kind("ui:text").
    25  		Repr("(ui:text text)").
    26  		AllKeys("0").
    27  		Index("0", &Segment{Text: "text"})
    28  
    29  	vals.TestValue(t, T("text", FgRed)).
    30  		Repr("(ui:text (ui:text-segment text &fg-color=red))")
    31  	vals.TestValue(t, T("text", Bold)).
    32  		Repr("(ui:text (ui:text-segment text &bold=$true))")
    33  }
    34  
    35  var (
    36  	text0 = Text{}
    37  	text1 = Text{red("lorem")}
    38  	text2 = Text{red("lorem"), blue("foobar")}
    39  )
    40  
    41  func red(s string) *Segment  { return &Segment{Style{Foreground: Red}, s} }
    42  func blue(s string) *Segment { return &Segment{Style{Foreground: Blue}, s} }
    43  
    44  var partitionTests = tt.Table{
    45  	Args(text0).Rets([]Text{nil}),
    46  	Args(text1).Rets([]Text{text1}),
    47  	Args(text1, 0).Rets([]Text{nil, text1}),
    48  	Args(text1, 1).Rets([]Text{{red("l")}, {red("orem")}}),
    49  	Args(text1, 5).Rets([]Text{text1, nil}),
    50  	Args(text2).Rets([]Text{text2}),
    51  	Args(text2, 0).Rets([]Text{nil, text2}),
    52  	Args(text2, 1).Rets([]Text{
    53  		{red("l")}, {red("orem"), blue("foobar")}}),
    54  	Args(text2, 2).Rets([]Text{
    55  		{red("lo")}, {red("rem"), blue("foobar")}}),
    56  	Args(text2, 5).Rets([]Text{{red("lorem")}, {blue("foobar")}}),
    57  	Args(text2, 6).Rets([]Text{
    58  		{red("lorem"), blue("f")}, {blue("oobar")}}),
    59  	Args(text2, 11).Rets([]Text{text2, nil}),
    60  
    61  	Args(text1, 1, 2).Rets([]Text{{red("l")}, {red("o")}, {red("rem")}}),
    62  	Args(text1, 1, 2, 3, 4).Rets([]Text{
    63  		{red("l")}, {red("o")}, {red("r")}, {red("e")}, {red("m")}}),
    64  	Args(text2, 2, 4, 6).Rets([]Text{
    65  		{red("lo")}, {red("re")},
    66  		{red("m"), blue("f")}, {blue("oobar")}}),
    67  	Args(text2, 6, 8).Rets([]Text{
    68  		{red("lorem"), blue("f")}, {blue("oo")}, {blue("bar")}}),
    69  }
    70  
    71  func TestPartition(t *testing.T) {
    72  	tt.Test(t, tt.Fn("Text.Partition", Text.Partition), partitionTests)
    73  }
    74  
    75  func TestCountRune(t *testing.T) {
    76  	text := Text{red("lorem"), blue("ipsum")}
    77  	tt.Test(t, tt.Fn("Text.CountRune", Text.CountRune), tt.Table{
    78  		Args(text, 'l').Rets(1),
    79  		Args(text, 'i').Rets(1),
    80  		Args(text, 'm').Rets(2),
    81  		Args(text, '\n').Rets(0),
    82  	})
    83  }
    84  
    85  func TestCountLines(t *testing.T) {
    86  	tt.Test(t, tt.Fn("Text.CountLines", Text.CountLines), tt.Table{
    87  		Args(Text{red("lorem")}).Rets(1),
    88  		Args(Text{red("lorem"), blue("ipsum")}).Rets(1),
    89  		Args(Text{red("lor\nem"), blue("ipsum")}).Rets(2),
    90  		Args(Text{red("lor\nem"), blue("ip\nsum")}).Rets(3),
    91  	})
    92  }
    93  
    94  func TestSplitByRune(t *testing.T) {
    95  	tt.Test(t, tt.Fn("Text.SplitByRune", Text.SplitByRune), tt.Table{
    96  		Args(Text{}, '\n').Rets([]Text(nil)),
    97  		Args(Text{red("lorem")}, '\n').Rets([]Text{{red("lorem")}}),
    98  		Args(Text{red("lorem"), blue("ipsum"), red("dolar")}, '\n').Rets(
    99  			[]Text{
   100  				{red("lorem"), blue("ipsum"), red("dolar")},
   101  			}),
   102  		Args(Text{red("lo\nrem")}, '\n').Rets([]Text{
   103  			{red("lo")}, {red("rem")},
   104  		}),
   105  		Args(Text{red("lo\nrem"), blue("ipsum")}, '\n').Rets(
   106  			[]Text{
   107  				{red("lo")},
   108  				{red("rem"), blue("ipsum")},
   109  			}),
   110  		Args(Text{red("lo\nrem"), blue("ip\nsum")}, '\n').Rets(
   111  			[]Text{
   112  				{red("lo")},
   113  				{red("rem"), blue("ip")},
   114  				{blue("sum")},
   115  			}),
   116  		Args(Text{red("lo\nrem"), blue("ip\ns\num"), red("dolar")}, '\n').Rets(
   117  			[]Text{
   118  				{red("lo")},
   119  				{red("rem"), blue("ip")},
   120  				{blue("s")},
   121  				{blue("um"), red("dolar")},
   122  			}),
   123  	})
   124  }
   125  
   126  func TestTrimWcwidth(t *testing.T) {
   127  	tt.Test(t, tt.Fn("Text.TrimWcwidth", Text.TrimWcwidth), tt.Table{
   128  		Args(Text{}, 1).Rets(Text(nil)),
   129  		Args(Text{red("lorem")}, 3).Rets(Text{red("lor")}),
   130  		Args(Text{red("lorem"), blue("ipsum")}, 6).Rets(
   131  			Text{red("lorem"), blue("i")}),
   132  		Args(Text{red("你好")}, 3).Rets(Text{red("你")}),
   133  		Args(Text{red("你好"), blue("精灵语"), red("x")}, 7).Rets(
   134  			Text{red("你好"), blue("精")}),
   135  	})
   136  }
   137  
   138  type textVTStringTest struct {
   139  	text         Text
   140  	wantVTString string
   141  }
   142  
   143  func testTextVTString(t *testing.T, tests []textVTStringTest) {
   144  	for _, test := range tests {
   145  		vtString := test.text.VTString()
   146  		if vtString != test.wantVTString {
   147  			t.Errorf("got %q, want %q", vtString, test.wantVTString)
   148  		}
   149  	}
   150  }