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 }