AwaitTest.cs 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. // Licensed to the .NET Foundation under one or more agreements.
  2. // The .NET Foundation licenses this file to you under the MIT License.
  3. // See the LICENSE file in the project root for more information.
  4. using System;
  5. using System.Reactive.Concurrency;
  6. using System.Reactive.Disposables;
  7. using System.Reactive.Linq;
  8. using System.Reactive.Subjects;
  9. using System.Threading;
  10. using Microsoft.Reactive.Testing;
  11. using Microsoft.VisualStudio.TestTools.UnitTesting;
  12. using Assert = Xunit.Assert;
  13. namespace ReactiveTests.Tests
  14. {
  15. [TestClass]
  16. public class AwaitTest : ReactiveTest
  17. {
  18. [TestMethod]
  19. public void Await_ArgumentChecking()
  20. {
  21. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.GetAwaiter(default(IObservable<int>)));
  22. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.GetAwaiter<int>(default));
  23. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.GetAwaiter(Observable.Empty<int>()).OnCompleted(null));
  24. }
  25. [TestMethod]
  26. public void Await()
  27. {
  28. SynchronizationContext.SetSynchronizationContext(null);
  29. var scheduler = new TestScheduler();
  30. var xs = scheduler.CreateHotObservable(
  31. OnNext(20, -1),
  32. OnNext(150, 0),
  33. OnNext(220, 1),
  34. OnNext(290, 2),
  35. OnNext(340, 3),
  36. OnCompleted<int>(410)
  37. );
  38. var awaiter = default(AsyncSubject<int>);
  39. var result = default(int);
  40. var t = long.MaxValue;
  41. scheduler.ScheduleAbsolute(100, () => awaiter = xs.GetAwaiter());
  42. scheduler.ScheduleAbsolute(200, () => awaiter.OnCompleted(() => { t = scheduler.Clock; result = awaiter.GetResult(); }));
  43. scheduler.Start();
  44. Assert.Equal(410, t);
  45. Assert.Equal(3, result);
  46. xs.Subscriptions.AssertEqual(
  47. Subscribe(100)
  48. );
  49. }
  50. [TestMethod]
  51. public void Await_Connectable()
  52. {
  53. SynchronizationContext.SetSynchronizationContext(null);
  54. var scheduler = new TestScheduler();
  55. var s = default(long);
  56. var xs = Observable.Create<int>(observer =>
  57. {
  58. s = scheduler.Clock;
  59. return StableCompositeDisposable.Create(
  60. scheduler.ScheduleAbsolute(250, () => { observer.OnNext(42); }),
  61. scheduler.ScheduleAbsolute(260, () => { observer.OnCompleted(); })
  62. );
  63. });
  64. var ys = xs.Publish();
  65. var awaiter = default(AsyncSubject<int>);
  66. var result = default(int);
  67. var t = long.MaxValue;
  68. scheduler.ScheduleAbsolute(100, () => awaiter = ys.GetAwaiter());
  69. scheduler.ScheduleAbsolute(200, () => awaiter.OnCompleted(() => { t = scheduler.Clock; result = awaiter.GetResult(); }));
  70. scheduler.Start();
  71. Assert.Equal(100, s);
  72. Assert.Equal(260, t);
  73. Assert.Equal(42, result);
  74. }
  75. [TestMethod]
  76. public void Await_Error()
  77. {
  78. SynchronizationContext.SetSynchronizationContext(null);
  79. var scheduler = new TestScheduler();
  80. var ex = new Exception();
  81. var xs = scheduler.CreateHotObservable(
  82. OnNext(20, -1),
  83. OnNext(150, 0),
  84. OnNext(220, 1),
  85. OnNext(290, 2),
  86. OnNext(340, 3),
  87. OnError<int>(410, ex)
  88. );
  89. var awaiter = default(AsyncSubject<int>);
  90. var t = long.MaxValue;
  91. scheduler.ScheduleAbsolute(100, () => awaiter = xs.GetAwaiter());
  92. scheduler.ScheduleAbsolute(200, () => awaiter.OnCompleted(() => { t = scheduler.Clock; ReactiveAssert.Throws(ex, () => awaiter.GetResult()); }));
  93. scheduler.Start();
  94. Assert.Equal(410, t);
  95. xs.Subscriptions.AssertEqual(
  96. Subscribe(100)
  97. );
  98. }
  99. [TestMethod]
  100. public void Await_Never()
  101. {
  102. SynchronizationContext.SetSynchronizationContext(null);
  103. var scheduler = new TestScheduler();
  104. var xs = scheduler.CreateHotObservable(
  105. OnNext(20, -1),
  106. OnNext(150, 0),
  107. OnNext(220, 1),
  108. OnNext(290, 2),
  109. OnNext(340, 3)
  110. );
  111. var awaiter = default(AsyncSubject<int>);
  112. var hasValue = default(bool);
  113. var t = long.MaxValue;
  114. scheduler.ScheduleAbsolute(100, () => awaiter = xs.GetAwaiter());
  115. scheduler.ScheduleAbsolute(200, () => awaiter.OnCompleted(() => { t = scheduler.Clock; awaiter.GetResult(); hasValue = true; }));
  116. scheduler.Start();
  117. Assert.Equal(long.MaxValue, t);
  118. Assert.False(hasValue);
  119. xs.Subscriptions.AssertEqual(
  120. Subscribe(100)
  121. );
  122. }
  123. [TestMethod]
  124. public void Await_Empty()
  125. {
  126. SynchronizationContext.SetSynchronizationContext(null);
  127. var scheduler = new TestScheduler();
  128. var xs = scheduler.CreateHotObservable(
  129. OnCompleted<int>(300)
  130. );
  131. var awaiter = default(AsyncSubject<int>);
  132. var t = long.MaxValue;
  133. scheduler.ScheduleAbsolute(100, () => awaiter = xs.GetAwaiter());
  134. scheduler.ScheduleAbsolute(200, () => awaiter.OnCompleted(() => { t = scheduler.Clock; ReactiveAssert.Throws<InvalidOperationException>(() => awaiter.GetResult()); }));
  135. scheduler.Start();
  136. Assert.Equal(300, t);
  137. xs.Subscriptions.AssertEqual(
  138. Subscribe(100)
  139. );
  140. }
  141. }
  142. }