diff --git a/src/Spectre.Console.Tests/Unit/Composition/GridTests.cs b/src/Spectre.Console.Tests/Unit/Composition/GridTests.cs index 4368afd..8adf0fc 100644 --- a/src/Spectre.Console.Tests/Unit/Composition/GridTests.cs +++ b/src/Spectre.Console.Tests/Unit/Composition/GridTests.cs @@ -6,6 +6,25 @@ namespace Spectre.Console.Tests.Unit.Composition { public sealed class GridTests { + public sealed class TheAddColumnMethod + { + [Fact] + public void Should_Throw_If_Rows_Are_Not_Empty() + { + // Given + var grid = new Grid(); + grid.AddColumn(); + grid.AddRow("Hello World!"); + + // When + var result = Record.Exception(() => grid.AddColumn()); + + // Then + result.ShouldBeOfType() + .Message.ShouldBe("Cannot add new columns to grid with existing rows."); + } + } + public sealed class TheAddRowMethod { [Fact] @@ -54,6 +73,30 @@ namespace Spectre.Console.Tests.Unit.Composition } } + public sealed class TheAddEmptyRowMethod + { + [Fact] + public void Should_Add_Empty_Row() + { + // Given + var console = new PlainConsole(width: 80); + var grid = new Grid(); + grid.AddColumns(2); + grid.AddRow("Foo", "Bar"); + grid.AddEmptyRow(); + grid.AddRow("Qux", "Corgi"); + + // When + console.Render(grid); + + // Then + console.Lines.Count.ShouldBe(3); + console.Lines[0].ShouldBe("Foo Bar "); + console.Lines[1].ShouldBe(" "); + console.Lines[2].ShouldBe("Qux Corgi"); + } + } + [Fact] public void Should_Render_Grid_Correctly() { diff --git a/src/Spectre.Console.Tests/Unit/Composition/TableTests.cs b/src/Spectre.Console.Tests/Unit/Composition/TableTests.cs index 2be64cb..02acd26 100644 --- a/src/Spectre.Console.Tests/Unit/Composition/TableTests.cs +++ b/src/Spectre.Console.Tests/Unit/Composition/TableTests.cs @@ -21,6 +21,22 @@ namespace Spectre.Console.Tests.Unit.Composition result.ShouldBeOfType() .ParamName.ShouldBe("column"); } + + [Fact] + public void Should_Throw_If_Rows_Are_Not_Empty() + { + // Given + var grid = new Table(); + grid.AddColumn("Foo"); + grid.AddRow("Hello World"); + + // When + var result = Record.Exception(() => grid.AddColumn("Bar")); + + // Then + result.ShouldBeOfType() + .Message.ShouldBe("Cannot add new columns to table with existing rows."); + } } public sealed class TheAddColumnsMethod @@ -88,6 +104,34 @@ namespace Spectre.Console.Tests.Unit.Composition } } + public sealed class TheAddEmptyRowMethod + { + [Fact] + public void Should_Render_Table_Correctly() + { + // Given + var console = new PlainConsole(width: 80); + var table = new Table(); + table.AddColumns("Foo", "Bar", "Baz"); + table.AddRow("Qux", "Corgi", "Waldo"); + table.AddEmptyRow(); + table.AddRow("Grault", "Garply", "Fred"); + + // When + console.Render(table); + + // Then + console.Lines.Count.ShouldBe(7); + console.Lines[0].ShouldBe("┌────────┬────────┬───────┐"); + console.Lines[1].ShouldBe("│ Foo │ Bar │ Baz │"); + console.Lines[2].ShouldBe("├────────┼────────┼───────┤"); + console.Lines[3].ShouldBe("│ Qux │ Corgi │ Waldo │"); + console.Lines[4].ShouldBe("│ │ │ │"); + console.Lines[5].ShouldBe("│ Grault │ Garply │ Fred │"); + console.Lines[6].ShouldBe("└────────┴────────┴───────┘"); + } + } + [Fact] public void Should_Render_Table_Correctly() { diff --git a/src/Spectre.Console/Composition/Grid.cs b/src/Spectre.Console/Composition/Grid.cs index e688b25..ff1bfaf 100644 --- a/src/Spectre.Console/Composition/Grid.cs +++ b/src/Spectre.Console/Composition/Grid.cs @@ -1,6 +1,8 @@ using System; using System.Collections.Generic; +using System.Linq; using Spectre.Console.Composition; +using Spectre.Console.Internal; namespace Spectre.Console { @@ -56,6 +58,11 @@ namespace Spectre.Console throw new ArgumentNullException(nameof(column)); } + if (_table.RowCount > 0) + { + throw new InvalidOperationException("Cannot add new columns to grid with existing rows."); + } + // Only pad the most right cell if we've explicitly set a padding. _table.PadRightCell = column.Padding != null; @@ -97,6 +104,16 @@ namespace Spectre.Console } } + /// + /// Adds an empty row to the grid. + /// + public void AddEmptyRow() + { + var columns = new string[_table.ColumnCount]; + Enumerable.Range(0, _table.ColumnCount).ForEach(index => columns[index] = string.Empty); + AddRow(columns); + } + /// /// Adds a new row to the grid. /// diff --git a/src/Spectre.Console/Composition/Table.cs b/src/Spectre.Console/Composition/Table.cs index 45f6b26..71179d3 100644 --- a/src/Spectre.Console/Composition/Table.cs +++ b/src/Spectre.Console/Composition/Table.cs @@ -81,7 +81,7 @@ namespace Spectre.Console throw new ArgumentNullException(nameof(column)); } - _columns.Add(new TableColumn(column)); + AddColumn(new TableColumn(column)); } /// @@ -95,6 +95,11 @@ namespace Spectre.Console throw new ArgumentNullException(nameof(column)); } + if (_rows.Count > 0) + { + throw new InvalidOperationException("Cannot add new columns to table with existing rows."); + } + _columns.Add(column); } @@ -109,7 +114,10 @@ namespace Spectre.Console throw new ArgumentNullException(nameof(columns)); } - _columns.AddRange(columns.Select(column => new TableColumn(column))); + foreach (var column in columns) + { + AddColumn(column); + } } /// @@ -123,7 +131,20 @@ namespace Spectre.Console throw new ArgumentNullException(nameof(columns)); } - _columns.AddRange(columns.Select(column => column)); + foreach (var column in columns) + { + AddColumn(column); + } + } + + /// + /// Adds an empty row to the table. + /// + public void AddEmptyRow() + { + var columns = new string[ColumnCount]; + Enumerable.Range(0, ColumnCount).ForEach(index => columns[index] = string.Empty); + AddRow(columns); } ///