DeferTest.cs 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. // Licensed to the .NET Foundation under one or more agreements.
  2. // The .NET Foundation licenses this file to you under the Apache 2.0 License.
  3. // See the LICENSE file in the project root for more information.
  4. using System;
  5. using System.Collections.Generic;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. using System.Reactive;
  10. using System.Reactive.Concurrency;
  11. using System.Reactive.Linq;
  12. using Microsoft.Reactive.Testing;
  13. using Xunit;
  14. using ReactiveTests.Dummies;
  15. using System.Reflection;
  16. using System.Threading;
  17. using System.Reactive.Disposables;
  18. using System.Reactive.Subjects;
  19. namespace ReactiveTests.Tests
  20. {
  21. public class DeferTest : ReactiveTest
  22. {
  23. [Fact]
  24. public void Defer_ArgumentChecking()
  25. {
  26. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Defer<int>(default(Func<IObservable<int>>)));
  27. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Defer(() => DummyObservable<int>.Instance).Subscribe(null));
  28. ReactiveAssert.Throws</*some*/Exception>(() => Observable.Defer<int>(() => default(IObservable<int>)).Subscribe());
  29. }
  30. [Fact]
  31. public void Defer_Complete()
  32. {
  33. var scheduler = new TestScheduler();
  34. var invoked = 0;
  35. var xs = default(ITestableObservable<long>);
  36. var res = scheduler.Start(() =>
  37. Observable.Defer(() =>
  38. {
  39. invoked++;
  40. xs = scheduler.CreateColdObservable(
  41. OnNext<long>(100, scheduler.Clock),
  42. OnCompleted<long>(200));
  43. return xs;
  44. })
  45. );
  46. res.Messages.AssertEqual(
  47. OnNext(300, 200L),
  48. OnCompleted<long>(400)
  49. );
  50. Assert.Equal(1, invoked);
  51. xs.Subscriptions.AssertEqual(
  52. Subscribe(200, 400)
  53. );
  54. }
  55. [Fact]
  56. public void Defer_Error()
  57. {
  58. var scheduler = new TestScheduler();
  59. var invoked = 0;
  60. var xs = default(ITestableObservable<long>);
  61. var ex = new Exception();
  62. var res = scheduler.Start(() =>
  63. Observable.Defer(() =>
  64. {
  65. invoked++;
  66. xs = scheduler.CreateColdObservable(
  67. OnNext<long>(100, scheduler.Clock),
  68. OnError<long>(200, ex));
  69. return xs;
  70. })
  71. );
  72. res.Messages.AssertEqual(
  73. OnNext(300, 200L),
  74. OnError<long>(400, ex)
  75. );
  76. Assert.Equal(1, invoked);
  77. xs.Subscriptions.AssertEqual(
  78. Subscribe(200, 400)
  79. );
  80. }
  81. [Fact]
  82. public void Defer_Dispose()
  83. {
  84. var scheduler = new TestScheduler();
  85. var invoked = 0;
  86. var xs = default(ITestableObservable<long>);
  87. var res = scheduler.Start(() =>
  88. Observable.Defer(() =>
  89. {
  90. invoked++;
  91. xs = scheduler.CreateColdObservable(
  92. OnNext<long>(100, scheduler.Clock),
  93. OnNext<long>(200, invoked),
  94. OnNext<long>(1100, 1000));
  95. return xs;
  96. })
  97. );
  98. res.Messages.AssertEqual(
  99. OnNext(300, 200L),
  100. OnNext(400, 1L)
  101. );
  102. Assert.Equal(1, invoked);
  103. xs.Subscriptions.AssertEqual(
  104. Subscribe(200, 1000)
  105. );
  106. }
  107. [Fact]
  108. public void Defer_Throw()
  109. {
  110. var scheduler = new TestScheduler();
  111. var invoked = 0;
  112. var ex = new Exception();
  113. var res = scheduler.Start(() =>
  114. Observable.Defer<int>(new Func<IObservable<int>>(() =>
  115. {
  116. invoked++;
  117. throw ex;
  118. }))
  119. );
  120. res.Messages.AssertEqual(
  121. OnError<int>(200, ex)
  122. );
  123. Assert.Equal(1, invoked);
  124. }
  125. }
  126. }