CastTest.cs 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232
  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 CastTest : ReactiveTest
  22. {
  23. [Fact]
  24. public void Cast_ArgumentChecking()
  25. {
  26. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Cast<bool>(default(IObservable<object>)));
  27. ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Cast<bool>(DummyObservable<object>.Instance).Subscribe(null));
  28. }
  29. [Fact]
  30. public void Cast_Complete()
  31. {
  32. var scheduler = new TestScheduler();
  33. var xs = scheduler.CreateHotObservable<object>(
  34. OnNext<object>(210, new B(0)),
  35. OnNext<object>(220, new D(1)),
  36. OnNext<object>(240, new B(2)),
  37. OnNext<object>(270, new D(3)),
  38. OnCompleted<object>(300)
  39. );
  40. var res = scheduler.Start(() =>
  41. xs.Cast<B>()
  42. );
  43. res.Messages.AssertEqual(
  44. OnNext<B>(210, new B(0)),
  45. OnNext<B>(220, new D(1)),
  46. OnNext<B>(240, new B(2)),
  47. OnNext<B>(270, new D(3)),
  48. OnCompleted<B>(300)
  49. );
  50. xs.Subscriptions.AssertEqual(
  51. Subscribe(200, 300)
  52. );
  53. }
  54. [Fact]
  55. public void Cast_Error()
  56. {
  57. var scheduler = new TestScheduler();
  58. var ex = new Exception();
  59. var xs = scheduler.CreateHotObservable<object>(
  60. OnNext<object>(210, new B(0)),
  61. OnNext<object>(220, new D(1)),
  62. OnNext<object>(240, new B(2)),
  63. OnNext<object>(270, new D(3)),
  64. OnError<object>(300, ex)
  65. );
  66. var res = scheduler.Start(() =>
  67. xs.Cast<B>()
  68. );
  69. res.Messages.AssertEqual(
  70. OnNext<B>(210, new B(0)),
  71. OnNext<B>(220, new D(1)),
  72. OnNext<B>(240, new B(2)),
  73. OnNext<B>(270, new D(3)),
  74. OnError<B>(300, ex)
  75. );
  76. xs.Subscriptions.AssertEqual(
  77. Subscribe(200, 300)
  78. );
  79. }
  80. [Fact]
  81. public void Cast_Dispose()
  82. {
  83. var scheduler = new TestScheduler();
  84. var xs = scheduler.CreateHotObservable<object>(
  85. OnNext<object>(210, new B(0)),
  86. OnNext<object>(220, new D(1)),
  87. OnNext<object>(240, new B(2)),
  88. OnNext<object>(270, new D(3)),
  89. OnCompleted<object>(300)
  90. );
  91. var res = scheduler.Start(() =>
  92. xs.Cast<B>(),
  93. 250
  94. );
  95. res.Messages.AssertEqual(
  96. OnNext<B>(210, new B(0)),
  97. OnNext<B>(220, new D(1)),
  98. OnNext<B>(240, new B(2))
  99. );
  100. xs.Subscriptions.AssertEqual(
  101. Subscribe(200, 250)
  102. );
  103. }
  104. [Fact]
  105. public void Cast_NotValid()
  106. {
  107. var scheduler = new TestScheduler();
  108. var xs = scheduler.CreateHotObservable<object>(
  109. OnNext<object>(210, new B(0)),
  110. OnNext<object>(220, new D(1)),
  111. OnNext<object>(240, new B(2)),
  112. OnNext<object>(250, new A(-1)),
  113. OnNext<object>(270, new D(3)),
  114. OnCompleted<object>(300)
  115. );
  116. var res = scheduler.Start(() =>
  117. xs.Cast<B>()
  118. );
  119. res.Messages.AssertEqual(
  120. OnNext<B>(210, new B(0)),
  121. OnNext<B>(220, new D(1)),
  122. OnNext<B>(240, new B(2)),
  123. OnError<B>(250, e => e is InvalidCastException)
  124. );
  125. xs.Subscriptions.AssertEqual(
  126. Subscribe(200, 250)
  127. );
  128. }
  129. }
  130. class A : IEquatable<A>
  131. {
  132. int id;
  133. public A(int id)
  134. {
  135. this.id = id;
  136. }
  137. public bool Equals(A other)
  138. {
  139. if (other == null)
  140. return false;
  141. return id == other.id && GetType().Equals(other.GetType());
  142. }
  143. public override bool Equals(object obj)
  144. {
  145. return Equals(obj as A);
  146. }
  147. public override int GetHashCode()
  148. {
  149. return id;
  150. }
  151. }
  152. class B : A
  153. {
  154. public B(int id)
  155. : base(id)
  156. {
  157. }
  158. }
  159. class C : A
  160. {
  161. public C(int id)
  162. : base(id)
  163. {
  164. }
  165. }
  166. class D : B
  167. {
  168. public D(int id)
  169. : base(id)
  170. {
  171. }
  172. }
  173. class E : IEquatable<E>
  174. {
  175. int id;
  176. public E(int id)
  177. {
  178. this.id = id;
  179. }
  180. public bool Equals(E other)
  181. {
  182. if (other == null)
  183. return false;
  184. return id == other.id && GetType().Equals(other.GetType());
  185. }
  186. public override bool Equals(object obj)
  187. {
  188. return Equals(obj as E);
  189. }
  190. public override int GetHashCode()
  191. {
  192. return id;
  193. }
  194. }
  195. }