Merge #613 slice: MTConnect authoring-time DataType advisory + ignored-DeviceName warning

Claude-Session: https://claude.ai/code/session_01Ef2ozxS7QPanGT8uoATbTe
This commit is contained in:
Joseph Doherty
2026-10-08 06:52:08 -04:00
6 changed files with 162 additions and 2 deletions
@@ -117,6 +117,37 @@ public sealed class MTConnectRawTagBindingTests
return (driver, agent);
}
private static RawTagEntry OnDevice(string rawPath, string dataItemId, string device) =>
Entry(rawPath, dataItemId) with { DeviceName = device };
private static async Task<List<string>> InitWarningsAsync(params RawTagEntry[] rawTags)
{
var logger = new RecordingDriverLogger();
var driver = new MTConnectDriver(Bare(), "mt1", _ => CannedAgentClient.FromFixtures(), logger);
await driver.InitializeAsync(MergedConfig(rawTags), Ct);
await driver.ShutdownAsync(Ct);
return [.. logger.Warnings];
}
/// <summary>#613: differing RawTagEntry.DeviceName values are ignored for routing, so init says so.</summary>
[Fact]
public async Task Differing_raw_device_names_log_an_ignored_routing_warning()
{
// Positive control: a single /raw Device is the ordinary case and must stay silent.
(await InitWarningsAsync(
OnDevice(PositionRawPath, PositionDataItemId, "cncA"),
OnDevice(ExecutionRawPath, ExecutionDataItemId, "cncA")))
.ShouldNotContain(w => w.Contains("RawTagEntry.DeviceName"));
var warnings = await InitWarningsAsync(
OnDevice(PositionRawPath, PositionDataItemId, "cncA"),
OnDevice(ExecutionRawPath, ExecutionDataItemId, "cncB"));
var w = warnings.Where(x => x.Contains("RawTagEntry.DeviceName")).ShouldHaveSingleItem();
w.ShouldContain("cncA, cncB");
}
// ---- the production data plane: subscribe by RawPath, publish by RawPath ----
/// <summary>