1package ui
2
3import (
4 "strings"
5 "testing"
6)
7
8func assertSplitPoints(t *testing.T, body string, expected []point) {
9 l := Line{Body: PlainString(body)}
10 l.computeSplitPoints(nil)
11
12 if len(l.splitPoints) != len(expected) {
13 t.Errorf("%q: expected %d split points got %d", body, len(expected), len(l.splitPoints))
14 return
15 }
16
17 for i := 0; i < len(expected); i++ {
18 e := expected[i]
19 a := l.splitPoints[i]
20
21 if e.X != a.X {
22 t.Errorf("%q, point #%d: expected X=%d got %d", body, i, e.X, a.X)
23 }
24 if e.I != a.I {
25 t.Errorf("%q, point #%d: expected I=%d got %d", body, i, e.I, a.I)
26 }
27 if e.Split != a.Split {
28 t.Errorf("%q, point #%d: expected Split=%t got %t", body, i, e.Split, a.Split)
29 }
30 }
31}
32
33func TestLineSplitPoints(t *testing.T) {
34 assertSplitPoints(t, "hello", []point{
35 {X: 0, I: 0, Split: false},
36 {X: 5, I: 5, Split: true},
37 })
38 assertSplitPoints(t, "hello world", []point{
39 {X: 0, I: 0, Split: false},
40 {X: 5, I: 5, Split: true},
41 {X: 6, I: 6, Split: false},
42 {X: 11, I: 11, Split: true},
43 })
44 assertSplitPoints(t, "lorem ipsum dolor shit amet", []point{
45 {X: 0, I: 0, Split: false},
46 {X: 5, I: 5, Split: true},
47 {X: 6, I: 6, Split: false},
48 {X: 11, I: 11, Split: true},
49 {X: 12, I: 12, Split: false},
50 {X: 17, I: 17, Split: true},
51 {X: 18, I: 18, Split: false},
52 {X: 22, I: 22, Split: true},
53 {X: 23, I: 23, Split: false},
54 {X: 27, I: 27, Split: true},
55 })
56}
57
58func showSplit(s string, nls []int) string {
59 var sb strings.Builder
60 sb.Grow(len(s) + len(nls))
61
62 for i, r := range s {
63 if 0 < len(nls) && i == nls[0] {
64 sb.WriteRune('|')
65 nls = nls[1:]
66 }
67 sb.WriteRune(r)
68 }
69
70 return sb.String()
71}
72
73func assertNewLines(t *testing.T, body string, width int, expected int) {
74 l := Line{Body: PlainString(body)}
75 l.computeSplitPoints(nil)
76
77 actual := l.NewLines(nil, width)
78
79 if len(actual)+1 != expected {
80 s := showSplit(body, actual)
81 t.Errorf("%q with width=%d expected to take %d lines, takes %d: '%s' (%v)", body, width, expected, len(actual)+1, s, actual)
82 return
83 }
84}
85
86func TestRenderedHeight(t *testing.T) {
87 assertNewLines(t, "0123456789", 1, 10)
88 assertNewLines(t, "0123456789", 2, 5)
89 assertNewLines(t, "0123456789", 3, 4)
90 assertNewLines(t, "0123456789", 4, 3)
91 assertNewLines(t, "0123456789", 5, 2)
92 assertNewLines(t, "0123456789", 6, 2)
93 assertNewLines(t, "0123456789", 7, 2)
94 assertNewLines(t, "0123456789", 8, 2)
95 assertNewLines(t, "0123456789", 9, 2)
96 assertNewLines(t, "0123456789", 10, 1)
97 assertNewLines(t, "0123456789", 11, 1)
98
99 // LEN=9, WIDTH=9
100 assertNewLines(t, "take care", 1, 8) // |t|a|k|e|c|a|r|e|
101 assertNewLines(t, "take care", 2, 4) // |ta|ke|ca|re|
102 assertNewLines(t, "take care", 3, 3) // |tak|e c|are|
103 assertNewLines(t, "take care", 4, 2) // |take|care|
104 assertNewLines(t, "take care", 5, 2) // |take |care |
105 assertNewLines(t, "take care", 6, 2) // |take |care |
106 assertNewLines(t, "take care", 7, 2) // |take |care |
107 assertNewLines(t, "take care", 8, 2) // |take |care |
108 assertNewLines(t, "take care", 9, 1) // |take care|
109 assertNewLines(t, "take care", 10, 1) // |take care |
110
111 // LEN=10, WIDTH=10
112 assertNewLines(t, "take care", 1, 8) // |t|a|k|e|c|a|r|e|
113 assertNewLines(t, "take care", 2, 4) // |ta|ke|ca|re|
114 assertNewLines(t, "take care", 3, 4) // |tak|e |car|e |
115 assertNewLines(t, "take care", 4, 2) // |take|care|
116 assertNewLines(t, "take care", 5, 2) // |take |care |
117 assertNewLines(t, "take care", 6, 2) // |take |care |
118 assertNewLines(t, "take care", 7, 2) // |take |care |
119 assertNewLines(t, "take care", 8, 2) // |take |care |
120 assertNewLines(t, "take care", 9, 2) // |take |care |
121 assertNewLines(t, "take care", 10, 1) // |take care|
122 assertNewLines(t, "take care", 11, 1) // |take care |
123
124 // LEN=16, WIDTH=16
125 assertNewLines(t, "have a good day!", 1, 13) // |h|a|v|e|a|g|o|o|d|d|a|y|!|
126 assertNewLines(t, "have a good day!", 2, 7) // |ha|ve|a |go|od|da|y!|
127 assertNewLines(t, "have a good day!", 3, 5) // |hav|e a|goo|d d|ay!|
128 assertNewLines(t, "have a good day!", 4, 4) // |have|a |good|day!|
129 assertNewLines(t, "have a good day!", 5, 4) // |have |a |good |day! |
130 assertNewLines(t, "have a good day!", 6, 3) // |have a|good |day! |
131 assertNewLines(t, "have a good day!", 7, 3) // |have a |good |day! |
132 assertNewLines(t, "have a good day!", 8, 3) // |have a |good |day! |
133 assertNewLines(t, "have a good day!", 9, 2) // |have a |good day!|
134 assertNewLines(t, "have a good day!", 10, 2) // |have a |good day! |
135 assertNewLines(t, "have a good day!", 11, 2) // |have a good|day! |
136 assertNewLines(t, "have a good day!", 12, 2) // |have a good |day! |
137 assertNewLines(t, "have a good day!", 13, 2) // |have a good |day! |
138 assertNewLines(t, "have a good day!", 14, 2) // |have a good |day! |
139 assertNewLines(t, "have a good day!", 15, 2) // |have a good |day! |
140 assertNewLines(t, "have a good day!", 16, 1) // |have a good day!|
141 assertNewLines(t, "have a good day!", 17, 1) // |have a good day! |
142
143 assertNewLines(t, "cc en direct du word wrapping des familles le tests ça v a va va v a va", 46, 2)
144
145 assertNewLines(t, "take cares", 5, 2) // |take |cares|
146 assertNewLines(t, "tak cares", 5, 2) // |tak |cares|
147}