diff options
Diffstat (limited to 'external/rx/Rx/NET/Source/Tests.System.Reactive/Tests/DefaultConcurrencyAbstractionLayerTest.cs')
-rw-r--r-- | external/rx/Rx/NET/Source/Tests.System.Reactive/Tests/DefaultConcurrencyAbstractionLayerTest.cs | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/external/rx/Rx/NET/Source/Tests.System.Reactive/Tests/DefaultConcurrencyAbstractionLayerTest.cs b/external/rx/Rx/NET/Source/Tests.System.Reactive/Tests/DefaultConcurrencyAbstractionLayerTest.cs index e226ca27c1..40c3eec309 100644 --- a/external/rx/Rx/NET/Source/Tests.System.Reactive/Tests/DefaultConcurrencyAbstractionLayerTest.cs +++ b/external/rx/Rx/NET/Source/Tests.System.Reactive/Tests/DefaultConcurrencyAbstractionLayerTest.cs @@ -154,6 +154,69 @@ namespace ReactiveTests.Tests } [TestMethod] + public void StartPeriodicTimer_Fast() + { + var e = new MarshalByRefCell<ManualResetEvent> { Value = new ManualResetEvent(false) }; + _domain.SetData("state", e); + + Run(() => + { + var n = 0; + + Scheduler.Default.SchedulePeriodic(TimeSpan.Zero, () => + { + var state = (MarshalByRefCell<ManualResetEvent>)_domain.GetData("state"); + + if (n++ == 10) + state.Value.Set(); + }); + }); + + e.Value.WaitOne(); + } + + [TestMethod] + public void StartPeriodicTimer_Fast_Cancel() + { + var e = new MarshalByRefCell<ManualResetEvent> { Value = new ManualResetEvent(false) }; + _domain.SetData("set_cancel", e); + + Run(() => + { + var n = 0; + + var schedule = Scheduler.Default.SchedulePeriodic(TimeSpan.Zero, () => + { + _domain.SetData("value", n++); + }); + + _domain.SetData("cancel", new MarshalByRefAction(schedule.Dispose)); + + var setCancel = (MarshalByRefCell<ManualResetEvent>)_domain.GetData("set_cancel"); + setCancel.Value.Set(); + }); + + e.Value.WaitOne(); + + var value = (int)_domain.GetData("value"); + + var cancel = (MarshalByRefAction)_domain.GetData("cancel"); + cancel.Invoke(); + + Thread.Sleep(TimeSpan.FromMilliseconds(50)); + + var newValue = (int)_domain.GetData("value"); + + Assert.IsTrue(newValue >= value); + + Thread.Sleep(TimeSpan.FromMilliseconds(50)); + + value = (int)_domain.GetData("value"); + + Assert.AreEqual(newValue, value); + } + + [TestMethod] public void CreateThread() { var e = new MarshalByRefCell<ManualResetEvent> { Value = new ManualResetEvent(false) }; @@ -294,5 +357,20 @@ namespace ReactiveTests.Tests { public T Value; } + + public class MarshalByRefAction : MarshalByRefObject + { + private readonly Action _action; + + public MarshalByRefAction(Action action) + { + _action = action; + } + + public void Invoke() + { + _action(); + } + } } #endif
\ No newline at end of file |