using StellaOps.AirGap.Time.Parsing; using StellaOps.AirGap.Time.Services; namespace StellaOps.AirGap.Time.Tests; public class TimeAnchorLoaderTests { [Fact] public void RejectsInvalidHex() { var loader = new TimeAnchorLoader(); var result = loader.TryLoadHex("not-hex", TimeTokenFormat.Roughtime, Array.Empty(), out _); Assert.False(result.IsValid); Assert.Equal("token-hex-invalid", result.Reason); } [Fact] public void LoadsHexToken() { var loader = new TimeAnchorLoader(); var hex = "01020304"; var trust = new[] { new TimeTrustRoot("k1", new byte[] { 0x01 }, "rsassa-pss-sha256") }; var result = loader.TryLoadHex(hex, TimeTokenFormat.Roughtime, trust, out var anchor); Assert.True(result.IsValid); Assert.Equal("Roughtime", anchor.Format); } [Fact] public void RejectsIncompatibleTrustRoots() { var loader = new TimeAnchorLoader(); var hex = "010203"; var rsaKey = new byte[128]; var trust = new[] { new TimeTrustRoot("k1", rsaKey, "rsa") }; var result = loader.TryLoadHex(hex, TimeTokenFormat.Roughtime, trust, out _); Assert.False(result.IsValid); Assert.Equal("trust-roots-incompatible-format", result.Reason); } [Fact] public void RejectsWhenTrustRootsMissing() { var loader = new TimeAnchorLoader(); var result = loader.TryLoadHex("010203", TimeTokenFormat.Roughtime, Array.Empty(), out _); Assert.False(result.IsValid); Assert.Equal("trust-roots-required", result.Reason); } }