From cec5fb459593d3ac84558287beabb07197aa706b Mon Sep 17 00:00:00 2001 From: Fraser Waters <frassle@gmail.com> Date: Tue, 12 Sep 2023 14:46:25 +0100 Subject: [PATCH] Render tables with zero-width columns (#1197) Fixes https://github.com/spectreconsole/spectre.console/issues/361 --- .../Widgets/Table/TableRenderer.cs | 6 +++--- .../Render_Empty_Column.Output.verified.txt | 6 ++++++ .../Unit/Widgets/Table/TableTests.cs | 18 ++++++++++++++++++ 3 files changed, 27 insertions(+), 3 deletions(-) create mode 100644 test/Spectre.Console.Tests/Expectations/Widgets/Table/Render_Empty_Column.Output.verified.txt diff --git a/src/Spectre.Console/Widgets/Table/TableRenderer.cs b/src/Spectre.Console/Widgets/Table/TableRenderer.cs index c6f44df..d27326e 100644 --- a/src/Spectre.Console/Widgets/Table/TableRenderer.cs +++ b/src/Spectre.Console/Widgets/Table/TableRenderer.cs @@ -8,7 +8,7 @@ internal static class TableRenderer public static List<Segment> Render(TableRendererContext context, List<int> columnWidths) { // Can't render the table? - if (context.TableWidth <= 0 || context.TableWidth > context.MaxWidth || columnWidths.Any(c => c <= 0)) + if (context.TableWidth <= 0 || context.TableWidth > context.MaxWidth || columnWidths.Any(c => c < 0)) { return new List<Segment>(new[] { new Segment("…", context.BorderStyle ?? Style.Plain) }); } @@ -23,12 +23,12 @@ internal static class TableRenderer // Get the list of cells for the row and calculate the cell height var cells = new List<List<SegmentLine>>(); - foreach (var (columnIndex, _, _, (rowWidth, cell)) in columnWidths.Zip(row).Enumerate()) + foreach (var (columnIndex, _, _, (columnWidth, cell)) in columnWidths.Zip(row).Enumerate()) { var justification = context.Columns[columnIndex].Alignment; var childContext = context.Options with { Justification = justification }; - var lines = Segment.SplitLines(cell.Render(childContext, rowWidth)); + var lines = Segment.SplitLines(cell.Render(childContext, columnWidth)); cellHeight = Math.Max(cellHeight, lines.Count); cells.Add(lines); } diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Table/Render_Empty_Column.Output.verified.txt b/test/Spectre.Console.Tests/Expectations/Widgets/Table/Render_Empty_Column.Output.verified.txt new file mode 100644 index 0000000..97dbe2f --- /dev/null +++ b/test/Spectre.Console.Tests/Expectations/Widgets/Table/Render_Empty_Column.Output.verified.txt @@ -0,0 +1,6 @@ +┌──┬───┐ +│ │ │ +├──┼───┤ +│ │ A │ +│ │ B │ +└──┴───┘ diff --git a/test/Spectre.Console.Tests/Unit/Widgets/Table/TableTests.cs b/test/Spectre.Console.Tests/Unit/Widgets/Table/TableTests.cs index a027658..a8fb908 100644 --- a/test/Spectre.Console.Tests/Unit/Widgets/Table/TableTests.cs +++ b/test/Spectre.Console.Tests/Unit/Widgets/Table/TableTests.cs @@ -573,4 +573,22 @@ public sealed class TableTests // Then return Verifier.Verify(console.Output); } + + [Fact] + [Expectation("Render_Empty_Column")] + public Task Should_Render_Empty_Column_Correctly() + { + // Given + var console = new TestConsole().Width(30); + var table = new Table(); + table.AddColumns(string.Empty, string.Empty); + table.AddRow(string.Empty, "A"); + table.AddRow(string.Empty, "B"); + + // When + console.Write(table); + + // Then + return Verifier.Verify(console.Output); + } }