Four reports, three causes: 1. "Background plate has no code behind it" — the plate COLOUR and OPACITY controls were disabled until the plate switch was on, which reads as dead controls. They are always settable now; the switch is what decides whether a plate is drawn. 2. "Opacity doesn't work" — proven in the renderer test: 20% and 80% produce alphas of ~51 and ~204, so the slider reaches the pixels. What was actually wrong was the box. 3. The strip's BOX was fixed at 56px while a wrapped strip renders taller — the frame was scaled into the box and looked squashed/clipped. The source's width/height now follow the rendered frame, and its Y follows from the edge. 4. "Simulate (dev) should override Show the scoreboard" — it does: the preview gate is (_scoreboardEnabled || _scoreboardSimulate), so the dev toggle works even with the product setting off. Not changed: the strip is STATIC by design (all enabled facts always visible, wrap rather than scroll). If scrolling is wanted after all, that is a presentation mode to add, not a fix.
52 lines
2.4 KiB
C#
52 lines
2.4 KiB
C#
using Xunit;
|
|
using ytLive.Models;
|
|
using ytLive.ViewModels;
|
|
|
|
namespace ytLive.Tests;
|
|
|
|
/// <summary>DEBUG-only affordance (creator 2026-10-30): push sample events so the strip is provable
|
|
/// in the PREVIEW before a real stream. The sample must travel the real recorder, so what it paints
|
|
/// is what live events paint — a fake renderer would prove nothing.</summary>
|
|
public class ScoreboardSimulationTests
|
|
{
|
|
[Fact]
|
|
public void The_dev_sample_feeds_the_real_recorder_and_the_toggle_is_debug_only()
|
|
{
|
|
// The sample goes through the recorder a stream uses, and lands all four tallies.
|
|
var recorder = new ScoreboardRecorder();
|
|
ScoreboardSample.Inject(recorder);
|
|
|
|
Assert.True(recorder.IsRunning);
|
|
var state = recorder.State;
|
|
Assert.Equal(4, state.NewMembers); // 1 paid + a gift of 3
|
|
Assert.Equal(3, state.LastGiftCount);
|
|
Assert.Equal("giftgiver", state.LastGifterName);
|
|
Assert.Equal(1, state.MilestoneCount);
|
|
Assert.Equal(12.34, state.SessionTotal.Total, 2);
|
|
Assert.Equal("$12.34", state.LastSuperChatDisplay);
|
|
|
|
// A toggle OFF clears back to an empty session (so the empty state is visible too).
|
|
recorder.StartSession();
|
|
Assert.Equal(0, recorder.State.NewMembers);
|
|
|
|
// Simulate OVERRIDES the master "show" switch: the dev toggle must work even when the
|
|
// product setting is off.
|
|
var vmSource = SourceAssert.Text("ViewModels", "MainViewModel.Scoreboard.cs");
|
|
Assert.Contains("_scoreboardEnabled || _scoreboardSimulate", vmSource);
|
|
|
|
// The control exists and is gated on the build, not on a runtime flag.
|
|
var panel = SourceAssert.Text("Controls", "LeftPanel.xaml");
|
|
Assert.Contains("ScoreboardSimulate", panel);
|
|
Assert.Contains("IsDevelopmentBuild", panel);
|
|
|
|
var type = typeof(MainViewModel);
|
|
Assert.NotNull(type.GetProperty("ScoreboardSimulate"));
|
|
Assert.NotNull(type.GetProperty("IsDevelopmentBuild"));
|
|
// DEBUG-gated at compile time, so a Release build has no dev control at all.
|
|
var vmSource = SourceAssert.Text("ViewModels", "MainViewModel.Scoreboard.cs");
|
|
Assert.Contains("#if DEBUG", vmSource);
|
|
Assert.Contains("private const bool DevelopmentBuild = true;", vmSource);
|
|
Assert.Contains("private const bool DevelopmentBuild = false;", vmSource);
|
|
}
|
|
}
|