Fluent light/dark theme dictionaries (accent/surface/card/border/danger), OS-following variant, App-level text/button/card styles. Per-protocol vector icons via ProtocolIdToIconConverter (mirrors StatusKindToBrushConverter, view-layer, safe fallback, no external assets). Curated layout across dashboard/detail/config: consistent spacing scale, card grouping, theme brushes, accent/danger buttons. App-only; no VM contract change, no new NuGet, no fw bump. Projects: Junction.App (+ Junction.Tests: +10 converter tests, 148 pass). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
78 lines
2.8 KiB
C#
78 lines
2.8 KiB
C#
using Junction.App.Converters;
|
|
using Xunit;
|
|
|
|
namespace Junction.Tests.Unit
|
|
{
|
|
/// <summary>
|
|
/// Data-level tests for the protocol → glyph mapping. Targets the pure
|
|
/// <see cref="ProtocolIdToIconConverter.PathDataFor"/> so no Avalonia platform is required
|
|
/// (the geometry parse in Convert needs a render backend). Mirrors the intent of the
|
|
/// StatusKind converter: known ids → distinct non-empty data, unknown → fallback, never throws.
|
|
/// </summary>
|
|
public class ProtocolIdToIconConverterTests
|
|
{
|
|
[Theory]
|
|
[InlineData("mtconnect")]
|
|
[InlineData("opcua")]
|
|
[InlineData("fanuc")]
|
|
public void KnownProtocol_ReturnsNonEmptyData(string protocolId)
|
|
{
|
|
var data = ProtocolIdToIconConverter.PathDataFor(protocolId);
|
|
|
|
Assert.False(string.IsNullOrWhiteSpace(data));
|
|
}
|
|
|
|
[Fact]
|
|
public void KnownProtocols_AreMutuallyDistinct()
|
|
{
|
|
var mtc = ProtocolIdToIconConverter.PathDataFor("mtconnect");
|
|
var opc = ProtocolIdToIconConverter.PathDataFor("opcua");
|
|
var fan = ProtocolIdToIconConverter.PathDataFor("fanuc");
|
|
|
|
Assert.NotEqual(mtc, opc);
|
|
Assert.NotEqual(mtc, fan);
|
|
Assert.NotEqual(opc, fan);
|
|
}
|
|
|
|
[Fact]
|
|
public void Lookup_IsCaseAndWhitespaceInsensitive()
|
|
{
|
|
var canonical = ProtocolIdToIconConverter.PathDataFor("mtconnect");
|
|
|
|
Assert.Equal(canonical, ProtocolIdToIconConverter.PathDataFor(" MtConnect "));
|
|
}
|
|
|
|
[Theory]
|
|
[InlineData("unknown")]
|
|
[InlineData("modbus")]
|
|
[InlineData("")]
|
|
public void UnknownOrEmpty_ReturnsFallback(string protocolId)
|
|
{
|
|
var fallback = ProtocolIdToIconConverter.PathDataFor("definitely-not-a-protocol");
|
|
var data = ProtocolIdToIconConverter.PathDataFor(protocolId);
|
|
|
|
Assert.False(string.IsNullOrWhiteSpace(data));
|
|
Assert.Equal(fallback, data);
|
|
}
|
|
|
|
[Fact]
|
|
public void Null_ReturnsFallback_DoesNotThrow()
|
|
{
|
|
var fallback = ProtocolIdToIconConverter.PathDataFor("definitely-not-a-protocol");
|
|
var data = ProtocolIdToIconConverter.PathDataFor(null);
|
|
|
|
Assert.False(string.IsNullOrWhiteSpace(data));
|
|
Assert.Equal(fallback, data);
|
|
}
|
|
|
|
[Fact]
|
|
public void Fallback_DiffersFromEveryKnownProtocol()
|
|
{
|
|
var fallback = ProtocolIdToIconConverter.PathDataFor("unknown");
|
|
|
|
Assert.NotEqual(fallback, ProtocolIdToIconConverter.PathDataFor("mtconnect"));
|
|
Assert.NotEqual(fallback, ProtocolIdToIconConverter.PathDataFor("opcua"));
|
|
Assert.NotEqual(fallback, ProtocolIdToIconConverter.PathDataFor("fanuc"));
|
|
}
|
|
}
|
|
}
|