FinallyTest.cs 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  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.Reactive.Linq;
  6. using Microsoft.Reactive.Testing;
  7. using Xunit;
  8. namespace ReactiveTests.Tests
  9. {
  10. public class FinallyTest : ReactiveTest
  11. {
  12. [Fact]
  13. public void Finally_ArgumentChecking()
  14. {
  15. var someObservable = Observable.Empty<int>();
  16. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Finally<int>(null, () => { }));
  17. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Finally(someObservable, null));
  18. }
  19. [Fact]
  20. public void Finally_Never()
  21. {
  22. var scheduler = new TestScheduler();
  23. var invoked = false;
  24. var res = scheduler.Start(() =>
  25. Observable.Never<int>().Finally(() => { invoked = true; })
  26. );
  27. res.Messages.AssertEqual(
  28. );
  29. Assert.True(invoked); // due to unsubscribe; see 1356
  30. }
  31. [Fact]
  32. public void Finally_OnlyCalledOnce_Never()
  33. {
  34. var invokeCount = 0;
  35. var someObservable = Observable.Never<int>().Finally(() => { invokeCount++; });
  36. var d = someObservable.Subscribe();
  37. d.Dispose();
  38. d.Dispose();
  39. Assert.Equal(1, invokeCount);
  40. }
  41. [Fact]
  42. public void Finally_OnlyCalledOnce_Empty()
  43. {
  44. var invokeCount = 0;
  45. var someObservable = Observable.Empty<int>().Finally(() => { invokeCount++; });
  46. var d = someObservable.Subscribe();
  47. d.Dispose();
  48. d.Dispose();
  49. Assert.Equal(1, invokeCount);
  50. }
  51. [Fact]
  52. public void Finally_Empty()
  53. {
  54. var scheduler = new TestScheduler();
  55. var xs = scheduler.CreateHotObservable(
  56. OnNext(150, 1),
  57. OnCompleted<int>(250)
  58. );
  59. var invoked = false;
  60. var res = scheduler.Start(() =>
  61. xs.Finally(() => { invoked = true; })
  62. );
  63. Assert.True(invoked);
  64. res.Messages.AssertEqual(
  65. OnCompleted<int>(250)
  66. );
  67. xs.Subscriptions.AssertEqual(
  68. Subscribe(200, 250)
  69. );
  70. }
  71. [Fact]
  72. public void Finally_Return()
  73. {
  74. var scheduler = new TestScheduler();
  75. var xs = scheduler.CreateHotObservable(
  76. OnNext(150, 1),
  77. OnNext(210, 2),
  78. OnCompleted<int>(250)
  79. );
  80. var invoked = false;
  81. var res = scheduler.Start(() =>
  82. xs.Finally(() => { invoked = true; })
  83. );
  84. Assert.True(invoked);
  85. res.Messages.AssertEqual(
  86. OnNext(210, 2),
  87. OnCompleted<int>(250)
  88. );
  89. xs.Subscriptions.AssertEqual(
  90. Subscribe(200, 250)
  91. );
  92. }
  93. [Fact]
  94. public void Finally_Throw()
  95. {
  96. var scheduler = new TestScheduler();
  97. var ex = new Exception();
  98. var xs = scheduler.CreateHotObservable(
  99. OnNext(150, 1),
  100. OnError<int>(250, ex)
  101. );
  102. var invoked = false;
  103. var res = scheduler.Start(() =>
  104. xs.Finally(() => { invoked = true; })
  105. );
  106. Assert.True(invoked);
  107. res.Messages.AssertEqual(
  108. OnError<int>(250, ex)
  109. );
  110. xs.Subscriptions.AssertEqual(
  111. Subscribe(200, 250)
  112. );
  113. }
  114. }
  115. }