Files
git.stella-ops.org/src/Signals/__Tests/StellaOps.Signals.Tests/ReachabilityLatticeTests.cs
StellaOps Bot 999e26a48e up
2025-12-13 02:22:15 +02:00

150 lines
7.3 KiB
C#

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<ReachabilityLatticeState>();
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<ReachabilityLatticeState>();
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<ReachabilityLatticeState>());
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());
}
}