text: fix a wrapping bug leading to line longer than they should

Michael Muré created

Change summary

termui/show_bug.go     |  4 ++--
util/text/text.go      |  2 +-
util/text/text_test.go | 34 +++++++++++++++++++++++++++++++++-
3 files changed, 36 insertions(+), 4 deletions(-)

Detailed changes

termui/show_bug.go 🔗

@@ -241,7 +241,7 @@ func (sb *showBug) renderMain(g *gocui.Gui, mainView *gocui.View) error {
 
 		case *bug.CreateTimelineItem:
 			create := op.(*bug.CreateTimelineItem)
-			content, lines := text.WrapLeftPadded(create.Message, maxX, 4)
+			content, lines := text.WrapLeftPadded(create.Message, maxX-1, 4)
 
 			v, err := sb.createOpView(g, viewName, x0, y0, maxX+1, lines, true)
 			if err != nil {
@@ -258,7 +258,7 @@ func (sb *showBug) renderMain(g *gocui.Gui, mainView *gocui.View) error {
 				edited = " (edited)"
 			}
 
-			message, _ := text.WrapLeftPadded(comment.Message, maxX, 4)
+			message, _ := text.WrapLeftPadded(comment.Message, maxX-1, 4)
 			content := fmt.Sprintf("%s commented on %s%s\n\n%s",
 				colors.Magenta(comment.Author.DisplayName()),
 				comment.CreatedAt.Time().Format(timeLayout),

util/text/text.go 🔗

@@ -84,7 +84,7 @@ func WrapLeftPadded(text string, lineWidth int, leftPad int) (string, int) {
 					lineBuffer.Reset()
 					lineBuffer.WriteString(word)
 					firstWord = false
-					spaceLeft = lineWidth - wordLength
+					spaceLeft = lineWidth - leftPad - wordLength
 					nbLine++
 				}
 			}

util/text/text_test.go 🔗

@@ -106,7 +106,7 @@ func TestWrap(t *testing.T) {
 	for i, tc := range cases {
 		actual, lines := Wrap(tc.Input, tc.Lim)
 		if actual != tc.Output {
-			t.Fatalf("Case %d Input:\n\n`%s`\n\nExpected Output:\n\n`%s`\n\nActual Output:\n\n`%s`",
+			t.Fatalf("Case %d Input:\n\n`%s`\n\nExpected Output:\n\n`%s`\n\nActual Output:\n`\n%s`",
 				i, tc.Input, tc.Output, actual)
 		}
 
@@ -118,6 +118,38 @@ func TestWrap(t *testing.T) {
 	}
 }
 
+func TestWrapLeftPadded(t *testing.T) {
+	cases := []struct {
+		input, output string
+		lim, pad      int
+	}{
+		{
+			"The Lorem ipsum text is typically composed of pseudo-Latin words. It is commonly used as placeholder text to examine or demonstrate the visual effects of various graphic design.",
+			`    The Lorem ipsum text is typically composed of
+		pseudo-Latin words. It is commonly used as placeholder
+		text to examine or demonstrate the visual effects of
+		various graphic design.`,
+			59, 4,
+		},
+	}
+
+	for i, tc := range cases {
+		actual, lines := WrapLeftPadded(tc.input, tc.lim, tc.pad)
+		if actual != tc.output {
+			t.Fatalf("Case %d Input:\n\n`%s`\n\nExpected Output:\n`\n%s`\n\nActual Output:\n`\n%s\n%s`",
+				i, tc.input, tc.output,
+				"|"+strings.Repeat("-", tc.lim-2)+"|",
+				actual)
+		}
+
+		expected := len(strings.Split(tc.output, "\n"))
+		if expected != lines {
+			t.Fatalf("Case %d Nb lines mismatch\nExpected:%d\nActual:%d",
+				i, expected, lines)
+		}
+	}
+}
+
 func TestWordLen(t *testing.T) {
 	cases := []struct {
 		Input  string