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);
+    }
 }