junction/tests/Junction.Tests/Unit/ProtocolIdToIconConverterTests.cs
dtrentin f4abdc0039 feat: themed + iconed UI polish (v0.3.1)
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>
2026-07-22 07:23:47 +02:00

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"));
}
}
}