ImmediateSchedulerTest.cs 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.
  2. using System;
  3. using System.Diagnostics;
  4. using System.Reactive.Concurrency;
  5. using System.Reactive.Disposables;
  6. using System.Threading;
  7. using Microsoft.Reactive.Testing;
  8. using Xunit;
  9. namespace ReactiveTests.Tests
  10. {
  11. public class ImmediateSchedulerTest
  12. {
  13. [Fact]
  14. public void Immediate_Now()
  15. {
  16. var res = Scheduler.Immediate.Now - DateTime.Now;
  17. Assert.True(res.Seconds < 1);
  18. }
  19. #if !NO_THREAD
  20. [Fact]
  21. public void Immediate_ScheduleAction()
  22. {
  23. var id = Thread.CurrentThread.ManagedThreadId;
  24. var ran = false;
  25. Scheduler.Immediate.Schedule(() => { Assert.Equal(id, Thread.CurrentThread.ManagedThreadId); ran = true; });
  26. Assert.True(ran);
  27. }
  28. #endif
  29. [Fact]
  30. public void Immediate_ScheduleActionError()
  31. {
  32. var ex = new Exception();
  33. try
  34. {
  35. Scheduler.Immediate.Schedule(() => { throw ex; });
  36. Assert.True(false);
  37. }
  38. catch (Exception e)
  39. {
  40. Assert.Same(e, ex);
  41. }
  42. }
  43. [Fact]
  44. public void Immediate_ArgumentChecking()
  45. {
  46. ReactiveAssert.Throws<ArgumentNullException>(() => Scheduler.Immediate.Schedule<int>(42, default(Func<IScheduler, int, IDisposable>)));
  47. ReactiveAssert.Throws<ArgumentNullException>(() => Scheduler.Immediate.Schedule<int>(42, DateTimeOffset.Now, default(Func<IScheduler, int, IDisposable>)));
  48. ReactiveAssert.Throws<ArgumentNullException>(() => Scheduler.Immediate.Schedule<int>(42, TimeSpan.Zero, default(Func<IScheduler, int, IDisposable>)));
  49. }
  50. [Fact]
  51. public void Immediate_Simple1()
  52. {
  53. var _x = 0;
  54. Scheduler.Immediate.Schedule<int>(42, (self, x) => { _x = x; return Disposable.Empty; });
  55. Assert.Equal(42, _x);
  56. }
  57. [Fact]
  58. public void Immediate_Simple2()
  59. {
  60. var _x = 0;
  61. Scheduler.Immediate.Schedule<int>(42, DateTimeOffset.Now, (self, x) => { _x = x; return Disposable.Empty; });
  62. Assert.Equal(42, _x);
  63. }
  64. [Fact]
  65. public void Immediate_Simple3()
  66. {
  67. var _x = 0;
  68. Scheduler.Immediate.Schedule<int>(42, TimeSpan.Zero, (self, x) => { _x = x; return Disposable.Empty; });
  69. Assert.Equal(42, _x);
  70. }
  71. [Fact]
  72. public void Immediate_Recursive1()
  73. {
  74. var _x = 0;
  75. var _y = 0;
  76. Scheduler.Immediate.Schedule<int>(42, (self, x) => { _x = x; return self.Schedule<int>(43, (self2, y) => { _y = y; return Disposable.Empty; }); });
  77. Assert.Equal(42, _x);
  78. Assert.Equal(43, _y);
  79. }
  80. [Fact]
  81. public void Immediate_Recursive2()
  82. {
  83. var _x = 0;
  84. var _y = 0;
  85. Scheduler.Immediate.Schedule<int>(42, (self, x) => { _x = x; return self.Schedule<int>(43, DateTimeOffset.Now, (self2, y) => { _y = y; return Disposable.Empty; }); });
  86. Assert.Equal(42, _x);
  87. Assert.Equal(43, _y);
  88. }
  89. [Fact]
  90. public void Immediate_Recursive3()
  91. {
  92. var _x = 0;
  93. var _y = 0;
  94. Scheduler.Immediate.Schedule<int>(42, (self, x) => { _x = x; return self.Schedule<int>(43, TimeSpan.FromMilliseconds(100), (self2, y) => { _y = y; return Disposable.Empty; }); });
  95. Assert.Equal(42, _x);
  96. Assert.Equal(43, _y);
  97. }
  98. [Fact]
  99. public void Immediate_ArgumentChecking_More()
  100. {
  101. Scheduler.Immediate.Schedule(42, (self, state) =>
  102. {
  103. ReactiveAssert.Throws<ArgumentNullException>(() =>
  104. {
  105. self.Schedule(43, default(Func<IScheduler, int, IDisposable>));
  106. });
  107. return Disposable.Empty;
  108. });
  109. Scheduler.Immediate.Schedule(42, (self, state) =>
  110. {
  111. ReactiveAssert.Throws<ArgumentNullException>(() =>
  112. {
  113. self.Schedule(43, TimeSpan.FromSeconds(1), default(Func<IScheduler, int, IDisposable>));
  114. });
  115. return Disposable.Empty;
  116. });
  117. Scheduler.Immediate.Schedule(42, (self, state) =>
  118. {
  119. ReactiveAssert.Throws<ArgumentNullException>(() =>
  120. {
  121. self.Schedule(43, DateTimeOffset.UtcNow.AddDays(1), default(Func<IScheduler, int, IDisposable>));
  122. });
  123. return Disposable.Empty;
  124. });
  125. }
  126. #if !SILVERLIGHT && !NO_THREAD
  127. [Fact(Skip="Ignored")]
  128. public void Immediate_ScheduleActionDue()
  129. {
  130. var id = Thread.CurrentThread.ManagedThreadId;
  131. var ran = false;
  132. var sw = new Stopwatch();
  133. sw.Start();
  134. Scheduler.Immediate.Schedule(TimeSpan.FromSeconds(0.2), () => { sw.Stop(); Assert.Equal(id, Thread.CurrentThread.ManagedThreadId); ran = true; });
  135. Assert.True(ran, "ran");
  136. Assert.True(sw.ElapsedMilliseconds > 180, "due " + sw.ElapsedMilliseconds);
  137. }
  138. #endif
  139. }
  140. }