using System.Linq;
using System.Xml.Linq;
using Xunit;
using ytLive.Models;
namespace ytLive.Tests;
/// TASK 51 slice 5 — the creator's UI spec (2026-10-09): Remove and Blur are two pill
/// switches in the webcam's Layers properties that act as radio buttons (one on turns the other
/// off; both off = no effect), plus a strength slider.
public class WebcamBackgroundPillTests
{
[Fact]
public void Remove_and_Blur_pills_are_radio_exclusive_and_wired_in_the_webcam_properties()
{
// Behaviour: the bools the pills bind to.
var config = new WebcamSceneConfig();
var raised = new System.Collections.Generic.List();
config.PropertyChanged += (_, e) => raised.Add(e.PropertyName);
config.RemoveBackground = true;
Assert.Equal(BackgroundEffect.Remove, config.BackgroundEffect);
Assert.True(config.HasBackgroundEffect);
raised.Clear();
config.BlurBackground = true; // turning Blur on turns Remove off
Assert.Equal(BackgroundEffect.Blur, config.BackgroundEffect);
Assert.False(config.RemoveBackground);
Assert.Contains(nameof(WebcamSceneConfig.RemoveBackground), raised); // Remove pill un-checks
Assert.Contains(nameof(WebcamSceneConfig.BlurBackground), raised);
config.RemoveBackground = false; // turning the INACTIVE pill off changes nothing
Assert.Equal(BackgroundEffect.Blur, config.BackgroundEffect);
config.BlurBackground = false; // turning the active pill off = None
Assert.Equal(BackgroundEffect.None, config.BackgroundEffect);
Assert.False(config.HasBackgroundEffect);
// Wiring: the two PillToggle switches + the strength slider live in the webcam's
// properties section of the Layers panel, bound to those properties.
XNamespace x = "http://schemas.microsoft.com/winfx/2006/xaml";
var doc = XDocument.Load(SourceAssert.RepoPath("Controls", "LeftPanel.xaml"));
var webcamPanel = doc.Descendants()
.Single(e => e.Name.LocalName == "StackPanel"
&& ((string?)e.Attribute("Visibility") ?? "").Contains("SelectedElement.IsWebcam"));
XElement Named(string name) => webcamPanel.Descendants().Single(e => (string?)e.Attribute(x + "Name") == name);
foreach (var (pill, property) in new[] { ("RemoveBackgroundPill", "RemoveBackground"), ("BlurBackgroundPill", "BlurBackground") })
{
var toggle = Named(pill);
Assert.Equal("ToggleButton", toggle.Name.LocalName);
Assert.Contains("PillToggle", (string?)toggle.Attribute("Style"));
Assert.Contains($"SelectedElement.{property}", (string?)toggle.Attribute("IsChecked"));
Assert.Contains("TwoWay", (string?)toggle.Attribute("IsChecked"));
}
var slider = Named("BackgroundStrengthSlider");
Assert.Contains("SelectedElement.BackgroundStrength", (string?)slider.Attribute("Value"));
Assert.Equal("0", (string?)slider.Attribute("Minimum"));
Assert.Equal("1", (string?)slider.Attribute("Maximum"));
}
}