CurrentThreadSchedulerTest.cs 6.0 KB

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