From 20a2f727f724032880c7932ee5e6d7af3e162c81 Mon Sep 17 00:00:00 2001 From: BlazeFace Date: Tue, 9 Apr 2024 06:03:45 -0700 Subject: [PATCH 1/4] Updating test and Ratio calculation --- src/Spectre.Console/Internal/Ratio.cs | 15 +++++++-- src/Spectre.Console/Rendering/Segment.cs | 6 ++++ .../Unit/Widgets/LayoutTests.cs | 33 +++++++++++++++++++ 3 files changed, 52 insertions(+), 2 deletions(-) diff --git a/src/Spectre.Console/Internal/Ratio.cs b/src/Spectre.Console/Internal/Ratio.cs index fb38bdd3b..80059fc23 100644 --- a/src/Spectre.Console/Internal/Ratio.cs +++ b/src/Spectre.Console/Internal/Ratio.cs @@ -9,7 +9,17 @@ public static List Resolve(int total, IEnumerable edges) { static (int Div, float Mod) DivMod(float x, float y) { - return ((int)(x / y), x % y); + var (div, mod) = ((int)(x / y), x % y); + + // If remainder is withing .0001 of 1 then we round up + if (!(mod > 0.9999)) + { + return (div, mod); + } + + div++; + mod = 0; + return (div, mod); } static int? GetEdgeWidth(IRatioResolvable edge) @@ -46,7 +56,8 @@ public static List Resolve(int total, IEnumerable edges) .ToList(); } - var portion = (float)remaining / flexibleEdges.Sum(x => Math.Max(1, x.Edge.Ratio)); + var r = flexibleEdges.Sum(x => Math.Max(1, x.Edge.Ratio)); + var portion = (float)remaining / r; var invalidate = false; foreach (var (index, size, edge) in flexibleEdges) diff --git a/src/Spectre.Console/Rendering/Segment.cs b/src/Spectre.Console/Rendering/Segment.cs index 9f36a772c..6b11ca6e2 100644 --- a/src/Spectre.Console/Rendering/Segment.cs +++ b/src/Spectre.Console/Rendering/Segment.cs @@ -463,8 +463,14 @@ internal static IEnumerable Merge(IEnumerable segments) var result = new List(); var segmentBuilder = (SegmentBuilder?)null; + var c = 0; foreach (var segment in segments) { + if (c == 163) + { + System.Console.Write("test"); + } + c++; if (segmentBuilder == null) { segmentBuilder = new SegmentBuilder(segment); diff --git a/test/Spectre.Console.Tests/Unit/Widgets/LayoutTests.cs b/test/Spectre.Console.Tests/Unit/Widgets/LayoutTests.cs index 550922a97..b73cb67e9 100644 --- a/test/Spectre.Console.Tests/Unit/Widgets/LayoutTests.cs +++ b/test/Spectre.Console.Tests/Unit/Widgets/LayoutTests.cs @@ -264,4 +264,37 @@ public Task Should_Fall_Back_To_Parent_Layout_If_All_Children_Are_Invisible() // Then return Verifier.Verify(console.Output); } + + [Fact] + [Expectation("Render_Layout_With_Three_And_One_Columns")] + public Task Should_Render_Layout_With_Three_And_One_Columns() + { + // Given + var console = new TestConsole().Size(new Size(40, 17)); + var layout = new Layout(); + var col1 = new Layout(); + var col1Row1 = new Layout(); + var col1Row2 = new Layout(); + var col1Row3 = new Layout(); + + col1.SplitRows(col1Row1, col1Row2, col1Row3); + + var col2 = new Layout(); + + layout.SplitColumns(col1, col2); + + var panel = new Panel("Hello, World!") { Expand = true }; + + List layouts = [col1Row1, col1Row2, col1Row3, col2]; + foreach (var l in layouts) + { + l.Update(panel); + } + + // When + console.Write(layout); + + // Then + return Verifier.Verify(console.Output); + } } From 4f22f5b7c37681904a9e1e3c20fbb8a87e95d381 Mon Sep 17 00:00:00 2001 From: BlazeFace Date: Sat, 13 Apr 2024 17:19:19 -0700 Subject: [PATCH 2/4] Add Reference File --- ...th_Three_And_One_Columns.Output.verified.txt | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 test/Spectre.Console.Tests/Expectations/Widgets/Layout/Render_Layout_With_Three_And_One_Columns.Output.verified.txt diff --git a/test/Spectre.Console.Tests/Expectations/Widgets/Layout/Render_Layout_With_Three_And_One_Columns.Output.verified.txt b/test/Spectre.Console.Tests/Expectations/Widgets/Layout/Render_Layout_With_Three_And_One_Columns.Output.verified.txt new file mode 100644 index 000000000..1a64de78d --- /dev/null +++ b/test/Spectre.Console.Tests/Expectations/Widgets/Layout/Render_Layout_With_Three_And_One_Columns.Output.verified.txt @@ -0,0 +1,17 @@ +┌──────────────────┐┌──────────────────┐ +│ Hello, World! ││ Hello, World! │ +│ ││ │ +│ ││ │ +└──────────────────┘│ │ +┌──────────────────┐│ │ +│ Hello, World! ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +└──────────────────┘│ │ +┌──────────────────┐│ │ +│ Hello, World! ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +└──────────────────┘└──────────────────┘ \ No newline at end of file From a62e79992b3ef44b99cb5217abd19d44f96c360e Mon Sep 17 00:00:00 2001 From: BlazeFace Date: Sat, 13 Apr 2024 17:20:12 -0700 Subject: [PATCH 3/4] Undo debug changes --- src/Spectre.Console/Rendering/Segment.cs | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/Spectre.Console/Rendering/Segment.cs b/src/Spectre.Console/Rendering/Segment.cs index 6b11ca6e2..9f36a772c 100644 --- a/src/Spectre.Console/Rendering/Segment.cs +++ b/src/Spectre.Console/Rendering/Segment.cs @@ -463,14 +463,8 @@ internal static IEnumerable Merge(IEnumerable segments) var result = new List(); var segmentBuilder = (SegmentBuilder?)null; - var c = 0; foreach (var segment in segments) { - if (c == 163) - { - System.Console.Write("test"); - } - c++; if (segmentBuilder == null) { segmentBuilder = new SegmentBuilder(segment); From d52d14e848a88e1eac6b1472f502b46dc9fac1fd Mon Sep 17 00:00:00 2001 From: BlazeFace Date: Sat, 13 Apr 2024 17:23:26 -0700 Subject: [PATCH 4/4] Undo debug change and add method group --- src/Spectre.Console/Internal/Ratio.cs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/Spectre.Console/Internal/Ratio.cs b/src/Spectre.Console/Internal/Ratio.cs index 80059fc23..69f752ce5 100644 --- a/src/Spectre.Console/Internal/Ratio.cs +++ b/src/Spectre.Console/Internal/Ratio.cs @@ -32,7 +32,7 @@ public static List Resolve(int total, IEnumerable edges) return edge.Size; } - var sizes = edges.Select(x => GetEdgeWidth(x)).ToArray(); + var sizes = edges.Select(GetEdgeWidth).ToArray(); while (sizes.Any(s => s == null)) { @@ -56,8 +56,7 @@ public static List Resolve(int total, IEnumerable edges) .ToList(); } - var r = flexibleEdges.Sum(x => Math.Max(1, x.Edge.Ratio)); - var portion = (float)remaining / r; + var portion = (float)remaining / flexibleEdges.Sum(x => Math.Max(1, x.Edge.Ratio)); var invalidate = false; foreach (var (index, size, edge) in flexibleEdges)