rd-net/Test.Lifetimes/Collections/Viewable/SignalTest.cs (61 lines of code) (raw):

using System; using System.Threading.Tasks; using JetBrains.Collections.Viewable; using JetBrains.Core; using JetBrains.Lifetimes; using NUnit.Framework; namespace Test.Lifetimes.Collections.Viewable { public class SignalTest : LifetimesTestBase { [Test] public void TestSignalStress() { var sig = new Signal<bool>(); using (var run = new LifetimeDefinition()) { var lt = run.Lifetime; var fireTask = Task.Factory.StartNew(() => { while (lt.IsAlive) sig.Fire(true); }, lt); Parallel.For(0, 100000, i => { using (var ld = new LifetimeDefinition()) sig.Advise(ld.Lifetime, x => { }); }); run.Terminate(); fireTask.Wait(TimeSpan.FromSeconds(1)); Assert.AreEqual(TaskStatus.RanToCompletion, fireTask.Status); } } [Test] public void ReentrancyPriorityAdviceTest() { using var lifetimeDefinition = new LifetimeDefinition(); var lifetime = lifetimeDefinition.Lifetime; var priorityAdvice = 0; var advice1 = 0; var advice2 = 0; var signal = new Signal<Unit>(); var lifetimes = new SequentialLifetimes(TestLifetime); signal.Advise(lifetime, _ => { advice1++; using (Signal.PriorityAdviseCookie.Create()) { signal.Advise(lifetimes.Next(), _ => priorityAdvice++); } }); signal.Advise(lifetime, _ => advice2++); for (int i = 0; i < 1000; i++) { signal.Fire(); Assert.AreEqual(i + 1, advice1); Assert.AreEqual(i + 1, advice2); Assert.AreEqual(i, priorityAdvice); } } } }