using AcDream.App.Net; namespace AcDream.App.Tests.Net; public sealed class LiveSessionSubscriptionSetTests { [Fact] public void Dispose_RetriesOnlyFailedEdgesUntilTheyConverge() { var order = new List(); var subscriptions = new LiveSessionSubscriptionSet(); subscriptions.Add(() => order.Add(1)); int secondFailures = 1; subscriptions.Add(() => { order.Add(2); if (secondFailures-- > 0) throw new InvalidOperationException("second failed"); }); int thirdFailures = 1; subscriptions.Add(() => { order.Add(3); if (thirdFailures-- > 0) throw new IOException("third failed"); }); AggregateException error = Assert.Throws( subscriptions.Dispose); Assert.Equal([3, 2, 1], order); Assert.Collection( error.InnerExceptions, exception => Assert.IsType(exception), exception => Assert.IsType(exception)); subscriptions.Dispose(); subscriptions.Dispose(); Assert.Equal([3, 2, 1, 3, 2], order); } [Fact] public void Dispose_PersistentFailureNeverReplaysSuccessfulEdges() { var order = new List(); var subscriptions = new LiveSessionSubscriptionSet(); subscriptions.Add(() => order.Add(1)); subscriptions.Add(() => { order.Add(2); throw new InvalidOperationException("persistent"); }); Assert.Throws(subscriptions.Dispose); Assert.Throws(subscriptions.Dispose); Assert.Equal([2, 1, 2], order); } }