fix: pad short rows in SetRows to the number of columns

SetRows stored rows with fewer cells than the header unchanged, so short
rows rendered fmt's %!s(MISSING) verb and an empty row combined with a
first-column formatter panicked on vals[0]. Pad short rows to the column
count, mirroring AddRow's documented behavior of rendering missing cells
as empty.
This commit is contained in:
dualfroz committed 2026-09-10 16:42:05 +02:00
1 parent 46b76d9bbe
commit b384e08abf
2 files changed
+32 -2

No files matched your search

+5 -2
View File
@@ -238,10 +238,13 @@ func (t *table) SetRows(rows [][]string) Table {
headerLength := len(t.header)
for _, row := range rows {
if len(row) > headerLength {
if len(row) >= headerLength {
t.rows = append(t.rows, row[:headerLength])
} else {
t.rows = append(t.rows, row)
// pad short rows so every column is rendered, matching AddRow
padded := make([]string, headerLength)
copy(padded, row)
t.rows = append(t.rows, padded)
}
}
+27
View File
@@ -309,3 +309,30 @@ func TestTable_WithWidthFunc(t *testing.T) {
assert.Contains(t, actual, "请求 alpha")
assert.Contains(t, actual, "abc beta")
}
func TestSetRowsShortRowsPadded(t *testing.T) {
// SetRows must pad short rows like AddRow, not emit %!s(MISSING).
buf := &bytes.Buffer{}
tbl := New("A", "B", "C").WithWriter(buf).WithPadding(1)
tbl.SetRows([][]string{{"x", "y"}})
tbl.Print()
out := buf.String()
if strings.Contains(out, "MISSING") {
t.Fatalf("output contains missing-arg verb: %q", out)
}
assert.Equal(t, "A B C \nx y \n", out)
}
func TestSetRowsEmptyRowWithFirstColumnFormatter(t *testing.T) {
// An empty row must not panic when a first-column formatter is set.
buf := &bytes.Buffer{}
tbl := New("A", "B").WithWriter(buf).WithPadding(1).
WithFirstColumnFormatter(func(f string, v ...interface{}) string {
return fmt.Sprintf(f, v...)
})
assert.NotPanics(t, func() {
tbl.SetRows([][]string{{}})
tbl.Print()
})
}