public void ReachabilityTable_must_have_correct_status_for_a_mix_of_nodes()
{
var r = Reachability.Empty.
Unreachable(nodeB, nodeA).Unreachable(nodeC, nodeA).Unreachable(nodeD, nodeA).
Unreachable(nodeC, nodeB).Reachable(nodeC, nodeB).Unreachable(nodeD, nodeB).
Unreachable(nodeD, nodeC).Reachable(nodeD, nodeC).
Reachable(nodeE, nodeD).
Unreachable(nodeA, nodeE).Terminated(nodeB, nodeE);
Assert.Equal(Reachability.ReachabilityStatus.Unreachable, r.Status(nodeB, nodeA));
Assert.Equal(Reachability.ReachabilityStatus.Unreachable, r.Status(nodeC, nodeA));
Assert.Equal(Reachability.ReachabilityStatus.Unreachable, r.Status(nodeD, nodeA));
Assert.Equal(Reachability.ReachabilityStatus.Reachable, r.Status(nodeC, nodeB));
Assert.Equal(Reachability.ReachabilityStatus.Unreachable, r.Status(nodeD, nodeB));
Assert.Equal(Reachability.ReachabilityStatus.Unreachable, r.Status(nodeA, nodeE));
Assert.Equal(Reachability.ReachabilityStatus.Terminated, r.Status(nodeB, nodeE));
Assert.False(r.IsReachable(nodeA));
Assert.False(r.IsReachable(nodeB));
Assert.True(r.IsReachable(nodeC));
Assert.True(r.IsReachable(nodeD));
Assert.False(r.IsReachable(nodeE));
Assert.Equal(ImmutableHashSet.Create(nodeA, nodeB), r.AllUnreachable);
Assert.Equal(ImmutableHashSet.Create(nodeE), r.AllUnreachableFrom(nodeA));
Assert.Equal(ImmutableHashSet.Create(nodeA), r.AllUnreachableFrom(nodeB));
Assert.Equal(ImmutableHashSet.Create(nodeA), r.AllUnreachableFrom(nodeC));
Assert.Equal(ImmutableHashSet.Create(nodeA, nodeB), r.AllUnreachableFrom(nodeD));
var expected = new Dictionary<UniqueAddress, ImmutableHashSet<UniqueAddress>>
{
{nodeA, ImmutableHashSet.Create(nodeB, nodeC, nodeD)},
{nodeB, ImmutableHashSet.Create(nodeD)},
{nodeE, ImmutableHashSet.Create(nodeA)}
}.ToImmutableDictionary();
r.ObserversGroupedByUnreachable
.Should()
.HaveCount(3);
foreach (var pair in r.ObserversGroupedByUnreachable)
{
pair.Value.ShouldBeEquivalentTo(expected[pair.Key]);
}
}