Creator: "even if it's not visible, we want to avoid polling." ScoreboardEnabled is the layer's master switch in the properties panel. Off means two things: - the strip frame is null in every scene (per-scene eye toggles stay independent), and - the cadence policy returns None at every phase — a scoreboard nobody can see must not spend quota. The switch is persisted (Scoreboard.Enabled), because one that resets would quietly resume polling. The polling gate is ScoreboardPollsEnabled: master switch AND at least one scene with a visible scoreboard — so hiding it in all five scenes also stops the polls. Guards: ScoreboardCadenceTests adds the switch off across live/test/recording; ScoreboardProperties pins the checkbox and the VM surface.
59 lines
2.7 KiB
C#
59 lines
2.7 KiB
C#
using System.Reflection;
|
|
using Xunit;
|
|
using ytLive.ViewModels;
|
|
|
|
namespace ytLive.Tests;
|
|
|
|
/// <summary>The scoreboard's look and its eight fact switches live in the LAYER PROPERTIES, and the
|
|
/// panel must use the app's widgets — a hand-painted control is the TASK 58/63 defect, and the
|
|
/// guard that catches it is here because the type-based sweep cannot see a bespoke picker.</summary>
|
|
public class ScoreboardPropertiesTests
|
|
{
|
|
[Fact]
|
|
public void The_scoreboard_properties_are_themed_controls_bound_to_the_layer_surface()
|
|
{
|
|
var panel = SourceAssert.Text("Controls", "LeftPanel.xaml");
|
|
|
|
// Gated on the selected layer being a scoreboard.
|
|
Assert.Contains("SelectedElement.IsScoreboard", panel);
|
|
|
|
// The master switch sits in the same panel: off hides the strip and stops the polling.
|
|
Assert.Contains("ScoreboardEnabled", panel);
|
|
|
|
// The eight fact switches.
|
|
foreach (var binding in new[]
|
|
{
|
|
"ScoreboardShowSubscribers", "ScoreboardShowWatchHours", "ScoreboardShowSuperChats",
|
|
"ScoreboardShowNewMembers", "ScoreboardShowMilestones", "ScoreboardShowLastMember",
|
|
"ScoreboardShowLastSuperChat", "ScoreboardShowLastGift",
|
|
})
|
|
Assert.Contains(binding, panel);
|
|
|
|
// Look controls: text colour, plate colour, plate opacity, text size.
|
|
foreach (var binding in new[]
|
|
{
|
|
"ScoreboardTextColor", "ScoreboardBackgroundColor",
|
|
"ScoreboardBackgroundOpacity", "ScoreboardFontSize",
|
|
})
|
|
Assert.Contains(binding, panel);
|
|
|
|
// Theme widgets only: the colour pickers are the app's drop-down (YtComboBox), never a
|
|
// hand-built menu, and the toggles are YtCheckBox.
|
|
var block = panel[panel.IndexOf("Scoreboard config", System.StringComparison.Ordinal)..];
|
|
block = block[..block.IndexOf("<!-- Countdown config -->", System.StringComparison.Ordinal)];
|
|
Assert.Contains("Style=\"{StaticResource YtComboBox}\"", block);
|
|
Assert.Contains("Style=\"{StaticResource YtCheckBox}\"", block);
|
|
Assert.DoesNotContain("ContextMenu", block);
|
|
|
|
// The VM surface exists for every binding above (a typo would bind to nothing silently).
|
|
var type = typeof(MainViewModel);
|
|
foreach (var name in new[]
|
|
{
|
|
"ScoreboardTextColor", "ScoreboardBackgroundColor", "ScoreboardBackgroundOpacity",
|
|
"ScoreboardFontSize", "ScoreboardColorOptions", "ScoreboardShowSubscribers",
|
|
"ScoreboardEnabled",
|
|
})
|
|
Assert.NotNull(type.GetProperty(name));
|
|
}
|
|
}
|