mirror of
https://github.com/nsnail/spectre.console.git
synced 2025-04-16 17:02:51 +08:00
parent
3847a8949f
commit
b197f278ed
96
src/Spectre.Console.Tests/Unit/RowsTests.cs
Normal file
96
src/Spectre.Console.Tests/Unit/RowsTests.cs
Normal file
@ -0,0 +1,96 @@
|
|||||||
|
using Shouldly;
|
||||||
|
using Spectre.Console.Rendering;
|
||||||
|
using Xunit;
|
||||||
|
|
||||||
|
namespace Spectre.Console.Tests.Unit
|
||||||
|
{
|
||||||
|
public sealed class RowsTests
|
||||||
|
{
|
||||||
|
[Fact]
|
||||||
|
public void Should_Render_Rows()
|
||||||
|
{
|
||||||
|
// Given
|
||||||
|
var console = new PlainConsole(width: 60);
|
||||||
|
var rows = new Rows(
|
||||||
|
new IRenderable[]
|
||||||
|
{
|
||||||
|
new Markup("Hello"),
|
||||||
|
new Table()
|
||||||
|
.AddColumns("Foo", "Bar")
|
||||||
|
.AddRow("Baz", "Qux"),
|
||||||
|
new Markup("World"),
|
||||||
|
});
|
||||||
|
|
||||||
|
// When
|
||||||
|
console.Render(rows);
|
||||||
|
|
||||||
|
// Then
|
||||||
|
console.Lines.Count.ShouldBe(7);
|
||||||
|
console.Lines[0].ShouldBe("Hello");
|
||||||
|
console.Lines[1].ShouldBe("┌─────┬─────┐");
|
||||||
|
console.Lines[2].ShouldBe("│ Foo │ Bar │");
|
||||||
|
console.Lines[3].ShouldBe("├─────┼─────┤");
|
||||||
|
console.Lines[4].ShouldBe("│ Baz │ Qux │");
|
||||||
|
console.Lines[5].ShouldBe("└─────┴─────┘");
|
||||||
|
console.Lines[6].ShouldBe("World");
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void Should_Render_Rows_Correctly_Inside_Other_Widget()
|
||||||
|
{
|
||||||
|
// Given
|
||||||
|
var console = new PlainConsole(width: 60);
|
||||||
|
var table = new Table()
|
||||||
|
.AddColumns("Foo", "Bar")
|
||||||
|
.AddRow("HELLO WORLD")
|
||||||
|
.AddRow(
|
||||||
|
new Rows(new IRenderable[]
|
||||||
|
{
|
||||||
|
new Markup("Hello"),
|
||||||
|
new Markup("World"),
|
||||||
|
}), new Text("Qux"));
|
||||||
|
|
||||||
|
// When
|
||||||
|
console.Render(table);
|
||||||
|
|
||||||
|
// Then
|
||||||
|
console.Lines.Count.ShouldBe(7);
|
||||||
|
console.Lines[0].ShouldBe("┌─────────────┬─────┐");
|
||||||
|
console.Lines[1].ShouldBe("│ Foo │ Bar │");
|
||||||
|
console.Lines[2].ShouldBe("├─────────────┼─────┤");
|
||||||
|
console.Lines[3].ShouldBe("│ HELLO WORLD │ │");
|
||||||
|
console.Lines[4].ShouldBe("│ Hello │ Qux │");
|
||||||
|
console.Lines[5].ShouldBe("│ World │ │");
|
||||||
|
console.Lines[6].ShouldBe("└─────────────┴─────┘");
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void Should_Render_Rows_Correctly_Inside_Other_Widget_When_Expanded()
|
||||||
|
{
|
||||||
|
// Given
|
||||||
|
var console = new PlainConsole(width: 60);
|
||||||
|
var table = new Table()
|
||||||
|
.AddColumns("Foo", "Bar")
|
||||||
|
.AddRow("HELLO WORLD")
|
||||||
|
.AddRow(
|
||||||
|
new Rows(new IRenderable[]
|
||||||
|
{
|
||||||
|
new Markup("Hello"),
|
||||||
|
new Markup("World"),
|
||||||
|
}).Expand(), new Text("Qux"));
|
||||||
|
|
||||||
|
// When
|
||||||
|
console.Render(table);
|
||||||
|
|
||||||
|
// Then
|
||||||
|
console.Lines.Count.ShouldBe(7);
|
||||||
|
console.Lines[0].ShouldBe("┌────────────────────────────────────────────────────┬─────┐");
|
||||||
|
console.Lines[1].ShouldBe("│ Foo │ Bar │");
|
||||||
|
console.Lines[2].ShouldBe("├────────────────────────────────────────────────────┼─────┤");
|
||||||
|
console.Lines[3].ShouldBe("│ HELLO WORLD │ │");
|
||||||
|
console.Lines[4].ShouldBe("│ Hello │ Qux │");
|
||||||
|
console.Lines[5].ShouldBe("│ World │ │");
|
||||||
|
console.Lines[6].ShouldBe("└────────────────────────────────────────────────────┴─────┘");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
65
src/Spectre.Console/Widgets/Rows.cs
Normal file
65
src/Spectre.Console/Widgets/Rows.cs
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using Spectre.Console.Internal;
|
||||||
|
using Spectre.Console.Rendering;
|
||||||
|
|
||||||
|
namespace Spectre.Console
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Renders things in rows.
|
||||||
|
/// </summary>
|
||||||
|
public sealed class Rows : Renderable, IExpandable
|
||||||
|
{
|
||||||
|
private readonly List<IRenderable> _children;
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
|
public bool Expand { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Initializes a new instance of the <see cref="Rows"/> class.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="children">The children to render.</param>
|
||||||
|
public Rows(IEnumerable<IRenderable> children)
|
||||||
|
{
|
||||||
|
_children = new List<IRenderable>(children ?? throw new ArgumentNullException(nameof(children)));
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
|
protected override Measurement Measure(RenderContext context, int maxWidth)
|
||||||
|
{
|
||||||
|
if (Expand)
|
||||||
|
{
|
||||||
|
return new Measurement(maxWidth, maxWidth);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var measurements = _children.Select(c => c.Measure(context, maxWidth));
|
||||||
|
return new Measurement(
|
||||||
|
measurements.Min(c => c.Min),
|
||||||
|
measurements.Min(c => c.Max));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
|
protected override IEnumerable<Segment> Render(RenderContext context, int maxWidth)
|
||||||
|
{
|
||||||
|
foreach (var child in _children)
|
||||||
|
{
|
||||||
|
var segments = child.Render(context, maxWidth);
|
||||||
|
foreach (var (_, _, last, segment) in segments.Enumerate())
|
||||||
|
{
|
||||||
|
yield return segment;
|
||||||
|
|
||||||
|
if (last)
|
||||||
|
{
|
||||||
|
if (!segment.IsLineBreak)
|
||||||
|
{
|
||||||
|
yield return Segment.LineBreak;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user