using StellaOps.Signals.Lattice; using Xunit; namespace StellaOps.Signals.Tests; public class ReachabilityLatticeTests { [Theory] [InlineData(ReachabilityLatticeState.Unknown, ReachabilityLatticeState.StaticallyReachable, ReachabilityLatticeState.StaticallyReachable)] [InlineData(ReachabilityLatticeState.StaticallyReachable, ReachabilityLatticeState.StaticallyUnreachable, ReachabilityLatticeState.Contested)] [InlineData(ReachabilityLatticeState.StaticallyReachable, ReachabilityLatticeState.RuntimeObserved, ReachabilityLatticeState.ConfirmedReachable)] [InlineData(ReachabilityLatticeState.StaticallyUnreachable, ReachabilityLatticeState.RuntimeUnobserved, ReachabilityLatticeState.ConfirmedUnreachable)] [InlineData(ReachabilityLatticeState.RuntimeObserved, ReachabilityLatticeState.StaticallyUnreachable, ReachabilityLatticeState.Contested)] [InlineData(ReachabilityLatticeState.ConfirmedReachable, ReachabilityLatticeState.ConfirmedUnreachable, ReachabilityLatticeState.Contested)] [InlineData(ReachabilityLatticeState.Contested, ReachabilityLatticeState.Unknown, ReachabilityLatticeState.Contested)] public void Join_ReturnsExpectedState(ReachabilityLatticeState a, ReachabilityLatticeState b, ReachabilityLatticeState expected) { var result = ReachabilityLattice.Join(a, b); Assert.Equal(expected, result); } [Theory] [InlineData(ReachabilityLatticeState.Unknown, ReachabilityLatticeState.StaticallyReachable, ReachabilityLatticeState.Unknown)] [InlineData(ReachabilityLatticeState.ConfirmedReachable, ReachabilityLatticeState.RuntimeObserved, ReachabilityLatticeState.RuntimeObserved)] [InlineData(ReachabilityLatticeState.Contested, ReachabilityLatticeState.StaticallyReachable, ReachabilityLatticeState.StaticallyReachable)] [InlineData(ReachabilityLatticeState.Contested, ReachabilityLatticeState.Unknown, ReachabilityLatticeState.Unknown)] public void Meet_ReturnsExpectedState(ReachabilityLatticeState a, ReachabilityLatticeState b, ReachabilityLatticeState expected) { var result = ReachabilityLattice.Meet(a, b); Assert.Equal(expected, result); } [Fact] public void Join_IsCommutative() { var states = Enum.GetValues(); foreach (var a in states) { foreach (var b in states) { Assert.Equal(ReachabilityLattice.Join(a, b), ReachabilityLattice.Join(b, a)); } } } [Fact] public void Meet_IsCommutative() { var states = Enum.GetValues(); foreach (var a in states) { foreach (var b in states) { Assert.Equal(ReachabilityLattice.Meet(a, b), ReachabilityLattice.Meet(b, a)); } } } [Fact] public void JoinAll_WithEmptySequence_ReturnsUnknown() { var result = ReachabilityLattice.JoinAll(Array.Empty()); Assert.Equal(ReachabilityLatticeState.Unknown, result); } [Fact] public void JoinAll_StopsEarlyOnContested() { var states = new[] { ReachabilityLatticeState.StaticallyReachable, ReachabilityLatticeState.Contested, ReachabilityLatticeState.Unknown }; var result = ReachabilityLattice.JoinAll(states); Assert.Equal(ReachabilityLatticeState.Contested, result); } [Theory] [InlineData(true, false, false, ReachabilityLatticeState.StaticallyReachable)] [InlineData(false, false, false, ReachabilityLatticeState.StaticallyUnreachable)] [InlineData(null, false, false, ReachabilityLatticeState.Unknown)] [InlineData(true, true, true, ReachabilityLatticeState.ConfirmedReachable)] [InlineData(false, true, false, ReachabilityLatticeState.ConfirmedUnreachable)] [InlineData(false, true, true, ReachabilityLatticeState.Contested)] public void FromEvidence_ReturnsExpectedState(bool? staticReachable, bool hasRuntimeEvidence, bool runtimeObserved, ReachabilityLatticeState expected) { var result = ReachabilityLattice.FromEvidence(staticReachable, hasRuntimeEvidence, runtimeObserved); Assert.Equal(expected, result); } [Theory] [InlineData("entrypoint", false, ReachabilityLatticeState.ConfirmedReachable)] [InlineData("direct", false, ReachabilityLatticeState.StaticallyReachable)] [InlineData("direct", true, ReachabilityLatticeState.ConfirmedReachable)] [InlineData("runtime", false, ReachabilityLatticeState.RuntimeObserved)] [InlineData("unreachable", false, ReachabilityLatticeState.StaticallyUnreachable)] [InlineData("unreachable", true, ReachabilityLatticeState.Contested)] [InlineData("unknown", false, ReachabilityLatticeState.Unknown)] public void FromV0Bucket_ReturnsExpectedState(string bucket, bool hasRuntimeHits, ReachabilityLatticeState expected) { var result = ReachabilityLattice.FromV0Bucket(bucket, hasRuntimeHits); Assert.Equal(expected, result); } } public class ReachabilityLatticeStateExtensionsTests { [Theory] [InlineData(ReachabilityLatticeState.Unknown, "U")] [InlineData(ReachabilityLatticeState.StaticallyReachable, "SR")] [InlineData(ReachabilityLatticeState.StaticallyUnreachable, "SU")] [InlineData(ReachabilityLatticeState.RuntimeObserved, "RO")] [InlineData(ReachabilityLatticeState.RuntimeUnobserved, "RU")] [InlineData(ReachabilityLatticeState.ConfirmedReachable, "CR")] [InlineData(ReachabilityLatticeState.ConfirmedUnreachable, "CU")] [InlineData(ReachabilityLatticeState.Contested, "X")] public void ToCode_ReturnsExpectedCode(ReachabilityLatticeState state, string expectedCode) { Assert.Equal(expectedCode, state.ToCode()); } [Theory] [InlineData("U", ReachabilityLatticeState.Unknown)] [InlineData("SR", ReachabilityLatticeState.StaticallyReachable)] [InlineData("SU", ReachabilityLatticeState.StaticallyUnreachable)] [InlineData("RO", ReachabilityLatticeState.RuntimeObserved)] [InlineData("RU", ReachabilityLatticeState.RuntimeUnobserved)] [InlineData("CR", ReachabilityLatticeState.ConfirmedReachable)] [InlineData("CU", ReachabilityLatticeState.ConfirmedUnreachable)] [InlineData("X", ReachabilityLatticeState.Contested)] [InlineData("invalid", ReachabilityLatticeState.Unknown)] [InlineData("", ReachabilityLatticeState.Unknown)] [InlineData(null, ReachabilityLatticeState.Unknown)] public void FromCode_ReturnsExpectedState(string? code, ReachabilityLatticeState expected) { Assert.Equal(expected, ReachabilityLatticeStateExtensions.FromCode(code)); } [Theory] [InlineData(ReachabilityLatticeState.ConfirmedUnreachable, "unreachable")] [InlineData(ReachabilityLatticeState.StaticallyUnreachable, "unreachable")] [InlineData(ReachabilityLatticeState.RuntimeUnobserved, "unreachable")] [InlineData(ReachabilityLatticeState.ConfirmedReachable, "runtime")] [InlineData(ReachabilityLatticeState.RuntimeObserved, "runtime")] [InlineData(ReachabilityLatticeState.StaticallyReachable, "direct")] [InlineData(ReachabilityLatticeState.Unknown, "unknown")] [InlineData(ReachabilityLatticeState.Contested, "unknown")] public void ToV0Bucket_ReturnsExpectedBucket(ReachabilityLatticeState state, string expectedBucket) { Assert.Equal(expectedBucket, state.ToV0Bucket()); } }