The creator (2026-10-21), on Live -> Layers -> webcam -> Properties: "the Y and H boxes under webcam properties should be the same width as the X and W boxes and those widths should be fixed to accomodate the max number of possible digits providing the geometry values" "also the border color drop drown box content should also include the name of the color next to the hex value as they in the drop-down list box" TASK 61 - one fixed width for the four geometry fields. The row is a DockPanel, and WPF sizes an element to its CONTENT unless it is told otherwise, while the LAST child of a DockPanel fills the remaining space. So X/W (not last) were as wide as their text and Y/H (last) stretched across the row - two widths for the same kind of field. Now all four carry Width="44" and the rows set LastChildFill="False" (without it the last field ignores its own Width and fills anyway). 44px is the measured width of "-1920" in the app's font at 11px (the largest geometry value - the master frame is 1920x1080 - plus a sign) plus the field's padding and border. Docs: https://learn.microsoft.com/en-us/dotnet/api/system.windows.controls.dockpanel.lastchildfill The guard MEASURES the widest value with WPF's FormattedText instead of asserting a magic number, so a font change cannot silently make the field too narrow: https://learn.microsoft.com/en-us/dotnet/api/system.windows.media.formattedtext TASK 62 - the border field names its colour. SceneElement.BorderColorName carries the palette's name for the current colour ("Crimson") and is raised when the colour changes; it is EMPTY for a custom hex the creator typed, because "no name" is the honest answer. BorderColorPalette.NameOf changed to match (it used to fall back to the hex itself; the TASK 60 test assertion was updated with it). The hex field keeps a fixed width (60) so the name sits right next to the hex instead of drifting to the row's far edge - the same trap as TASK 61. Guards: ytLive.Tests/GeometryFieldWidthTests.cs, ytLive.Tests/BorderColorNameTests.cs Full suite: 435/435 passed, 0 warnings.
55 lines
2.7 KiB
C#
55 lines
2.7 KiB
C#
using System;
|
|
using System.Linq;
|
|
using Xunit;
|
|
using ytLive.Models;
|
|
|
|
namespace ytLive.Tests;
|
|
|
|
/// <summary>TASK 60 — the creator (2026-10-21): *"under Live->Layers->webcam->
|
|
/// Properties->border color: in the drop down box, the #hex values are good, but add a
|
|
/// corresponding color name/label next to the value."*
|
|
///
|
|
/// <para>One test: the palette is the single source of truth for the drop-down (the
|
|
/// picker builds its menu from it and carries no list of its own), every entry has a
|
|
/// valid hex and a name, the names are unique, the colours the picker used to offer are
|
|
/// all still offered, and the lookup answers for a hex the creator typed.</para></summary>
|
|
public class BorderColorPaletteTests
|
|
{
|
|
[Fact]
|
|
public void The_border_palette_names_every_colour_the_picker_offers()
|
|
{
|
|
// 1. Every entry is a valid hex with a name, and no hex or name repeats.
|
|
Assert.NotEmpty(BorderColorPalette.All);
|
|
foreach (var colour in BorderColorPalette.All)
|
|
{
|
|
Assert.Matches("^#[0-9a-fA-F]{6}$", colour.Hex);
|
|
Assert.False(string.IsNullOrWhiteSpace(colour.Name), $"{colour.Hex} has no name");
|
|
}
|
|
Assert.Equal(BorderColorPalette.All.Count,
|
|
BorderColorPalette.All.Select(c => c.Hex).Distinct(StringComparer.OrdinalIgnoreCase).Count());
|
|
Assert.Equal(BorderColorPalette.All.Count,
|
|
BorderColorPalette.All.Select(c => c.Name).Distinct(StringComparer.OrdinalIgnoreCase).Count());
|
|
|
|
// 2. The colours the picker used to offer are all still offered.
|
|
string[] legacy = ["#FFFFFF", "#000000", "#FF0000", "#00FF00", "#0000FF", "#FFFF00",
|
|
"#FF00FF", "#00FFFF", "#FF8800", "#8800FF", "#e94560", "#22c55e",
|
|
"#3b82f6", "#f59e0b"];
|
|
foreach (var hex in legacy)
|
|
Assert.Contains(BorderColorPalette.All, c => c.Hex == hex);
|
|
|
|
// 3. The lookup answers for a hex in any case, and a colour outside the palette
|
|
// has NO name (the field shows the hex alone — TASK 62).
|
|
Assert.Equal("Crimson", BorderColorPalette.NameOf("#e94560"));
|
|
Assert.Equal("Crimson", BorderColorPalette.NameOf("#E94560"));
|
|
Assert.Equal("White", BorderColorPalette.NameOf(" #ffffff "));
|
|
Assert.Equal("", BorderColorPalette.NameOf("#123456"));
|
|
|
|
// 4. The picker builds its menu from the catalogue — there is no second list.
|
|
var source = SourceAssert.Text("Controls", "LeftPanel.xaml.cs");
|
|
Assert.True(source.Contains("BorderColorPalette"),
|
|
"the border picker does not build its menu from the palette");
|
|
Assert.False(source.Contains("\"#FFFFFF\""),
|
|
"the border picker still carries its own list of colours");
|
|
}
|
|
}
|