|
|
@@ -23,7 +23,7 @@ using System.Threading.Tasks;
|
|
|
namespace ReactiveTests.Tests
|
|
|
{
|
|
|
[TestClass]
|
|
|
- public class SchedulerTest
|
|
|
+ public class SchedulerTest : ReactiveTest
|
|
|
{
|
|
|
#region IScheduler
|
|
|
|
|
|
@@ -1155,6 +1155,300 @@ namespace ReactiveTests.Tests
|
|
|
ReactiveAssert.Throws<ArgumentNullException>(() => Scheduler.ScheduleAsync(s, at, d4));
|
|
|
}
|
|
|
|
|
|
+ [TestMethod]
|
|
|
+ public void SchedulerAsync_ScheduleAsync_Overloads1()
|
|
|
+ {
|
|
|
+ var tcsI = new TaskCompletionSource<int>();
|
|
|
+ var t = tcsI.Task;
|
|
|
+ tcsI.SetResult(0);
|
|
|
+
|
|
|
+ var tcsD = new TaskCompletionSource<IDisposable>();
|
|
|
+ var d = tcsD.Task;
|
|
|
+ tcsD.SetResult(Disposable.Empty);
|
|
|
+
|
|
|
+ var s = new TestScheduler();
|
|
|
+
|
|
|
+ var o = s.CreateObserver<int>();
|
|
|
+
|
|
|
+ s.ScheduleAsync((_, ct) =>
|
|
|
+ {
|
|
|
+ o.OnNext(42);
|
|
|
+ return t;
|
|
|
+ });
|
|
|
+
|
|
|
+ s.ScheduleAsync((_, ct) =>
|
|
|
+ {
|
|
|
+ o.OnNext(43);
|
|
|
+ return d;
|
|
|
+ });
|
|
|
+
|
|
|
+ s.ScheduleAsync(44, (_, x, ct) =>
|
|
|
+ {
|
|
|
+ o.OnNext(x);
|
|
|
+ return t;
|
|
|
+ });
|
|
|
+
|
|
|
+ s.ScheduleAsync(45, (_, x, ct) =>
|
|
|
+ {
|
|
|
+ o.OnNext(45);
|
|
|
+ return d;
|
|
|
+ });
|
|
|
+
|
|
|
+ s.Start();
|
|
|
+
|
|
|
+ o.Messages.AssertEqual(
|
|
|
+ OnNext(1, 42),
|
|
|
+ OnNext(1, 43),
|
|
|
+ OnNext(1, 44),
|
|
|
+ OnNext(1, 45)
|
|
|
+ );
|
|
|
+ }
|
|
|
+
|
|
|
+ [TestMethod]
|
|
|
+ public void SchedulerAsync_ScheduleAsync_Overloads2()
|
|
|
+ {
|
|
|
+ var tcsI = new TaskCompletionSource<int>();
|
|
|
+ var t = tcsI.Task;
|
|
|
+ tcsI.SetResult(0);
|
|
|
+
|
|
|
+ var tcsD = new TaskCompletionSource<IDisposable>();
|
|
|
+ var d = tcsD.Task;
|
|
|
+ tcsD.SetResult(Disposable.Empty);
|
|
|
+
|
|
|
+ var s = new TestScheduler();
|
|
|
+
|
|
|
+ var o = s.CreateObserver<int>();
|
|
|
+
|
|
|
+ s.ScheduleAsync(TimeSpan.FromTicks(50), (_, ct) =>
|
|
|
+ {
|
|
|
+ o.OnNext(42);
|
|
|
+ return t;
|
|
|
+ });
|
|
|
+
|
|
|
+ s.ScheduleAsync(TimeSpan.FromTicks(60), (_, ct) =>
|
|
|
+ {
|
|
|
+ o.OnNext(43);
|
|
|
+ return d;
|
|
|
+ });
|
|
|
+
|
|
|
+ s.ScheduleAsync(44, TimeSpan.FromTicks(70), (_, x, ct) =>
|
|
|
+ {
|
|
|
+ o.OnNext(x);
|
|
|
+ return t;
|
|
|
+ });
|
|
|
+
|
|
|
+ s.ScheduleAsync(45, TimeSpan.FromTicks(80), (_, x, ct) =>
|
|
|
+ {
|
|
|
+ o.OnNext(45);
|
|
|
+ return d;
|
|
|
+ });
|
|
|
+
|
|
|
+ s.Start();
|
|
|
+
|
|
|
+ o.Messages.AssertEqual(
|
|
|
+ OnNext(50, 42),
|
|
|
+ OnNext(60, 43),
|
|
|
+ OnNext(70, 44),
|
|
|
+ OnNext(80, 45)
|
|
|
+ );
|
|
|
+ }
|
|
|
+
|
|
|
+ [TestMethod]
|
|
|
+ public void SchedulerAsync_ScheduleAsync_Overloads3()
|
|
|
+ {
|
|
|
+ var tcsI = new TaskCompletionSource<int>();
|
|
|
+ var t = tcsI.Task;
|
|
|
+ tcsI.SetResult(0);
|
|
|
+
|
|
|
+ var tcsD = new TaskCompletionSource<IDisposable>();
|
|
|
+ var d = tcsD.Task;
|
|
|
+ tcsD.SetResult(Disposable.Empty);
|
|
|
+
|
|
|
+ var s = new TestScheduler();
|
|
|
+
|
|
|
+ var o = s.CreateObserver<int>();
|
|
|
+
|
|
|
+ s.ScheduleAsync(new DateTimeOffset(50, TimeSpan.Zero), (_, ct) =>
|
|
|
+ {
|
|
|
+ o.OnNext(42);
|
|
|
+ return t;
|
|
|
+ });
|
|
|
+
|
|
|
+ s.ScheduleAsync(new DateTimeOffset(60, TimeSpan.Zero), (_, ct) =>
|
|
|
+ {
|
|
|
+ o.OnNext(43);
|
|
|
+ return d;
|
|
|
+ });
|
|
|
+
|
|
|
+ s.ScheduleAsync(44, new DateTimeOffset(70, TimeSpan.Zero), (_, x, ct) =>
|
|
|
+ {
|
|
|
+ o.OnNext(x);
|
|
|
+ return t;
|
|
|
+ });
|
|
|
+
|
|
|
+ s.ScheduleAsync(45, new DateTimeOffset(80, TimeSpan.Zero), (_, x, ct) =>
|
|
|
+ {
|
|
|
+ o.OnNext(45);
|
|
|
+ return d;
|
|
|
+ });
|
|
|
+
|
|
|
+ s.Start();
|
|
|
+
|
|
|
+ o.Messages.AssertEqual(
|
|
|
+ OnNext(50, 42),
|
|
|
+ OnNext(60, 43),
|
|
|
+ OnNext(70, 44),
|
|
|
+ OnNext(80, 45)
|
|
|
+ );
|
|
|
+ }
|
|
|
+
|
|
|
+ [TestMethod]
|
|
|
+ public void SchedulerAsync_ScheduleAsync_NoCancellation1()
|
|
|
+ {
|
|
|
+ var s = new TestScheduler();
|
|
|
+
|
|
|
+ var o = s.CreateObserver<int>();
|
|
|
+
|
|
|
+ s.ScheduleAsync(async (_, ct) =>
|
|
|
+ {
|
|
|
+ o.OnNext(42);
|
|
|
+
|
|
|
+ await _.Yield();
|
|
|
+
|
|
|
+ o.OnNext(43);
|
|
|
+
|
|
|
+ await _.Sleep(TimeSpan.FromTicks(10));
|
|
|
+
|
|
|
+ o.OnNext(44);
|
|
|
+
|
|
|
+ await _.Sleep(new DateTimeOffset(250, TimeSpan.Zero));
|
|
|
+
|
|
|
+ o.OnNext(45);
|
|
|
+ });
|
|
|
+
|
|
|
+ s.Start();
|
|
|
+
|
|
|
+ o.Messages.AssertEqual(
|
|
|
+ OnNext(1, 42),
|
|
|
+ OnNext(2, 43),
|
|
|
+ OnNext(12, 44),
|
|
|
+ OnNext(250, 45)
|
|
|
+ );
|
|
|
+ }
|
|
|
+
|
|
|
+ [TestMethod]
|
|
|
+ public void SchedulerAsync_ScheduleAsync_NoCancellation2()
|
|
|
+ {
|
|
|
+ var s = new TestScheduler();
|
|
|
+
|
|
|
+ var o = s.CreateObserver<int>();
|
|
|
+
|
|
|
+ s.ScheduleAsync(async (_, ct) =>
|
|
|
+ {
|
|
|
+ o.OnNext(42);
|
|
|
+
|
|
|
+ await _.Yield(ct);
|
|
|
+
|
|
|
+ o.OnNext(43);
|
|
|
+
|
|
|
+ await _.Sleep(TimeSpan.FromTicks(10), ct);
|
|
|
+
|
|
|
+ o.OnNext(44);
|
|
|
+
|
|
|
+ await _.Sleep(new DateTimeOffset(250, TimeSpan.Zero), ct);
|
|
|
+
|
|
|
+ o.OnNext(45);
|
|
|
+ });
|
|
|
+
|
|
|
+ s.Start();
|
|
|
+
|
|
|
+ o.Messages.AssertEqual(
|
|
|
+ OnNext(1, 42),
|
|
|
+ OnNext(2, 43),
|
|
|
+ OnNext(12, 44),
|
|
|
+ OnNext(250, 45)
|
|
|
+ );
|
|
|
+ }
|
|
|
+
|
|
|
+ [TestMethod]
|
|
|
+ public void SchedulerAsync_Awaiters()
|
|
|
+ {
|
|
|
+ var op = Scheduler.Immediate.Yield();
|
|
|
+ var aw = op.GetAwaiter();
|
|
|
+
|
|
|
+ ReactiveAssert.Throws<ArgumentNullException>(() => aw.OnCompleted(null));
|
|
|
+
|
|
|
+ aw.OnCompleted(() => { });
|
|
|
+
|
|
|
+ ReactiveAssert.Throws<InvalidOperationException>(() => aw.OnCompleted(() => { }));
|
|
|
+ }
|
|
|
+
|
|
|
+#if !NO_SYNCCTX
|
|
|
+
|
|
|
+ [TestMethod]
|
|
|
+ public void SchedulerAsync_ScheduleAsync_SyncCtx()
|
|
|
+ {
|
|
|
+ var old = SynchronizationContext.Current;
|
|
|
+
|
|
|
+ try
|
|
|
+ {
|
|
|
+ var ctx = new MySyncCtx();
|
|
|
+ SynchronizationContext.SetSynchronizationContext(ctx);
|
|
|
+
|
|
|
+ var s = new TestScheduler();
|
|
|
+
|
|
|
+ var o = s.CreateObserver<int>();
|
|
|
+
|
|
|
+ s.ScheduleAsync(async (_, ct) =>
|
|
|
+ {
|
|
|
+ Assert.AreSame(ctx, SynchronizationContext.Current);
|
|
|
+
|
|
|
+ o.OnNext(42);
|
|
|
+
|
|
|
+ await _.Yield(ct).ConfigureAwait(true);
|
|
|
+
|
|
|
+ Assert.AreSame(ctx, SynchronizationContext.Current);
|
|
|
+
|
|
|
+ o.OnNext(43);
|
|
|
+
|
|
|
+ await _.Sleep(TimeSpan.FromTicks(10), ct).ConfigureAwait(true);
|
|
|
+
|
|
|
+ Assert.AreSame(ctx, SynchronizationContext.Current);
|
|
|
+
|
|
|
+ o.OnNext(44);
|
|
|
+
|
|
|
+ await _.Sleep(new DateTimeOffset(250, TimeSpan.Zero), ct).ConfigureAwait(true);
|
|
|
+
|
|
|
+ Assert.AreSame(ctx, SynchronizationContext.Current);
|
|
|
+
|
|
|
+ o.OnNext(45);
|
|
|
+ });
|
|
|
+
|
|
|
+ s.Start();
|
|
|
+
|
|
|
+ o.Messages.AssertEqual(
|
|
|
+ OnNext(1, 42),
|
|
|
+ OnNext(2, 43),
|
|
|
+ OnNext(12, 44),
|
|
|
+ OnNext(250, 45)
|
|
|
+ );
|
|
|
+ }
|
|
|
+ finally
|
|
|
+ {
|
|
|
+ SynchronizationContext.SetSynchronizationContext(old);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ class MySyncCtx : SynchronizationContext
|
|
|
+ {
|
|
|
+ public override void Post(SendOrPostCallback d, object state)
|
|
|
+ {
|
|
|
+ d(state);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+#endif
|
|
|
+
|
|
|
#endif
|
|
|
}
|
|
|
}
|