ResolveEdges: the strip and the social bar are a coupled pair that own opposite edges whenever both are visible; the social bar keeps its choice and the scoreboard is pushed to the other edge. Hide either and the survivor keeps its own preference — so hiding the scoreboard frees the social bar, which is what 'resolved at render time' has to mean. FitLine: takes MEASURED tile widths (the renderer measures with FormattedText; a guessed character width would make the fit lie for a long handle), keeps full size when it fits, shrinks above the 14px legibility floor, and only then wraps — never scrolls, because a reader cannot wait for the fact to come round.
51 lines
2.2 KiB
C#
51 lines
2.2 KiB
C#
using Xunit;
|
|
using ytLive.Models;
|
|
|
|
namespace ytLive.Tests;
|
|
|
|
/// <summary>Two creator rulings live here: the strip and the social bar own OPPOSITE edges (coupled,
|
|
/// resolved from what is visible), and a strip that does not fit shrinks to a legibility floor and
|
|
/// then wraps — it never scrolls.</summary>
|
|
public class ScoreboardLayoutTests
|
|
{
|
|
[Fact]
|
|
public void Bars_never_share_an_edge_and_an_overlong_strip_shrinks_then_wraps()
|
|
{
|
|
// Both visible: opposite edges, whatever the scoreboard asked for.
|
|
Assert.Equal((BarEdge.Top, BarEdge.Bottom),
|
|
ScoreboardLayout.ResolveEdges(true, BarEdge.Top, true, BarEdge.Top));
|
|
Assert.Equal((BarEdge.Bottom, BarEdge.Top),
|
|
ScoreboardLayout.ResolveEdges(true, BarEdge.Bottom, true, BarEdge.Bottom));
|
|
|
|
// Social bar hidden: the scoreboard keeps its own preference.
|
|
Assert.Equal((BarEdge.Top, BarEdge.Bottom),
|
|
ScoreboardLayout.ResolveEdges(false, BarEdge.Top, true, BarEdge.Bottom));
|
|
|
|
// Scoreboard hidden: the social bar is free.
|
|
Assert.Equal((BarEdge.Bottom, BarEdge.Top),
|
|
ScoreboardLayout.ResolveEdges(true, BarEdge.Bottom, false, BarEdge.Top));
|
|
|
|
// Fits at full size.
|
|
var fit = ScoreboardLayout.FitLine(new[] { 200.0, 200.0, 200.0 }, 40, 1920);
|
|
Assert.Equal(ScoreboardLayout.MaxFontSize, fit.FontSize);
|
|
Assert.Equal(1, fit.LineCount);
|
|
Assert.False(fit.Shrunk);
|
|
|
|
// Too wide for full size, but a shrink keeps it on one line.
|
|
fit = ScoreboardLayout.FitLine(new[] { 400.0, 400.0, 400.0 }, 40, 900);
|
|
Assert.True(fit.FontSize < ScoreboardLayout.MaxFontSize);
|
|
Assert.True(fit.FontSize >= ScoreboardLayout.FloorFontSize);
|
|
Assert.Equal(1, fit.LineCount);
|
|
Assert.True(fit.Shrunk);
|
|
|
|
// Far too wide even at the floor: two lines, never a scroll.
|
|
fit = ScoreboardLayout.FitLine(new[] { 600.0, 600.0, 600.0, 600.0 }, 40, 700);
|
|
Assert.Equal(ScoreboardLayout.FloorFontSize, fit.FontSize);
|
|
Assert.True(fit.LineCount > 1);
|
|
Assert.True(fit.Wrapped);
|
|
|
|
// Nothing enabled: no crash, no lines invented.
|
|
Assert.Equal(1, ScoreboardLayout.FitLine(System.Array.Empty<double>(), 40, 1920).LineCount);
|
|
}
|
|
}
|