src.elv.sh@v0.21.0-dev.0.20240515223629-06979efb9a2a/pkg/ui/text_test.go (about) 1 package ui 2 3 import ( 4 "errors" 5 "testing" 6 7 "src.elv.sh/pkg/eval/vals" 8 "src.elv.sh/pkg/tt" 9 ) 10 11 func TestT(t *testing.T) { 12 tt.Test(t, T, 13 Args("test").Rets(Text{&Segment{Text: "test"}}), 14 Args("test red", FgRed).Rets(Text{&Segment{ 15 Text: "test red", Style: Style{Fg: Red}}}), 16 Args("test red", FgRed, Bold).Rets(Text{&Segment{ 17 Text: "test red", Style: Style{Fg: Red, Bold: true}}}), 18 ) 19 } 20 21 func TestConcat(t *testing.T) { 22 tt.Test(t, Concat, 23 Args().Rets(Text(nil)), 24 Args(T("red", FgRed), T("blue", FgBlue), T("green", FgGreen)). 25 Rets(Text{red("red"), blue("blue"), green("green")}), 26 // Merging adjacent segments with the same style 27 Args(T("red", FgRed), T("red", FgRed)).Rets(T("redred", FgRed)), 28 // Concatenating texts with multiple segments 29 Args(Concat(T("red", FgRed), T("blue", FgBlue)), 30 Concat(T("blue", FgBlue), T("green", FgGreen))). 31 Rets(Text{red("red"), blue("blueblue"), green("green")}), 32 // Concatenating empty texts 33 Args(T(""), T("red", FgRed), T("")).Rets(T("red", FgRed)), 34 ) 35 } 36 37 func TestTextAsElvishValue(t *testing.T) { 38 vals.TestValue(t, T("text")). 39 Kind("ui:text"). 40 Repr("[^styled text]"). 41 AllKeys("0"). 42 Index("0", &Segment{Text: "text"}). 43 IndexError("a", errors.New("index must be integer")) 44 45 vals.TestValue(t, Concat(T("red", FgRed), T("blue", FgBlue), T("green", FgGreen))). 46 Index("0..2", Concat(T("red", FgRed), T("blue", FgBlue))) 47 48 vals.TestValue(t, T("text", FgRed)). 49 Repr("[^styled (styled-segment text &fg-color=red)]") 50 vals.TestValue(t, T("text", Bold)). 51 Repr("[^styled (styled-segment text &bold)]") 52 } 53 54 var ( 55 text0 = Text{} 56 text1 = Text{red("lorem")} 57 text2 = Text{red("lorem"), blue("foobar")} 58 ) 59 60 var partitionTests = []*tt.Case{ 61 Args(text0).Rets([]Text{nil}), 62 Args(text1).Rets([]Text{text1}), 63 Args(text1, 0).Rets([]Text{nil, text1}), 64 Args(text1, 1).Rets([]Text{{red("l")}, {red("orem")}}), 65 Args(text1, 5).Rets([]Text{text1, nil}), 66 Args(text2).Rets([]Text{text2}), 67 Args(text2, 0).Rets([]Text{nil, text2}), 68 Args(text2, 1).Rets([]Text{ 69 {red("l")}, {red("orem"), blue("foobar")}}), 70 Args(text2, 2).Rets([]Text{ 71 {red("lo")}, {red("rem"), blue("foobar")}}), 72 Args(text2, 5).Rets([]Text{{red("lorem")}, {blue("foobar")}}), 73 Args(text2, 6).Rets([]Text{ 74 {red("lorem"), blue("f")}, {blue("oobar")}}), 75 Args(text2, 11).Rets([]Text{text2, nil}), 76 77 Args(text1, 1, 2).Rets([]Text{{red("l")}, {red("o")}, {red("rem")}}), 78 Args(text1, 1, 2, 3, 4).Rets([]Text{ 79 {red("l")}, {red("o")}, {red("r")}, {red("e")}, {red("m")}}), 80 Args(text2, 2, 4, 6).Rets([]Text{ 81 {red("lo")}, {red("re")}, 82 {red("m"), blue("f")}, {blue("oobar")}}), 83 Args(text2, 6, 8).Rets([]Text{ 84 {red("lorem"), blue("f")}, {blue("oo")}, {blue("bar")}}), 85 } 86 87 func TestPartition(t *testing.T) { 88 tt.Test(t, tt.Fn(Text.Partition).Named("Text.Partition"), partitionTests...) 89 } 90 91 func TestCountRune(t *testing.T) { 92 text := Text{red("lorem"), blue("ipsum")} 93 tt.Test(t, tt.Fn(Text.CountRune).Named("Text.CountRune"), 94 Args(text, 'l').Rets(1), 95 Args(text, 'i').Rets(1), 96 Args(text, 'm').Rets(2), 97 Args(text, '\n').Rets(0), 98 ) 99 } 100 101 func TestCountLines(t *testing.T) { 102 tt.Test(t, tt.Fn(Text.CountLines).Named("Text.CountLines"), 103 Args(Text{red("lorem")}).Rets(1), 104 Args(Text{red("lorem"), blue("ipsum")}).Rets(1), 105 Args(Text{red("lor\nem"), blue("ipsum")}).Rets(2), 106 Args(Text{red("lor\nem"), blue("ip\nsum")}).Rets(3), 107 ) 108 } 109 110 func TestSplitByRune(t *testing.T) { 111 tt.Test(t, tt.Fn(Text.SplitByRune).Named("Text.SplitByRune"), 112 Args(Text{}, '\n').Rets([]Text(nil)), 113 Args(Text{red("lorem")}, '\n').Rets([]Text{{red("lorem")}}), 114 Args(Text{red("lorem"), blue("ipsum"), red("dolar")}, '\n').Rets( 115 []Text{ 116 {red("lorem"), blue("ipsum"), red("dolar")}, 117 }), 118 Args(Text{red("lo\nrem")}, '\n').Rets([]Text{ 119 {red("lo")}, {red("rem")}, 120 }), 121 Args(Text{red("lo\nrem"), blue("ipsum")}, '\n').Rets( 122 []Text{ 123 {red("lo")}, 124 {red("rem"), blue("ipsum")}, 125 }), 126 Args(Text{red("lo\nrem"), blue("ip\nsum")}, '\n').Rets( 127 []Text{ 128 {red("lo")}, 129 {red("rem"), blue("ip")}, 130 {blue("sum")}, 131 }), 132 Args(Text{red("lo\nrem"), blue("ip\ns\num"), red("dolar")}, '\n').Rets( 133 []Text{ 134 {red("lo")}, 135 {red("rem"), blue("ip")}, 136 {blue("s")}, 137 {blue("um"), red("dolar")}, 138 }), 139 Args(Text{red("lorem\n")}, '\n').Rets( 140 []Text{ 141 {red("lorem")}, 142 nil, 143 }), 144 ) 145 } 146 147 func TestTrimWcwidth(t *testing.T) { 148 tt.Test(t, tt.Fn(Text.TrimWcwidth).Named("Text.TrimWcwidth"), 149 Args(Text{}, 1).Rets(Text(nil)), 150 Args(Text{red("lorem")}, 3).Rets(Text{red("lor")}), 151 Args(Text{red("lorem"), blue("ipsum")}, 6).Rets( 152 Text{red("lorem"), blue("i")}), 153 Args(Text{red("你好")}, 3).Rets(Text{red("你")}), 154 Args(Text{red("你好"), blue("精灵语"), red("x")}, 7).Rets( 155 Text{red("你好"), blue("精")}), 156 ) 157 } 158 159 type textVTStringTest struct { 160 text Text 161 wantVTString string 162 } 163 164 func testTextVTString(t *testing.T, tests []textVTStringTest) { 165 t.Helper() 166 for _, test := range tests { 167 vtString := test.text.VTString() 168 if vtString != test.wantVTString { 169 t.Errorf("got %q, want %q", vtString, test.wantVTString) 170 } 171 } 172 } 173 174 func red(s string) *Segment { return &Segment{Style{Fg: Red}, s} } 175 func blue(s string) *Segment { return &Segment{Style{Fg: Blue}, s} } 176 func green(s string) *Segment { return &Segment{Style{Fg: Green}, s} }