|
@@ -26,16 +26,18 @@ namespace ReactiveTests.Tests
|
|
|
[Fact]
|
|
|
public void Current()
|
|
|
{
|
|
|
- var d = DispatcherHelpers.EnsureDispatcher();
|
|
|
- var e = new ManualResetEvent(false);
|
|
|
-
|
|
|
- d.BeginInvoke(() =>
|
|
|
+ using (DispatcherHelpers.RunTest(out var d))
|
|
|
{
|
|
|
- var c = DispatcherScheduler.Current;
|
|
|
- c.Schedule(() => { e.Set(); });
|
|
|
- });
|
|
|
+ var e = new ManualResetEvent(false);
|
|
|
+
|
|
|
+ d.BeginInvoke(() =>
|
|
|
+ {
|
|
|
+ var c = DispatcherScheduler.Current;
|
|
|
+ c.Schedule(() => { e.Set(); });
|
|
|
+ });
|
|
|
|
|
|
- e.WaitOne();
|
|
|
+ e.WaitOne();
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
[Fact]
|
|
@@ -64,69 +66,76 @@ namespace ReactiveTests.Tests
|
|
|
[Fact]
|
|
|
public void Dispatcher()
|
|
|
{
|
|
|
- var disp = DispatcherHelpers.EnsureDispatcher();
|
|
|
- Assert.Same(disp.Dispatcher, new DispatcherScheduler(disp).Dispatcher);
|
|
|
+ using (DispatcherHelpers.RunTest(out var disp))
|
|
|
+ {
|
|
|
+ Assert.Same(disp.Dispatcher, new DispatcherScheduler(disp).Dispatcher);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
[Fact]
|
|
|
public void Now()
|
|
|
{
|
|
|
- var disp = DispatcherHelpers.EnsureDispatcher();
|
|
|
- var res = new DispatcherScheduler(disp).Now - DateTime.Now;
|
|
|
- Assert.True(res.Seconds < 1);
|
|
|
+ using (DispatcherHelpers.RunTest(out var disp))
|
|
|
+ {
|
|
|
+ var res = new DispatcherScheduler(disp).Now - DateTime.Now;
|
|
|
+ Assert.True(res.Seconds < 1);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
[Fact]
|
|
|
public void Schedule_ArgumentChecking()
|
|
|
{
|
|
|
- var disp = DispatcherHelpers.EnsureDispatcher();
|
|
|
- var s = new DispatcherScheduler(disp);
|
|
|
- ReactiveAssert.Throws<ArgumentNullException>(() => s.Schedule(42, default(Func<IScheduler, int, IDisposable>)));
|
|
|
- ReactiveAssert.Throws<ArgumentNullException>(() => s.Schedule(42, TimeSpan.FromSeconds(1), default(Func<IScheduler, int, IDisposable>)));
|
|
|
- ReactiveAssert.Throws<ArgumentNullException>(() => s.Schedule(42, DateTimeOffset.Now, default(Func<IScheduler, int, IDisposable>)));
|
|
|
+ using (DispatcherHelpers.RunTest(out var disp))
|
|
|
+ {
|
|
|
+ var s = new DispatcherScheduler(disp);
|
|
|
+ ReactiveAssert.Throws<ArgumentNullException>(() => s.Schedule(42, default(Func<IScheduler, int, IDisposable>)));
|
|
|
+ ReactiveAssert.Throws<ArgumentNullException>(() => s.Schedule(42, TimeSpan.FromSeconds(1), default(Func<IScheduler, int, IDisposable>)));
|
|
|
+ ReactiveAssert.Throws<ArgumentNullException>(() => s.Schedule(42, DateTimeOffset.Now, default(Func<IScheduler, int, IDisposable>)));
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
[Fact]
|
|
|
[Asynchronous]
|
|
|
public void Schedule()
|
|
|
{
|
|
|
- var disp = DispatcherHelpers.EnsureDispatcher();
|
|
|
-
|
|
|
- RunAsync(evt =>
|
|
|
+ using (DispatcherHelpers.RunTest(out var disp))
|
|
|
{
|
|
|
- var id = Thread.CurrentThread.ManagedThreadId;
|
|
|
- var sch = new DispatcherScheduler(disp);
|
|
|
- sch.Schedule(() =>
|
|
|
+ RunAsync(evt =>
|
|
|
{
|
|
|
- Assert.NotEqual(id, Thread.CurrentThread.ManagedThreadId);
|
|
|
- disp.InvokeShutdown();
|
|
|
- evt.Set();
|
|
|
+ var id = Thread.CurrentThread.ManagedThreadId;
|
|
|
+ var sch = new DispatcherScheduler(disp);
|
|
|
+ sch.Schedule(() =>
|
|
|
+ {
|
|
|
+ Assert.NotEqual(id, Thread.CurrentThread.ManagedThreadId);
|
|
|
+ evt.Set();
|
|
|
+ });
|
|
|
});
|
|
|
- });
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
[Fact]
|
|
|
public void ScheduleError()
|
|
|
{
|
|
|
- var ex = new Exception();
|
|
|
+ using (DispatcherHelpers.RunTest(out var disp))
|
|
|
+ {
|
|
|
+ var ex = new Exception();
|
|
|
|
|
|
- var id = Thread.CurrentThread.ManagedThreadId;
|
|
|
- var disp = DispatcherHelpers.EnsureDispatcher();
|
|
|
- var evt = new ManualResetEvent(false);
|
|
|
+ var id = Thread.CurrentThread.ManagedThreadId;
|
|
|
+ var evt = new ManualResetEvent(false);
|
|
|
|
|
|
- Exception thrownEx = null;
|
|
|
- disp.UnhandledException += (o, e) =>
|
|
|
- {
|
|
|
- thrownEx = e.Exception;
|
|
|
- evt.Set();
|
|
|
- e.Handled = true;
|
|
|
- };
|
|
|
- var sch = new DispatcherScheduler(disp);
|
|
|
- sch.Schedule(() => { throw ex; });
|
|
|
- evt.WaitOne();
|
|
|
- disp.InvokeShutdown();
|
|
|
-
|
|
|
- Assert.Same(ex, thrownEx);
|
|
|
+ Exception thrownEx = null;
|
|
|
+ disp.UnhandledException += (o, e) =>
|
|
|
+ {
|
|
|
+ thrownEx = e.Exception;
|
|
|
+ evt.Set();
|
|
|
+ e.Handled = true;
|
|
|
+ };
|
|
|
+ var sch = new DispatcherScheduler(disp);
|
|
|
+ sch.Schedule(() => { throw ex; });
|
|
|
+ evt.WaitOne();
|
|
|
+
|
|
|
+ Assert.Same(ex, thrownEx);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
[Fact]
|
|
@@ -143,111 +152,116 @@ namespace ReactiveTests.Tests
|
|
|
|
|
|
private void ScheduleRelative_(TimeSpan delay)
|
|
|
{
|
|
|
- var evt = new ManualResetEvent(false);
|
|
|
-
|
|
|
- var id = Thread.CurrentThread.ManagedThreadId;
|
|
|
+ using (DispatcherHelpers.RunTest(out var disp))
|
|
|
+ {
|
|
|
+ var evt = new ManualResetEvent(false);
|
|
|
|
|
|
- var disp = DispatcherHelpers.EnsureDispatcher();
|
|
|
- var sch = new DispatcherScheduler(disp);
|
|
|
+ var id = Thread.CurrentThread.ManagedThreadId;
|
|
|
|
|
|
- sch.Schedule(delay, () =>
|
|
|
- {
|
|
|
- Assert.NotEqual(id, Thread.CurrentThread.ManagedThreadId);
|
|
|
+ var sch = new DispatcherScheduler(disp);
|
|
|
|
|
|
sch.Schedule(delay, () =>
|
|
|
{
|
|
|
Assert.NotEqual(id, Thread.CurrentThread.ManagedThreadId);
|
|
|
- evt.Set();
|
|
|
+
|
|
|
+ sch.Schedule(delay, () =>
|
|
|
+ {
|
|
|
+ Assert.NotEqual(id, Thread.CurrentThread.ManagedThreadId);
|
|
|
+ evt.Set();
|
|
|
+ });
|
|
|
});
|
|
|
- });
|
|
|
|
|
|
- evt.WaitOne();
|
|
|
- disp.InvokeShutdown();
|
|
|
+ evt.WaitOne();
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
[Fact]
|
|
|
public void ScheduleRelative_Cancel()
|
|
|
{
|
|
|
- var evt = new ManualResetEvent(false);
|
|
|
-
|
|
|
- var id = Thread.CurrentThread.ManagedThreadId;
|
|
|
-
|
|
|
- var disp = DispatcherHelpers.EnsureDispatcher();
|
|
|
- var sch = new DispatcherScheduler(disp);
|
|
|
-
|
|
|
- sch.Schedule(TimeSpan.FromSeconds(0.1), () =>
|
|
|
+ using (DispatcherHelpers.RunTest(out var disp))
|
|
|
{
|
|
|
- Assert.NotEqual(id, Thread.CurrentThread.ManagedThreadId);
|
|
|
+ var evt = new ManualResetEvent(false);
|
|
|
+
|
|
|
+ var id = Thread.CurrentThread.ManagedThreadId;
|
|
|
|
|
|
- var d = sch.Schedule(TimeSpan.FromSeconds(0.1), () =>
|
|
|
+ var sch = new DispatcherScheduler(disp);
|
|
|
+
|
|
|
+ sch.Schedule(TimeSpan.FromSeconds(0.1), () =>
|
|
|
{
|
|
|
- Assert.True(false);
|
|
|
- evt.Set();
|
|
|
- });
|
|
|
+ Assert.NotEqual(id, Thread.CurrentThread.ManagedThreadId);
|
|
|
|
|
|
- sch.Schedule(() =>
|
|
|
- {
|
|
|
- d.Dispose();
|
|
|
- });
|
|
|
+ var d = sch.Schedule(TimeSpan.FromSeconds(0.1), () =>
|
|
|
+ {
|
|
|
+ Assert.True(false);
|
|
|
+ evt.Set();
|
|
|
+ });
|
|
|
|
|
|
- sch.Schedule(TimeSpan.FromSeconds(0.2), () =>
|
|
|
- {
|
|
|
- Assert.NotEqual(id, Thread.CurrentThread.ManagedThreadId);
|
|
|
- evt.Set();
|
|
|
+ sch.Schedule(() =>
|
|
|
+ {
|
|
|
+ d.Dispose();
|
|
|
+ });
|
|
|
+
|
|
|
+ sch.Schedule(TimeSpan.FromSeconds(0.2), () =>
|
|
|
+ {
|
|
|
+ Assert.NotEqual(id, Thread.CurrentThread.ManagedThreadId);
|
|
|
+ evt.Set();
|
|
|
+ });
|
|
|
});
|
|
|
- });
|
|
|
|
|
|
- evt.WaitOne();
|
|
|
- disp.InvokeShutdown();
|
|
|
+ evt.WaitOne();
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
[Fact]
|
|
|
public void SchedulePeriodic_ArgumentChecking()
|
|
|
{
|
|
|
- var disp = DispatcherHelpers.EnsureDispatcher();
|
|
|
- var s = new DispatcherScheduler(disp);
|
|
|
+ using (DispatcherHelpers.RunTest(out var disp))
|
|
|
+ {
|
|
|
+ var s = new DispatcherScheduler(disp);
|
|
|
|
|
|
- ReactiveAssert.Throws<ArgumentNullException>(() => s.SchedulePeriodic(42, TimeSpan.FromSeconds(1), default(Func<int, int>)));
|
|
|
- ReactiveAssert.Throws<ArgumentOutOfRangeException>(() => s.SchedulePeriodic(42, TimeSpan.FromSeconds(-1), x => x));
|
|
|
+ ReactiveAssert.Throws<ArgumentNullException>(() => s.SchedulePeriodic(42, TimeSpan.FromSeconds(1), default(Func<int, int>)));
|
|
|
+ ReactiveAssert.Throws<ArgumentOutOfRangeException>(() => s.SchedulePeriodic(42, TimeSpan.FromSeconds(-1), x => x));
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
[Fact]
|
|
|
public void SchedulePeriodic()
|
|
|
{
|
|
|
- var evt = new ManualResetEvent(false);
|
|
|
-
|
|
|
- var id = Thread.CurrentThread.ManagedThreadId;
|
|
|
+ using (DispatcherHelpers.RunTest(out var disp))
|
|
|
+ {
|
|
|
+ var evt = new ManualResetEvent(false);
|
|
|
|
|
|
- var disp = DispatcherHelpers.EnsureDispatcher();
|
|
|
- var sch = new DispatcherScheduler(disp);
|
|
|
+ var id = Thread.CurrentThread.ManagedThreadId;
|
|
|
|
|
|
- var d = new SingleAssignmentDisposable();
|
|
|
+ var sch = new DispatcherScheduler(disp);
|
|
|
|
|
|
- d.Disposable = sch.SchedulePeriodic(1, TimeSpan.FromSeconds(0.1), n =>
|
|
|
- {
|
|
|
- Assert.NotEqual(id, Thread.CurrentThread.ManagedThreadId);
|
|
|
+ var d = new SingleAssignmentDisposable();
|
|
|
|
|
|
- if (n == 3)
|
|
|
+ d.Disposable = sch.SchedulePeriodic(1, TimeSpan.FromSeconds(0.1), n =>
|
|
|
{
|
|
|
- d.Dispose();
|
|
|
+ Assert.NotEqual(id, Thread.CurrentThread.ManagedThreadId);
|
|
|
|
|
|
- sch.Schedule(TimeSpan.FromSeconds(0.2), () =>
|
|
|
+ if (n == 3)
|
|
|
{
|
|
|
- Assert.NotEqual(id, Thread.CurrentThread.ManagedThreadId);
|
|
|
- evt.Set();
|
|
|
- });
|
|
|
- }
|
|
|
+ d.Dispose();
|
|
|
|
|
|
- if (n > 3)
|
|
|
- {
|
|
|
- Assert.True(false);
|
|
|
- }
|
|
|
+ sch.Schedule(TimeSpan.FromSeconds(0.2), () =>
|
|
|
+ {
|
|
|
+ Assert.NotEqual(id, Thread.CurrentThread.ManagedThreadId);
|
|
|
+ evt.Set();
|
|
|
+ });
|
|
|
+ }
|
|
|
|
|
|
- return n + 1;
|
|
|
- });
|
|
|
+ if (n > 3)
|
|
|
+ {
|
|
|
+ Assert.True(false);
|
|
|
+ }
|
|
|
+
|
|
|
+ return n + 1;
|
|
|
+ });
|
|
|
|
|
|
- evt.WaitOne();
|
|
|
- disp.InvokeShutdown();
|
|
|
+ evt.WaitOne();
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
}
|