CurrentThreadSchedulerTest.cs 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  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.Threading;
  6. using Microsoft.VisualStudio.TestTools.UnitTesting;
  7. using Microsoft.Reactive.Testing;
  8. namespace ReactiveTests.Tests
  9. {
  10. [TestClass]
  11. public class CurrentThreadSchedulerTest
  12. {
  13. [TestMethod]
  14. public void CurrentThread_ArgumentChecking()
  15. {
  16. ReactiveAssert.Throws<ArgumentNullException>(() => Scheduler.CurrentThread.Schedule(42, default(Func<IScheduler, int, IDisposable>)));
  17. ReactiveAssert.Throws<ArgumentNullException>(() => Scheduler.CurrentThread.Schedule(42, default(TimeSpan), default(Func<IScheduler, int, IDisposable>)));
  18. ReactiveAssert.Throws<ArgumentNullException>(() => Scheduler.CurrentThread.Schedule(42, default(DateTimeOffset), default(Func<IScheduler, int, IDisposable>)));
  19. }
  20. [TestMethod]
  21. public void CurrentThread_Now()
  22. {
  23. var res = Scheduler.CurrentThread.Now - DateTime.Now;
  24. Assert.IsTrue(res.Seconds < 1);
  25. }
  26. [TestMethod]
  27. public void CurrentThread_ScheduleAction()
  28. {
  29. var id = Thread.CurrentThread.ManagedThreadId;
  30. var ran = false;
  31. Scheduler.CurrentThread.Schedule(() => { Assert.AreEqual(id, Thread.CurrentThread.ManagedThreadId); ran = true; });
  32. Assert.IsTrue(ran);
  33. }
  34. [TestMethod]
  35. public void CurrentThread_ScheduleActionError()
  36. {
  37. var ex = new Exception();
  38. try
  39. {
  40. Scheduler.CurrentThread.Schedule(() => { throw ex; });
  41. Assert.Fail();
  42. }
  43. catch (Exception e)
  44. {
  45. Assert.AreSame(e, ex);
  46. }
  47. }
  48. [TestMethod]
  49. public void CurrentThread_ScheduleActionNested()
  50. {
  51. var id = Thread.CurrentThread.ManagedThreadId;
  52. var ran = false;
  53. Scheduler.CurrentThread.Schedule(() => {
  54. Assert.AreEqual(id, Thread.CurrentThread.ManagedThreadId);
  55. Scheduler.CurrentThread.Schedule(() => { ran = true; });
  56. });
  57. Assert.IsTrue(ran);
  58. }
  59. [TestMethod]
  60. public void CurrentThread_ScheduleActionNested_TimeSpan()
  61. {
  62. var id = Thread.CurrentThread.ManagedThreadId;
  63. var ran = false;
  64. Scheduler.CurrentThread.Schedule(() =>
  65. {
  66. Assert.AreEqual(id, Thread.CurrentThread.ManagedThreadId);
  67. Scheduler.CurrentThread.Schedule(TimeSpan.FromSeconds(1), () => { ran = true; });
  68. });
  69. Assert.IsTrue(ran);
  70. }
  71. #if !SILVERLIGHT
  72. [TestMethod]
  73. [Ignore]
  74. public void CurrentThread_ScheduleActionDue()
  75. {
  76. var id = Thread.CurrentThread.ManagedThreadId;
  77. var ran = false;
  78. var sw = new Stopwatch();
  79. sw.Start();
  80. Scheduler.CurrentThread.Schedule(TimeSpan.FromSeconds(0.2), () => { sw.Stop(); Assert.AreEqual(id, Thread.CurrentThread.ManagedThreadId); ran = true; });
  81. Assert.IsTrue(ran, "ran");
  82. Assert.IsTrue(sw.ElapsedMilliseconds > 180, "due " + sw.ElapsedMilliseconds);
  83. }
  84. [TestMethod]
  85. [Ignore]
  86. public void CurrentThread_ScheduleActionDueNested()
  87. {
  88. var id = Thread.CurrentThread.ManagedThreadId;
  89. var ran = false;
  90. var sw = new Stopwatch();
  91. sw.Start();
  92. Scheduler.CurrentThread.Schedule(TimeSpan.FromSeconds(0.2), () => {
  93. sw.Stop();
  94. Assert.AreEqual(id, Thread.CurrentThread.ManagedThreadId);
  95. sw.Start();
  96. Scheduler.CurrentThread.Schedule(TimeSpan.FromSeconds(0.2), () => {
  97. sw.Stop();
  98. ran = true;
  99. });
  100. });
  101. Assert.IsTrue(ran, "ran");
  102. Assert.IsTrue(sw.ElapsedMilliseconds > 380, "due " + sw.ElapsedMilliseconds);
  103. }
  104. #endif
  105. [TestMethod]
  106. public void CurrentThread_EnsureTrampoline()
  107. {
  108. var ran1 = false;
  109. var ran2 = false;
  110. Scheduler.CurrentThread.EnsureTrampoline(() => {
  111. Scheduler.CurrentThread.Schedule(() => { ran1 = true; });
  112. Scheduler.CurrentThread.Schedule(() => { ran2 = true; });
  113. });
  114. Assert.IsTrue(ran1);
  115. Assert.IsTrue(ran2);
  116. }
  117. [TestMethod]
  118. public void CurrentThread_EnsureTrampoline_Nested()
  119. {
  120. var ran1 = false;
  121. var ran2 = false;
  122. Scheduler.CurrentThread.EnsureTrampoline(() =>
  123. {
  124. Scheduler.CurrentThread.EnsureTrampoline(() => { ran1 = true; });
  125. Scheduler.CurrentThread.EnsureTrampoline(() => { ran2 = true; });
  126. });
  127. Assert.IsTrue(ran1);
  128. Assert.IsTrue(ran2);
  129. }
  130. [TestMethod]
  131. public void CurrentThread_EnsureTrampolineAndCancel()
  132. {
  133. var ran1 = false;
  134. var ran2 = false;
  135. Scheduler.CurrentThread.EnsureTrampoline(() =>
  136. {
  137. Scheduler.CurrentThread.Schedule(() => {
  138. ran1 = true;
  139. var d = Scheduler.CurrentThread.Schedule(() => { ran2 = true; });
  140. d.Dispose();
  141. });
  142. });
  143. Assert.IsTrue(ran1);
  144. Assert.IsFalse(ran2);
  145. }
  146. [TestMethod]
  147. public void CurrentThread_EnsureTrampolineAndCancelTimed()
  148. {
  149. var ran1 = false;
  150. var ran2 = false;
  151. Scheduler.CurrentThread.EnsureTrampoline(() =>
  152. {
  153. Scheduler.CurrentThread.Schedule(() =>
  154. {
  155. ran1 = true;
  156. var d = Scheduler.CurrentThread.Schedule(TimeSpan.FromSeconds(1), () => { ran2 = true; });
  157. d.Dispose();
  158. });
  159. });
  160. Assert.IsTrue(ran1);
  161. Assert.IsFalse(ran2);
  162. }
  163. }
  164. }